第六章:高频信息与算法交易
各位,咱们今天聊点刺激的——高频交易。说实话,我入行那会儿,高频交易还是个挺神秘的东西。那时候我还在做统计套利,每天盯着日线数据,觉得自己的策略已经够快了。直到有一次,我去一家高频做市商公司参观,看到他们的机柜就架在交易所隔壁,光纤长度精确到米,我才意识到——原来我眼中的“快”,在他们眼里根本就是慢动作。
6.1 高频数据的特征
高频数据跟咱们平时看的日线、小时线完全是两码事。你想想看,日线数据一天就一根K线,但高频数据呢?一秒钟可能就有几百笔成交。我习惯把高频数据分成三个层次:
- 逐笔数据(Tick Data):每一笔成交的时间、价格、成交量。这是最原始的数据。
- 快照数据(Snapshot):每隔几毫秒拍一张订单簿的照片,能看到买卖双方的挂单情况。
- 聚合数据(Aggregated Data):比如1秒、100毫秒的K线,算是高频数据的“降维版”。
这里有个坑,我必须要提醒你。高频数据有个很讨厌的特征——非均匀时间间隔。什么意思?就是交易不是均匀发生的。有时候一秒钟成交100笔,有时候十秒钟一笔都没有。如果你用传统的时间序列模型去处理,结果会非常难看。我在项目中遇到过这个问题,一开始直接用等间隔重采样,结果把很多微观结构特征都抹掉了。后来我改用“事件驱动”的方式,以每一笔成交为时间点,才算是解决了。
核心要点:高频数据的三个特征——非均匀时间间隔、微观结构噪声、日内季节性。处理不好这三个,你的策略大概率会亏钱。
6.2 统计套利在高频场景下的应用
统计套利,说白了就是找两个相关性高的品种,做多一个、做空另一个,赚价差回归的钱。低频统计套利大家都会,但高频统计套利完全是另一回事。
我举个例子。假设你发现沪深300股指期货和上证50股指期货,在1分钟级别上价差有均值回复的特性。低频做法很简单:价差偏离两个标准差就开仓,回归就平仓。但高频场景下,你面临的问题是——价差可能在几秒钟内就完成回归,你的信号还没算完,行情已经走完了。
所以高频统计套利的核心,不是“发现关系”,而是“发现关系后能不能跑得比别人快”。我个人习惯用协整检验来筛选配对,但注意,高频数据的协整检验跟低频不一样。低频数据可以用日线做ADF检验,高频数据必须考虑微观结构噪声,否则检验结果全是假的。
# 一个简单的高频配对交易信号示例(伪代码)
def generate_signal(tick_data_1, tick_data_2):
# 计算实时价差
spread = tick_data_1['price'] - tick_data_2['price']
# 计算滚动均值和标准差(窗口:最近100笔)
mean = spread.rolling(100).mean()
std = spread.rolling(100).std()
# 标准化价差
z_score = (spread - mean) / std
# 信号生成
if z_score > 2:
return 'short_spread' # 做空价差
elif z_score < -2:
return 'long_spread' # 做多价差
else:
return 'neutral'
嗯,这里要注意。上面的代码看起来简单,但实际跑起来你会发现一个问题——滑点。高频场景下,你的信号出来到成交,中间可能已经过了几十毫秒。这几十毫秒里,价差可能已经变了。我曾经吃过这个亏,回测时年化收益30%,实盘一跑直接亏钱。后来我加了一个“信号延迟补偿”模块,才勉强把滑点控制住。
6.3 做市商策略
做市商,说白了就是“赚买卖价差”的。你挂一个买单在买一价,挂一个卖单在卖一价,有人买你的卖单,有人卖你的买单,你赚中间的差价。听起来简单?但做市商策略是高频交易里最卷的领域之一。
做市商的核心问题有两个:
- 库存风险:你挂的买单被成交了,但卖单没成交,你就持有了多头仓位。如果价格跌了,你就亏了。
- 逆向选择风险:你挂的单子被成交,往往是因为有人掌握了比你更多的信息。说白了,你可能是被“聪明钱”收割了。
我见过最经典的做市商策略,叫“Avellaneda-Stoikov模型”。这个模型的核心思想是:根据你的库存水平动态调整报价。如果你库存为正(持有多头),你就把买单挂低一点,卖单挂高一点,这样你更倾向于卖出而不是买入。反之亦然。
实战技巧:做市商策略的成败,往往取决于你对订单簿的建模精度。我个人习惯用“订单簿斜率”来衡量市场深度。斜率越陡,说明市场深度越浅,你的报价要更保守。
下面这张图是我自己画的,展示了高频交易中信息流动的核心逻辑:
6.4 算法交易的执行策略
最后聊一下算法交易的执行。很多人以为算法交易就是“自动下单”,其实远不止这么简单。一个好的执行算法,核心目标是降低冲击成本。
你想想看,如果你要买入100万股某只股票,直接一笔市价单砸进去,价格可能被你推高好几个点。这就是冲击成本。算法交易要做的,就是把这100万股拆成无数个小单,在市场上“偷偷”吃掉流动性。
常见的执行算法有几种:
| 算法名称 | 核心逻辑 | 适用场景 |
|---|---|---|
| TWA(时间加权平均) | 按固定时间间隔均匀下单 | 流动性好的品种,对价格不敏感 |
| VWAP(成交量加权平均) | 按历史成交量分布来安排下单节奏 | 追求成交价接近市场均价 |
| Implementation Shortfall | 动态优化,平衡冲击成本和等待成本 | 大单交易,对价格敏感 |
避坑指南:我曾经在VWAP算法上栽过跟头。当时我按历史成交量分布来下单,结果那天突然出了个重大新闻,成交量分布完全变了。我的算法还在按旧数据下单,结果执行得一塌糊涂。后来我加了一个“实时成交量修正”模块,才算是稳住了。
嗯,说到最后,我想强调一点。高频交易和算法交易,本质上都是在跟时间赛跑。你比别人快一毫秒,你就可能多赚一笔。但快不是全部,稳定性和鲁棒性才是长期盈利的关键。我见过太多人,回测时跑得飞快,实盘一上就崩。为什么?因为他们的代码里藏着各种“隐形炸弹”——内存泄漏、网络抖动、时钟不同步。这些东西,才是真正决定你能否活下去的因素。
好了,这一章就到这里。记住,高频交易不是比谁跑得快,而是比谁活得久。