8. 市场冲击模型:线性冲击模型、平方根冲击模型、Almgren-Chriss模型
做量化交易这些年,我踩过最大的坑之一,就是低估了市场冲击的威力。你想想看,策略回测跑得漂漂亮亮,实盘一上,收益直接缩水一半——这种事我见过太多次了。说白了,市场冲击就是你的订单本身对价格造成的影响。今天咱们就来聊聊怎么量化这个影响。
8.1 为什么需要市场冲击模型?
先问个问题:你挂一个100手的买单,和挂一个10000手的买单,对市场的影响能一样吗?显然不一样。大单会吃掉多个档位的挂单,把价格推上去。这个价格变化,就是市场冲击。
我个人习惯把市场冲击分成两部分:
- 瞬时冲击:订单执行瞬间造成的价格跳变
- 持久冲击:订单执行后,价格回不去的部分
嗯,这里要注意,持久冲击才是真正让你亏钱的地方。瞬时冲击可能只是暂时的流动性不足,但持久冲击意味着你改变了市场的供需平衡。
核心观点:市场冲击不是线性的。你交易量翻倍,冲击成本可能翻三倍。这就是为什么大资金需要专门的执行算法。
8.2 线性冲击模型
线性冲击模型是最简单的思路。它假设价格变化与交易量成正比:
ΔP = α · Q
其中ΔP是价格变化,Q是交易量,α是冲击系数。
我在早期做A股统计套利时,就试过这个模型。说实话,在小单量范围内它勉强能用。但一旦交易量超过日均成交量的5%,模型就开始离谱了。
适用场景:流动性极好的品种(比如国债期货),且单笔交易量不超过日均成交量的1%。
线性模型的优点很明显——简单、可解析。但缺点更致命:它无法捕捉大单时的非线性效应。你想想看,当你的订单开始吃掉深度档位时,每多一单位交易量带来的冲击是递增的,而不是恒定的。
8.3 平方根冲击模型
这个模型就靠谱多了。它认为冲击成本与交易量的平方根成正比:
ΔP = α · √Q
为什么是平方根?我个人的理解是:市场深度通常呈"倒金字塔"结构——浅层流动性好,深层流动性差。平方根关系恰好能描述这种边际冲击递增的现象。
我曾经在回测中对比过线性和平方根模型,结果很有意思:
| 交易量占比 | 实际冲击(bp) | 线性模型预测(bp) | 平方根模型预测(bp) |
|---|---|---|---|
| 1% | 2.1 | 2.0 | 2.0 |
| 5% | 5.8 | 10.0 | 4.5 |
| 10% | 9.2 | 20.0 | 6.3 |
| 20% | 15.4 | 40.0 | 8.9 |
看到没?线性模型在5%时就翻倍了,而平方根模型虽然也低估,但趋势更接近真实情况。当然,没有模型是完美的,但平方根模型在中等交易量范围内表现相当不错。
避坑指南:平方根模型在极端大单(超过日均成交量30%)时也会失效。我曾经在股指期货上试过,实际冲击比模型预测高出近40%。原因很简单——市场会提前感知你的意图,对手盘开始撤单。
8.4 Almgren-Chriss模型
终于聊到重头戏了。Almgren-Chriss模型(简称A-C模型)是目前业界最常用的市场冲击模型之一。它把冲击拆成了两部分:
总冲击 = 瞬时冲击 + 持久冲击
具体公式长这样:
S(x) = α · x + β · x²
其中x是交易速率(单位时间的交易量),α是线性冲击系数,β是平方冲击系数。
这个模型厉害在哪?它考虑了时间维度。你想想看,同样交易100万股,是1分钟打完还是1小时打完,冲击成本能一样吗?A-C模型就抓住了这个关键点。
8.5 三个模型的对比
我做了个SVG图,帮你理清这三个模型的核心逻辑:
8.6 实战中的参数估计
模型再好,参数不准也是白搭。我分享一个我常用的方法:
# 伪代码:冲击系数估计
def estimate_impact_coefficients(trade_data):
# trade_data: 包含时间戳、交易量、价格变化
# 1. 筛选出大单交易(排除噪音)
large_trades = trade_data[trade_data.volume > threshold]
# 2. 计算每笔交易的冲击成本
large_trades['impact'] = (large_trades['price'] -
large_trades['prev_price']) / large_trades['prev_price']
# 3. 用最小二乘法拟合平方根模型
# ΔP = α · √Q
X = np.sqrt(large_trades['volume'])
y = large_trades['impact']
alpha = np.linalg.lstsq(X.reshape(-1,1), y, rcond=None)[0]
return alpha
实战技巧:我建议至少用3个月的历史数据来估计参数,并且每周滚动更新。市场微观结构会变,去年夏天的冲击系数和今年冬天的可能差一倍。
8.7 一个真实的教训
最后说个我自己的案例。几年前我做CTA策略,回测时用的线性冲击模型,年化收益看着有25%。实盘第一周,收益直接变成-3%。我查了半天,发现问题出在冲击模型上——我的策略在回测里假设每笔交易只造成0.5bp的冲击,但实盘里因为同向交易太多,实际冲击达到了2-3bp。
后来我改用Almgren-Chriss模型,把交易拆成更小的切片,分散到全天执行。冲击成本降到了1bp以内,策略才真正跑起来。
嗯,这就是为什么我总说:模型选不对,策略全白费。