第二十二章:市场冲击与滑点模型

做市商最怕什么?不是行情波动,而是你刚建完仓,价格就朝着不利方向跑。这背后就是市场冲击和滑点在作祟。今天我们来聊聊这个核心话题。

我个人习惯把市场冲击比作「推门效应」——你推门的力量越大,门反弹回来的力道也越强。在交易里,你的订单量越大,对价格的扰动就越明显。这个扰动,就是冲击成本。

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 做市与最优执行的结合

这才是今天的重头戏。做市商能不能把「被动做市」和「主动执行」结合起来?当然可以。

我设计过一个混合策略:

  1. 常态下:纯被动做市,赚买卖价差
  2. 库存偏离时:启动最优执行算法,主动调整库存
  3. 冲击成本过高时:暂停主动交易,等待流动性恢复

关键点在于「库存偏离」的阈值怎么设。我一般用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 知识体系总览

下面这张图总结了本章的核心逻辑:

市场冲击与滑点模型知识体系 市场冲击模型 永久冲击 vs 暂时冲击 Almgren-Chriss + Kyle's Lambda 最优执行算法 做市与最优执行结合:动态库存管理 + 冲击成本控制 关键参数 γ(永久冲击系数) | η(暂时冲击系数) | λ(Kyle's Lambda) σ(波动率) | T(交易时间) | Q(交易量) 核心:冲击成本 = 信息效应 + 流动性效应 + 随机波动

这张图把整个知识体系串起来了。从上到下,从理论到实践。你每次做策略时,都可以对照这张图,看看自己忽略了哪个环节。

好了,关于市场冲击和滑点模型,今天就聊到这里。记住一句话:冲击成本是做市商的隐形杀手,看不见摸不着,但每笔交易都在为你买单。学会量化它、控制它,你的做市策略才能真正稳定盈利。


交易系统化学习资料 微信Strategy888888