第二十二章:市场冲击与滑点模型
做市商最怕什么?不是行情波动,而是你刚建完仓,价格就朝着不利方向跑。这背后就是市场冲击和滑点在作祟。今天我们来聊聊这个核心话题。
我个人习惯把市场冲击比作「推门效应」——你推门的力量越大,门反弹回来的力道也越强。在交易里,你的订单量越大,对价格的扰动就越明显。这个扰动,就是冲击成本。
22.1 冲击成本的两种面孔:永久 vs 暂时
先搞清楚一个基本概念。市场冲击不是铁板一块,它分两种:
- 永久冲击:你的交易改变了市场对资产价值的看法。比如你大单买入,市场觉得「有内幕消息」,于是价格永久性上移。这部分成本回不来。
- 暂时冲击:纯粹是流动性摩擦。你吃掉了几档订单,价格暂时偏离,等流动性恢复,价格又弹回来。这部分成本理论上可以「回收」。
我在实盘里见过最典型的例子:某次做市ETH,我同时挂了买一和卖一。突然一个大单砸穿我的买单,价格瞬间跌了0.3%。但5秒后,价格又回到原位。这就是典型的暂时冲击——纯粹是流动性被抽走导致的短暂失衡。
核心观点:永久冲击是信息效应,暂时冲击是流动性效应。做市商要尽量规避前者,利用后者。
22.2 Almgren-Chriss模型:冲击成本的数学框架
这个模型是业界标准。说白了,它把交易拆成两部分:
价格变化 = 永久冲击 + 暂时冲击 + 随机波动
永久冲击 = γ * 交易速度
暂时冲击 = η * 瞬时交易量
其中γ和η是市场冲击系数。γ越大,说明你的交易对市场信息影响越大;η越大,说明流动性越差。
我记得2019年做BTC期权做市时,发现一个有趣现象:
- 白天η很小(流动性好),但γ相对大(信息敏感)
- 深夜η很大(流动性差),但γ几乎为零(没人关注)
这意味着什么?白天适合做小单高频,深夜适合做大单低频。你想想看,同样的策略在不同时段,效果天差地别。
22.3 Kyle's Lambda:一个更简洁的冲击度量
Kyle's Lambda是另一个经典指标。它衡量的是「每单位订单流对价格的边际影响」。公式很简单:
λ = ΔP / ΔQ
ΔP是价格变化,ΔQ是净订单流。λ越大,说明市场越「薄」,你的订单越容易推动价格。
我习惯用λ来做动态风控。比如:
- 当λ > 某个阈值时,我主动缩小报价宽度
- 当λ < 阈值时,我可以放心扩大仓位
为什么?因为λ高的时候,你每吃一口单,价格就跳一下,滑点成本太高。这时候做市商应该收缩,而不是硬扛。
实战技巧:Kyle's Lambda可以用5分钟窗口滚动计算。我一般取中位数,避免极端值干扰。如果λ突然飙升3倍以上,我会暂停所有主动吃单策略。
22.4 最优执行:如何把冲击降到最低
做市商不是只挂单,有时候也得主动吃单(比如对冲、调仓)。这时候就需要最优执行算法。核心思路就一个:把大单拆成小单,分散到时间轴上。
Almgren-Chriss模型给出了一个经典解:
最优交易轨迹 = 指数衰减函数
x(t) = X * (1 - e^(-κt))
其中X是总交易量,κ是衰减速度
κ越大,你交易得越快;κ越小,你拖得越久。怎么选?取决于你对永久冲击和暂时冲击的权衡。
我举个例子:假设你要卖出1000个ETH。
- 如果κ=0.1,你可能需要2小时完成,冲击成本低但暴露时间长
- 如果κ=0.5,你30分钟搞定,冲击成本高但风险暴露短
没有绝对的对错。我个人的经验是:在波动率低的时候用慢速,波动率高的时候用快速。因为波动率高时,暴露风险比冲击成本更可怕。
22.5 做市与最优执行的结合
这才是今天的重头戏。做市商能不能把「被动做市」和「主动执行」结合起来?当然可以。
我设计过一个混合策略:
- 常态下:纯被动做市,赚买卖价差
- 库存偏离时:启动最优执行算法,主动调整库存
- 冲击成本过高时:暂停主动交易,等待流动性恢复
关键点在于「库存偏离」的阈值怎么设。我一般用Kyle's Lambda来动态调整:
if 库存偏离 > 阈值 * (1 + λ/λ_avg):
启动主动调仓
else:
继续被动做市
λ越大,阈值越高。也就是说,市场越「薄」,我越容忍库存偏离。因为这时候主动调仓的成本太高,不如等一等。
避坑指南:我曾经在2021年5月19日(519大跌)犯过这个错。当时λ飙升到正常值的10倍,我还按常规阈值调仓,结果每笔主动交易都造成巨大滑点。后来我加了这个动态阈值逻辑,再也没踩过同样的坑。
22.6 一个完整的冲击成本计算示例
来看一段Python代码,演示如何计算Almgren-Chriss模型的冲击成本:
import numpy as np
def almgen_chriss_impact(Q, T, sigma, gamma, eta):
"""
Q: 总交易量(正数买入,负数卖出)
T: 交易时间(秒)
sigma: 波动率(每秒)
gamma: 永久冲击系数
eta: 暂时冲击系数
"""
# 交易速度
v = Q / T
# 永久冲击
permanent = gamma * v * T
# 暂时冲击
temporary = eta * np.sign(Q) * np.abs(v)**0.5
# 总冲击成本
total_impact = permanent + temporary
# 加上随机波动(95%置信区间)
random = 1.96 * sigma * np.sqrt(T)
return {
'permanent': permanent,
'temporary': temporary,
'total': total_impact,
'max_range': total_impact + random
}
# 示例:卖出100个BTC,用1小时完成
result = almgen_chriss_impact(
Q=-100,
T=3600,
sigma=0.0001, # 每秒0.01%波动
gamma=0.00001, # 永久冲击系数
eta=0.001 # 暂时冲击系数
)
print(f"永久冲击: {result['permanent']:.4f}")
print(f"暂时冲击: {result['temporary']:.4f}")
print(f"总冲击: {result['total']:.4f}")
这段代码虽然简单,但已经能帮你估算出不同交易策略的冲击成本。我建议你在实盘前,先用历史数据跑一遍,找到适合你市场的γ和η参数。
22.7 知识体系总览
下面这张图总结了本章的核心逻辑:
这张图把整个知识体系串起来了。从上到下,从理论到实践。你每次做策略时,都可以对照这张图,看看自己忽略了哪个环节。
好了,关于市场冲击和滑点模型,今天就聊到这里。记住一句话:冲击成本是做市商的隐形杀手,看不见摸不着,但每笔交易都在为你买单。学会量化它、控制它,你的做市策略才能真正稳定盈利。