第十章:高频做市策略
做市做到高频这个层面,说实话,拼的就是谁更快、更准、更隐蔽。我刚开始接触高频做市时,以为就是比谁的服务器离交易所近,后来才发现,真正的门道在于对市场微观结构的理解。这一章,我带你看看三个经典的高频策略:延迟套利、闪电订单、冰山订单,以及Tick级数据的特征工程怎么做。
10.1 延迟套利:吃的是时间差
延迟套利,说白了就是利用不同市场或不同产品之间的信息传递延迟来赚钱。举个例子,某股票在A交易所先涨了,B交易所还没反应过来,这时候你就能在B低价买入,等价格同步后卖出。
我个人习惯把延迟套利分为两类:
- 跨市场延迟套利:同一品种在不同交易所的价格差异
- 跨品种延迟套利:比如股指期货和ETF之间的价差
嗯,这里要注意,延迟套利的关键不是发现价差,而是预测价差会持续多久。我在项目中遇到过一种情况:价差看起来很大,但等你下单时,对手方已经撤单了。为什么?因为别人比你更快。
核心要点:延迟套利的胜率取决于你的网络延迟和订单执行速度。如果延迟超过1毫秒,基本就没戏了。
10.2 闪电订单:快进快出的艺术
闪电订单,英文叫Flash Order,是一种极短持仓周期的策略。你可能持仓只有几毫秒,甚至几微秒。听起来很疯狂?其实逻辑很简单:你捕捉到市场深度中的一个微小失衡,瞬间吃掉流动性,然后立刻平仓。
我记得有一次做回测,发现闪电订单的胜率能达到70%以上,但每笔盈利非常薄,可能只有0.1个tick。所以,这种策略对交易成本极其敏感。佣金、滑点、甚至交易所的撮合延迟,都能直接决定盈亏。
避坑指南:我曾经因为忽略了交易所的撮合队列延迟,导致闪电订单策略实盘亏损。后来我加了一个“队列位置预估”模块,才把胜率拉回来。
10.3 冰山订单:大单的隐身衣
冰山订单,顾名思义,只露出订单的一小部分,大部分隐藏在“水下”。做市商为什么要用冰山订单?你想想看,如果你要买入10万手,直接挂单,市场会立刻反应,价格瞬间被推高。冰山订单能让你分批进场,减少市场冲击。
我建议你在做市策略中这样使用冰山订单:
- 挂单时:只显示总量的10%-20%
- 成交后:自动补充新的挂单,保持冰山形态
- 监控:注意对手方是否在“钓鱼”,即故意挂小单试探你的冰山
这里有个实战技巧:冰山订单的隐藏部分,最好放在订单簿的中间位置,而不是最底部。因为很多算法交易会扫描整个深度,如果你藏得太深,反而容易被发现。
警告:冰山订单不是万能的。在高波动行情下,冰山订单的隐藏部分可能被瞬间吃掉,导致你暴露全部意图。我曾经在VIX飙升时吃过这个亏。
10.4 Tick级数据特征工程
做高频策略,数据是命根子。Tick级数据,就是每一笔成交和每一次报价的原始记录。特征工程,就是从这些原始数据中提取出有用的信号。
我个人常用的Tick级特征包括:
| 特征名称 | 计算方法 | 用途 |
|---|---|---|
| 订单簿不平衡 | (买一量 - 卖一量) / (买一量 + 卖一量) | 判断短期方向 |
| 成交速度 | 最近100笔成交的时间间隔中位数 | 判断流动性变化 |
| 价差波动率 | 最近50个tick的买卖价差标准差 | 识别市场紧张程度 |
| 大单占比 | 单笔成交量超过均量3倍的比例 | 检测机构行为 |
嗯,这里要特别强调一下特征的时间窗口。高频策略的特征窗口通常很短,比如50毫秒、100毫秒。窗口太长,信号就滞后了;窗口太短,噪声太大。我习惯用滚动窗口的方式,动态调整窗口大小。
下面是一个简单的Tick级特征计算代码示例:
def compute_tick_features(tick_data):
# tick_data: DataFrame with columns ['price', 'volume', 'bid', 'ask']
# 订单簿不平衡
imbalance = (tick_data['bid'] - tick_data['ask']) / (tick_data['bid'] + tick_data['ask'])
# 成交速度:最近100笔的时间间隔
time_diff = tick_data['timestamp'].diff().rolling(100).median()
# 价差波动率
spread = tick_data['ask'] - tick_data['bid']
spread_vol = spread.rolling(50).std()
# 大单占比
avg_vol = tick_data['volume'].rolling(100).mean()
large_trade = (tick_data['volume'] > avg_vol * 3).rolling(100).mean()
return pd.DataFrame({
'imbalance': imbalance,
'trade_speed': time_diff,
'spread_vol': spread_vol,
'large_trade_pct': large_trade
})
重要提醒:Tick级数据量巨大,一天可能上千万条。特征计算一定要用向量化操作,别用循环。我见过有人用for循环处理Tick数据,结果回测跑了三天还没跑完。
10.5 本章知识体系
为了让你更直观地理解这些策略之间的关系,我画了一张图:
这张图把本章的核心内容串起来了。你看,三个策略虽然玩法不同,但都依赖Tick级数据特征工程来提供信号。没有高质量的特征,再好的策略也是空中楼阁。
个人经验:我建议你在实盘前,先用历史Tick数据做一遍完整的回测,重点关注特征在不同市场状态下的表现。比如,在低波动和高波动环境下,同一个特征的预测能力可能天差地别。