4. 订单流冲击:模拟大单对市场价格的冲击效应
做高频交易的人,最怕什么?
不是行情波动大,而是你刚挂进去的单子,被一个大单直接砸穿。我见过太多策略,回测曲线漂亮得像教科书,一上线就被大单打得鼻青脸肿。说白了,就是没考虑订单流冲击。
订单流冲击,简单讲就是大额订单对市场价格造成的瞬时影响。你想想看,一个1000手的买单砸进去,盘口的卖单被吃掉,价格自然往上跳。这个跳动的幅度,就是冲击成本。对于高频策略来说,冲击成本往往比手续费还可怕。
4.1 冲击模型的核心逻辑
我个人习惯把冲击模型分成两类:永久冲击和暂时冲击。
- 永久冲击:大单成交后,价格回不去了。说明市场吸收了这笔订单的信息,重新定价。
- 暂时冲击:大单吃掉流动性后,价格很快恢复。这通常是流动性不足导致的瞬时失衡。
实际交易中,两者往往同时存在。我记得有一次做股指期货的模拟,一个500手的市价单下去,价格跳了2个tick,但5秒后又回来了1个tick。嗯,这就是典型的混合冲击。
核心公式(简化版):
冲击成本 = α × 订单规模 / 市场深度 + β × 波动率 × √(订单规模 / 平均成交量)
其中α和β是经验参数,需要根据历史数据拟合。
4.2 如何模拟订单流冲击
模拟冲击,不能只靠一个公式硬算。我建议分三步走:
- 采集盘口数据:至少要有Level-2行情,能看到逐笔委托和逐笔成交。
- 构建冲击函数:用历史数据拟合出价格变化与订单规模的关系。
- 注入模拟订单:在回测引擎中,按时间戳插入虚拟大单,观察价格变化。
下面是我常用的一个冲击模拟代码片段。别嫌简单,够用就行。
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 知识体系总览
下面这张图,是我对订单流冲击测试的总结。你可以把它当作一个检查清单。
4.5 一些实战经验
最后分享几个我踩过的坑,希望能帮你省点学费。
- 别迷信历史冲击参数:市场结构会变。去年拟合的参数,今年可能完全失效。我建议每周重新校准一次。
- 注意盘口厚度分布:有些品种的盘口看起来很深,但大部分挂单都在远端。近端其实很薄。这种「虚胖」的流动性最坑人。
- 冲击测试要带手续费:很多人只算滑点,忘了手续费。实际上大单成交后,手续费也会因为成交量的增加而放大。
一句话总结:订单流冲击不是回测里的一个参数,而是实盘中的生死线。你模拟得越真实,上线后睡得越安稳。
公众号:蓝海资料掘金营,微信deep3321