4. 订单流冲击:模拟大单对市场价格的冲击效应

做高频交易的人,最怕什么?

不是行情波动大,而是你刚挂进去的单子,被一个大单直接砸穿。我见过太多策略,回测曲线漂亮得像教科书,一上线就被大单打得鼻青脸肿。说白了,就是没考虑订单流冲击。

订单流冲击,简单讲就是大额订单对市场价格造成的瞬时影响。你想想看,一个1000手的买单砸进去,盘口的卖单被吃掉,价格自然往上跳。这个跳动的幅度,就是冲击成本。对于高频策略来说,冲击成本往往比手续费还可怕。

4.1 冲击模型的核心逻辑

我个人习惯把冲击模型分成两类:永久冲击暂时冲击

  • 永久冲击:大单成交后,价格回不去了。说明市场吸收了这笔订单的信息,重新定价。
  • 暂时冲击:大单吃掉流动性后,价格很快恢复。这通常是流动性不足导致的瞬时失衡。

实际交易中,两者往往同时存在。我记得有一次做股指期货的模拟,一个500手的市价单下去,价格跳了2个tick,但5秒后又回来了1个tick。嗯,这就是典型的混合冲击。

核心公式(简化版):

冲击成本 = α × 订单规模 / 市场深度 + β × 波动率 × √(订单规模 / 平均成交量)

其中α和β是经验参数,需要根据历史数据拟合。

4.2 如何模拟订单流冲击

模拟冲击,不能只靠一个公式硬算。我建议分三步走:

  1. 采集盘口数据:至少要有Level-2行情,能看到逐笔委托和逐笔成交。
  2. 构建冲击函数:用历史数据拟合出价格变化与订单规模的关系。
  3. 注入模拟订单:在回测引擎中,按时间戳插入虚拟大单,观察价格变化。

下面是我常用的一个冲击模拟代码片段。别嫌简单,够用就行。

class OrderFlowSimulator:
    def __init__(self, depth_data, impact_params):
        self.depth = depth_data  # 盘口快照
        self.alpha = impact_params['alpha']
        self.beta = impact_params['beta']
    
    def simulate_market_order(self, side, volume):
        """模拟市价单冲击"""
        if side == 'buy':
            # 从卖一档开始吃
            remaining = volume
            total_cost = 0
            price_impact = 0
            for level in self.depth['asks']:
                if remaining <= 0:
                    break
                trade_vol = min(remaining, level['volume'])
                total_cost += trade_vol * level['price']
                remaining -= trade_vol
                # 每吃一档,价格上移
                price_impact = level['price'] - self.depth['asks'][0]['price']
            # 加上永久冲击
            permanent_impact = self.alpha * (volume / self.depth['total_volume'])
            return {
                'avg_price': total_cost / volume,
                'temporary_impact': price_impact,
                'permanent_impact': permanent_impact
            }
        # 卖单逻辑类似,略

小技巧:模拟时别忘了考虑订单簿的恢复速度。我曾经在回测中忽略了这个,结果实盘时冲击成本比预期高了30%。建议加入一个「流动性恢复因子」,模拟被吃掉后的挂单补充。

4.3 冲击测试的实战框架

光有模拟还不够,你得有一套完整的测试流程。我一般这样组织:

测试维度 具体方法 关注指标
单笔冲击 随机时间点注入不同规模订单 滑点、价格偏离度
连续冲击 短时间内连续注入多笔订单 累积冲击、恢复时间
极端场景 在波动率高峰时段注入大单 最大回撤、流动性枯竭

为什么要做连续冲击测试?因为高频策略往往不是一笔单子打完就完事。你想想看,一个做市策略可能在1秒内连续成交几十笔,每一笔都在消耗流动性。如果只测单笔,根本看不出问题。

避坑指南:我曾经在测试一个套利策略时,只做了单笔冲击模拟,结果实盘时两个腿的订单互相影响,冲击成本叠加,直接把利润吃光了。后来我加了一个「订单相关性矩阵」,把不同策略的订单流关联起来分析,才真正解决问题。

4.4 知识体系总览

下面这张图,是我对订单流冲击测试的总结。你可以把它当作一个检查清单。

订单流冲击测试知识体系 冲击模型 模拟引擎 测试框架 永久冲击 vs 暂时冲击 经验参数拟合(α, β) 盘口深度与波动率 Level-2行情接入 订单簿快照重建 流动性恢复因子 单笔 / 连续 / 极端 滑点与价格偏离度 订单相关性矩阵 核心目标:量化冲击成本,避免实盘滑点吞噬利润 模型 + 模拟 + 测试 = 稳定的订单流管理

4.5 一些实战经验

最后分享几个我踩过的坑,希望能帮你省点学费。

  • 别迷信历史冲击参数:市场结构会变。去年拟合的参数,今年可能完全失效。我建议每周重新校准一次。
  • 注意盘口厚度分布:有些品种的盘口看起来很深,但大部分挂单都在远端。近端其实很薄。这种「虚胖」的流动性最坑人。
  • 冲击测试要带手续费:很多人只算滑点,忘了手续费。实际上大单成交后,手续费也会因为成交量的增加而放大。

一句话总结:订单流冲击不是回测里的一个参数,而是实盘中的生死线。你模拟得越真实,上线后睡得越安稳。


公众号:蓝海资料掘金营,微信deep3321