第2章:市场冲击模型
做量化交易的人,迟早要面对一个现实——你的订单本身就在影响市场。这不是玄学,是物理定律。我刚开始做算法交易那会儿,总觉得策略信号够准就能赚钱,结果实盘一跑,滑点直接把alpha吃干净了。嗯,从那以后,我才真正开始研究市场冲击。
2.1 市场冲击的定义
市场冲击,说白了就是你的交易行为导致的价格不利变动。你买,价格涨;你卖,价格跌。这个变动幅度,就是市场冲击成本。
举个例子:当前价格100元,你想买1万股。如果市场深度足够,你可能只付出100元均价。但现实是,你的买单会吃掉卖单,价格被推高到100.5元。这0.5元的差价,就是市场冲击。
核心公式:
市场冲击成本 = 实际成交均价 - 决策时的基准价格
(对于卖出,则是基准价格 - 实际成交均价)
我在项目中遇到过最夸张的一次,一个中等规模的订单,冲击成本占了总交易成本的60%。你以为你在赚alpha,其实你在给流动性提供商打工。
2.2 永久冲击 vs 暂时冲击
市场冲击不是铁板一块。它分两种:永久冲击和暂时冲击。理解这个区别,是设计执行算法的关键。
| 类型 | 定义 | 持续时间 | 成因 |
|---|---|---|---|
| 永久冲击 | 订单执行后,价格无法回到原位的部分 | 长期存在 | 信息泄露、供需失衡 |
| 暂时冲击 | 订单执行期间,价格暂时偏离的部分 | 短期(几分钟到几小时) | 流动性不足、订单簿失衡 |
永久冲击,我习惯叫它「信息成本」。你的大单暴露了你的意图,市场参与者嗅到了方向,于是价格永久性地移动了。你想想看,如果你在市场上砸了1000万买盘,别人会怎么想?「有大户进场了,跟着买!」
暂时冲击,更像是「流动性成本」。你的订单暂时吃光了某个价位的挂单,价格跳了一档。但只要后续有新的订单进来,价格就会恢复。这就像你在超市买光了所有鸡蛋,价格暂时涨了,但补货后价格又回来了。
实战经验:
我曾经在回测中忽略永久冲击,结果策略看起来年化30%,实盘只有8%。后来我把永久冲击单独建模,才真正对齐了回测和实盘。
2.3 冲击成本估算方法
估算冲击成本,不是拍脑袋。业界有几种主流方法,我一个个说。
2.3.1 平方根模型(Almgren-Chriss模型)
这是最经典的模型。公式很简单:
冲击成本 = α × σ × √(Q / V)
其中:
- α:冲击系数(通常0.1~0.5)
- σ:波动率
- Q:你的订单量
- V:市场日均成交量
这个模型的核心思想:冲击成本与订单量的平方根成正比。也就是说,订单量翻4倍,冲击成本只翻2倍。为什么?因为市场会自我调节,大单会吸引更多对手盘。
我个人习惯:
对于A股市场,α取0.2~0.3比较靠谱。美股流动性好,α可以降到0.1。别问我怎么知道的,都是亏出来的经验。
2.3.2 线性模型
有些场景下,平方根模型不够精确。这时候可以用线性模型:
冲击成本 = β × (Q / V)
β是线性冲击系数。这个模型假设冲击成本与订单量成正比。简单粗暴,但适合流动性极差的市场。
我建议:
- 流动性好的市场(如沪深300成分股):用平方根模型
- 流动性差的市场(如小盘股、债券):用线性模型
- 极端情况(如大宗交易):两个模型都不准,得用更复杂的模型
2.3.3 基于订单簿的微观模型
如果你有Level-2数据,可以更精细地估算。核心思路是模拟你的订单如何吃掉订单簿上的挂单。
def estimate_impact(order_book, order_qty):
"""
基于订单簿估算冲击成本
order_book: 卖单列表 [(价格, 数量), ...]
order_qty: 你的买入量
"""
remaining = order_qty
total_cost = 0
for price, qty in order_book:
if remaining <= 0:
break
trade_qty = min(remaining, qty)
total_cost += trade_qty * price
remaining -= trade_qty
avg_price = total_cost / order_qty
return avg_price
这个方法最准确,但需要实时数据。我在高频交易系统里就用这个,精度能到0.1个tick。
避坑指南:
我曾经在回测里用收盘价估算冲击,结果严重低估。后来发现,收盘价是撮合出来的,不是真实的市场深度。一定要用tick级数据或分钟级订单簿数据。
2.4 知识体系总览
下面这张图,是我自己总结的市场冲击模型知识框架。你看一眼,就能明白各个概念之间的关系。
2.5 实战中的选择
说了这么多,到底用哪个模型?我的建议是:
- 回测阶段:用平方根模型,简单且够用。α参数根据历史数据拟合。
- 实盘监控:用订单簿微观模型,精度高。但需要实时数据流。
- 极端行情:所有模型都可能失效。这时候,我建议直接暂停交易,或者用保守的线性模型。
一个小技巧:
你可以把多个模型的结果做加权平均。比如平方根模型占70%,订单簿模型占30%。这样既稳定又灵敏。我在实盘系统里就是这么干的。
市场冲击模型,说白了就是给你的交易成本算一笔账。算清楚了,你才知道你的策略到底赚不赚钱。别等到实盘亏了才后悔——嗯,我当年就是这么过来的。
公众号:蓝海资料掘金营,微信deep3321