第四节:冲击成本模型(上)——线性冲击模型与永久/暂时冲击的分解
各位同学,今天我们来啃一块硬骨头——冲击成本模型。说实话,这玩意儿我当年刚接触时也觉得头大,一堆数学公式看得人眼花。但后来在实盘中被市场狠狠教育了几次,才明白这东西有多重要。
你想想看,我们做机构调仓,最怕什么?不是方向判断错了,而是你明明看对了,结果因为自己下单太猛,把价格推高了,最后成本全砸在自己手里。这就是冲击成本在作祟。
4.1 为什么需要冲击成本模型?
先问个问题:小资金和大资金调仓,区别在哪?
小资金买100股,市场根本感觉不到。但机构一出手就是几百万股,你想想看,就像往平静的湖面扔一块大石头,水花能不大吗?
我在项目中遇到过最典型的案例:某私募朋友,一天内要买入某股票总成交量的15%。结果呢?刚买到一半,价格已经被他推高了3%。剩下的仓位买也不是,不买也不是——这就是典型的冲击成本失控。
所以,我们需要一个模型来回答三个核心问题:
- 我要买的量,到底会把价格推高多少?
- 这个推高是暂时的,还是永久的?
- 怎么拆单才能让成本最小?
嗯,Almgren-Chriss模型就是干这个的。它虽然诞生于2000年左右,但到今天依然是业界最主流的框架。我个人习惯把它称为「冲击成本建模的教科书级方案」。
4.2 线性冲击模型的核心思想
说白了,线性冲击模型假设了一个很直观的关系:你下单的速度越快、量越大,对价格的冲击就越大。而且这个关系是线性的——虽然现实世界没那么完美,但作为第一近似,够用了。
模型把冲击成本拆成两大部分:
总冲击成本 = 永久冲击成本 + 暂时冲击成本
其中:
- 永久冲击:你下单后,价格回不去了。市场永久性地抬高(或压低)了一个台阶。
- 暂时冲击:你下单时造成的临时性价格偏离,等流动性恢复后,价格会反弹回来。
为什么这么分?我举个例子你就明白了。
假设你是个大买家,一口气吃掉了卖一价的所有挂单。这时候:
- 卖一被吃完,价格跳到卖二——这是暂时冲击。等市场缓过劲来,新的卖单会补上来,价格可能回落一些。
- 但你的买入行为本身传递了一个信号:「有大资金看好这只票」。其他交易者会跟风买入,把价格推到一个新的均衡点——这就是永久冲击。
我曾经犯过一个错误:只考虑了暂时冲击,忽略了永久冲击。结果回测时看着成本很低,实盘一跑,成本直接翻倍。嗯,从那以后我再也不敢只看一半了。
4.3 数学表达:Almgren-Chriss模型基础
好,我们来看公式。别怕,我会用大白话讲清楚。
假设我们要在时间区间 [0, T] 内完成交易,总股数为 X。我们把时间分成 N 个等长的小段,每段长度为 τ = T/N。
定义几个关键变量:
- x_k:第 k 个时间点结束时,我们已经完成的累计交易量
- v_k:第 k 个时间段内的交易速度(股数/时间)
- S_k:第 k 个时间点的市场价格
那么,Almgren-Chriss模型的核心公式长这样:
S_k = S_{k-1} + σ * √τ * ε_k + g(v_k) * τ + h(v_k)
别晕,我们一项一项拆:
- S_{k-1}:上一时刻的价格,这是基础
- σ * √τ * ε_k:市场本身的随机波动。ε_k 是标准正态随机数,代表运气成分
- g(v_k) * τ:永久冲击项。g(v_k) 是永久冲击函数,乘以时间步长 τ
- h(v_k):暂时冲击项。h(v_k) 是暂时冲击函数,只影响当前步
在线性模型中,我们假设:
g(v_k) = γ * v_k
h(v_k) = η * v_k
其中 γ 和 η 是两个关键参数:
- γ:永久冲击系数。代表每单位交易速度造成的永久价格偏移
- η:暂时冲击系数。代表每单位交易速度造成的暂时价格偏移
实战小贴士:这两个参数怎么估计?我一般用历史交易数据做回归。具体来说,把每笔交易前后的价格变化和交易速度做线性回归,斜率就是 γ 和 η 的估计值。但要注意,不同股票、不同市场环境下的参数差异很大。我见过最夸张的案例,某小盘股的 η 是大盘蓝筹股的 10 倍以上。
4.4 永久冲击与暂时冲击的分解逻辑
为什么一定要把冲击拆成永久和暂时?因为它们的性质完全不同,对交易策略的影响也天差地别。
我们来看一个具体的分解过程:
| 冲击类型 | 产生原因 | 持续时间 | 对策略的影响 |
|---|---|---|---|
| 永久冲击 | 信息泄露、市场跟风、订单簿结构改变 | 永久存在,不会恢复 | 增加持仓成本,无法通过拆单规避 |
| 暂时冲击 | 流动性不足、订单簿深度不够 | 短期存在,流动性恢复后消失 | 可以通过拆单、延时等方式降低 |
我个人习惯用一个简单的实验来理解这个分解:
假设你分两次买入同一只股票,每次买 10 万股,中间间隔 5 分钟。
- 第一次买入后,价格从 100 元涨到 100.5 元
- 5 分钟后,价格回落到 100.3 元
- 第二次买入后,价格从 100.3 元涨到 100.8 元
那么:
- 第一次的永久冲击 = 100.3 - 100.0 = 0.3 元(价格没完全回去的部分)
- 第一次的暂时冲击 = 100.5 - 100.3 = 0.2 元(价格回落的部分)
- 第二次的永久冲击 = 100.8 - 100.3 = 0.5 元?不对,这里要小心——第二次的永久冲击应该看第二次买入后价格稳定下来的位置
注意:永久冲击具有累积性。你买得越多,永久冲击就越大。而且这个累积不是简单的加法,因为市场会不断消化你的交易信息。我见过有人用线性叠加来算,结果严重高估了冲击成本。
4.5 知识体系框架图
下面这张图是我自己整理的,把冲击成本模型的核心逻辑串起来了。你多看几遍,应该能建立起整体认知。
4.6 实战中的参数校准
模型讲完了,但真正落地时最头疼的是参数校准。我分享一个我常用的方法:
# 伪代码:线性冲击模型参数估计
def estimate_impact_params(trade_data):
"""
trade_data: 包含每笔交易的时间戳、交易量、交易前后的价格
返回: gamma (永久冲击系数), eta (暂时冲击系数)
"""
# 1. 计算每笔交易的交易速度 v_k
v_k = trade_data['volume'] / trade_data['duration']
# 2. 计算价格变化 delta_S
delta_S = trade_data['price_after'] - trade_data['price_before']
# 3. 分离永久和暂时冲击
# 永久冲击 = 交易后一段时间(如5分钟)的价格变化
# 暂时冲击 = 交易瞬间的价格变化 - 永久冲击
permanent_impact = trade_data['price_5min_later'] - trade_data['price_before']
temporary_impact = delta_S - permanent_impact
# 4. 线性回归
# 永久冲击 ~ gamma * v_k * tau
gamma = linear_regression(permanent_impact, v_k * tau)
# 暂时冲击 ~ eta * v_k
eta = linear_regression(temporary_impact, v_k)
return gamma, eta
关键提醒:参数校准最怕过拟合。我见过有人用过去一周的数据拟合出完美的参数,结果下周市场风格一变,模型完全失效。我的建议是:
- 至少用3个月以上的数据做滚动校准
- 不同市场环境下(牛市、熊市、震荡市)分别估计参数
- 实盘时留出安全边际,把估计值乘以1.2~1.5倍
嗯,说到这里,我想起一个教训。有一次我给一个客户做调仓方案,参数校准做得特别精细,回测结果漂亮得不行。结果实盘第一天,市场突然出现流动性枯竭,冲击成本直接飙到模型预测的3倍。从那以后,我所有的模型都会加一个「极端情况保护」——当市场深度低于某个阈值时,自动降低交易速度。
好了,这一节的内容就到这。冲击成本模型是机构调仓的基石,理解永久冲击和暂时冲击的分解,是后续学习最优交易轨迹的基础。下一节我们会深入讨论如何用这个模型来设计具体的拆单策略。
个人经验总结:做冲击成本建模,不要追求数学上的完美。市场是不完美的,模型也是。关键是抓住主要矛盾——永久冲击和暂时冲击的分解,然后留足安全边际。我做了这么多年,最成功的策略往往不是最复杂的,而是最稳健的。
公众号:蓝海资料掘金营,微信deep3321