一、冲击成本基础:什么是冲击成本?为什么大单交易会产生冲击成本?冲击成本与市场深度的关系
1.1 先聊聊我理解的冲击成本
冲击成本,说白了就是——你下单时,市场被你「推」了一下。
你想想看,当你挂出一笔大单,比如买入100万股某只股票,市场不会无动于衷。买单一出现,卖单价格就会往上跳。最终你成交的价格,往往比你预期的要高。这个差价,就是冲击成本。
我习惯用一句话来定义它:冲击成本 = 实际成交均价 - 未下单时的市场中间价。
举个例子。某股票当前买一价10.00元,卖一价10.01元。你挂单买入10万股。结果卖单被吃掉后,卖一变成了10.02元、10.03元……最后你的成交均价是10.05元。那0.04元的差价,就是冲击成本。
核心公式:
冲击成本(bps)= (实际成交均价 - 决策时基准价) / 基准价 × 10000
单位常用「基点」(bps),1 bps = 0.01%
1.2 为什么大单会产生冲击成本?
这个问题,我在刚入行时也困惑过。后来在实盘交易中才真正体会到——市场不是无限深的池子,而是一层一层的「薄冰」。
原因其实就三点:
- 订单簿的「厚度」有限——每个价位上的挂单量是有限的。你买10万股,但卖一价位可能只有5000股。剩下的9.5万股,只能去更高价位吃单。
- 流动性提供者会「撤退」——大单出现时,做市商和算法交易会嗅到「信息不对称」的味道。他们会快速撤单或调整报价,让你吃不到便宜的筹码。
- 市场参与者的「羊群效应」——其他交易者看到大单涌入,会跟风买入或卖出,进一步放大价格波动。
我记得有一次做股指期货的套利交易,我挂了一笔500手的IF合约。刚挂出去,盘口瞬间变了——卖单撤了一半,买盘也往上跳了2个tick。那笔交易最终多花了将近3个bps的成本。嗯,从那以后我再也不敢轻视冲击成本了。
1.3 冲击成本与市场深度的关系
市场深度,就是订单簿上各个价位的挂单总量。它直接决定了你的大单会「推」多远。
我画了一张图,帮你直观理解:
从这张图可以清楚看到:同样一笔10万股的买单,在浅市场里价格被推高了15个tick,在深市场里只推高了3个tick。冲击成本差了5倍。
1.4 量化冲击成本的几个关键指标
在实际项目中,我常用以下几个指标来量化冲击成本:
| 指标名称 | 定义 | 计算公式 | 我的使用场景 |
|---|---|---|---|
| 瞬时冲击 | 单笔大单造成的即时价格变动 | ΔP / P₀ | 高频策略、T+0交易 |
| 平均冲击 | 整个交易时段内的平均冲击成本 | ∑(成交价 - 基准价) / 成交量 | 日频调仓、组合再平衡 |
| 边际冲击 | 每增加一单位成交量带来的额外冲击 | d(冲击成本) / d(成交量) | 拆单算法设计、VWAP策略 |
| 市场深度比 | 订单簿前N档的总挂单量 | ∑(价位i的挂单量 × 价格) | 流动性评估、下单时机选择 |
我的一个小习惯:
在实盘前,我会先拉一下目标股票过去30天的「深度分布图」。如果某只股票在卖一至卖五的总深度不足日均成交量的5%,我会格外小心——这种票,一单下去可能就是几个bps的冲击。
1.5 冲击成本的「非线性」特征
这里有个很重要的点,很多人容易忽略——冲击成本不是线性的。
什么意思?
你买1万股,冲击成本可能是1个bps。但买10万股,冲击成本不是10个bps,可能是20甚至30个bps。因为越往深处走,流动性越薄,价格跳得越厉害。
我曾在某只小盘股上吃过亏。当时觉得「也就多买5万股,问题不大」。结果一出手,卖单瞬间被吃光,价格直接跳了8个tick。那笔交易最终冲击成本高达12个bps。嗯,从那以后我养成了一个习惯——大单交易前,先做「冲击成本预估」。
1.6 一个简单的冲击成本预估模型
这里分享一个我在项目中常用的简易模型。它不复杂,但足够实用:
def estimate_impact(order_volume, order_book, price):
"""
预估大单买入的冲击成本
:param order_volume: 目标成交量(股)
:param order_book: 订单簿数据,格式 [(price, volume), ...]
:param price: 当前中间价
:return: 预估冲击成本(bps)
"""
remaining = order_volume
total_cost = 0.0
for ask_price, ask_volume in order_book:
if remaining <= 0:
break
fill = min(remaining, ask_volume)
total_cost += fill * ask_price
remaining -= fill
if remaining > 0:
print("警告:订单簿深度不足,无法完全成交")
return None
avg_price = total_cost / order_volume
impact_bps = (avg_price - price) / price * 10000
return round(impact_bps, 2)
# 示例
book = [(10.01, 2000), (10.02, 1500), (10.03, 1000), (10.04, 500)]
impact = estimate_impact(4000, book, 10.00)
print(f"预估冲击成本:{impact} bps")
# 输出:预估冲击成本:2.50 bps
注意:
这个模型假设订单簿在交易过程中不变。实际中,订单簿是动态变化的——撤单、新单、其他交易者的反应都会影响最终结果。所以它更适合做「下限预估」,实际冲击往往会更大一些。
1.7 冲击成本对策略收益的影响
很多人做回测时,收益曲线漂亮得不行。一上实盘,直接「见光死」。为什么?
原因之一就是——回测没考虑冲击成本。
我见过一个案例:某团队开发了一个高频反转策略,回测年化收益35%。实盘第一周,收益只有8%。一查,冲击成本吃掉了将近20个百分点的收益。他们的策略信号太密集,每笔交易虽然赚得少,但冲击成本却很高。
所以我的建议是:在回测阶段,就一定要把冲击成本加进去。哪怕用最保守的估计,也比完全忽略要好。
1.8 本章小结
- 冲击成本:大单交易导致的价格偏离,是实盘交易中不可忽视的成本项
- 产生原因:订单簿深度有限、流动性提供者撤退、市场跟风效应
- 与市场深度的关系:深度越浅,冲击越大;深度越深,冲击越小
- 关键指标:瞬时冲击、平均冲击、边际冲击、市场深度比
- 非线性特征:冲击成本随成交量增加而加速上升
- 实操建议:交易前做冲击预估,回测时纳入冲击成本
冲击成本是量化交易中「看不见的敌人」。你越早重视它,实盘时吃的亏就越少。下一章,我们来聊聊如何用更精细的模型来刻画冲击成本——包括经典的Almgren-Chriss模型和我在实战中改良的一些方法。
公众号:蓝海资料掘金营,微信deep3321