第十章:高频做市策略

做市做到高频这个层面,说实话,拼的就是谁更快、更准、更隐蔽。我刚开始接触高频做市时,以为就是比谁的服务器离交易所近,后来才发现,真正的门道在于对市场微观结构的理解。这一章,我带你看看三个经典的高频策略:延迟套利、闪电订单、冰山订单,以及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级数据特征工程来提供信号。没有高质量的特征,再好的策略也是空中楼阁。

个人经验:我建议你在实盘前,先用历史Tick数据做一遍完整的回测,重点关注特征在不同市场状态下的表现。比如,在低波动和高波动环境下,同一个特征的预测能力可能天差地别。


交易系统化学习资料 微信Strategy888888