4、经典做市模型:Avellaneda-Stoikov模型原理与推导

做市策略里,Avellaneda-Stoikov模型是个绕不开的经典。说实话,我刚开始接触量化做市时,看到一堆随机微分方程头都大了。后来真正在实盘里跑过几轮,才明白这个模型到底在说什么。

今天咱们就把这个模型掰开揉碎,看看它到底怎么推导出来的。

4.1 模型的核心思想

Avellaneda-Stoikov模型解决的是个什么问题?说白了就是:作为做市商,我该怎么报价才能既赚到价差,又不至于被聪明钱吃掉?

这个模型把做市商的状态抽象成两个变量:

  • 库存 q(t):当前持有的资产数量(可正可负)
  • 现金 X(t):当前持有的现金余额

做市商的目标很明确:在给定时间区间 [0, T] 内,最大化期望效用。这里的效用函数用的是指数形式:

U(x) = -exp(-γx)

其中 γ 是风险厌恶系数。γ 越大,说明你越怕亏钱,报价就会越保守。

关键理解:这个模型不是让你预测价格涨跌,而是告诉你如何在不确定的市场中,通过调整报价来控制库存风险。

4.2 模型假设与设定

做任何模型都得有假设。Avellaneda-Stoikov模型做了这么几个设定:

  1. 市场价服从几何布朗运动:dS_t = σ dW_t(漂移项设为0,因为短期做市不考虑趋势)
  2. 订单到达是泊松过程:买单和卖单的到达强度与报价偏离市场价的程度有关
  3. 做市商只能报限价单:不能吃单,只能挂单等成交
  4. 不考虑手续费和滑点:简化处理,实际中要加上

嗯,这里要注意一点:实际市场里订单到达并不是完全随机的。我在做回测时发现,波动率飙升的时候,订单到达率会急剧增加,这个模型在那种极端行情下会有点偏差。

4.3 订单到达率的建模

模型假设买单和卖单的到达强度是报价偏离市场价的函数:

λ_b(δ_b) = A * exp(-k * δ_b)   // 买单到达率
λ_a(δ_a) = A * exp(-k * δ_a)   // 卖单到达率

其中:

  • δ_b = S - P_b:买单报价与市场价的差距
  • δ_a = P_a - S:卖单报价与市场价的差距
  • A:基础到达率(市场活跃度)
  • k:订单到达对价格的敏感度

这个公式很直观:你报价离市场价越远,成交概率就越低。反过来,你报得越接近市场价,成交越快,但赚的价差也越小。

个人经验:我在实盘中发现,k 值不是固定的。市场波动大的时候,k 值会变小——也就是说,即使你报得远一点,成交概率也不会降太多。所以做回测时,我建议把 k 设成随时间变化的参数。

4.4 价值函数与HJB方程

模型的核心是定义了一个价值函数:

V(t, x, q, S) = E[ -exp(-γ(X_T + q_T * S_T)) | 当前状态 ]

这个函数表示:在 t 时刻,持有现金 x、库存 q、当前价格 S 的情况下,到 T 时刻的期望效用。

然后通过动态规划原理,可以推导出HJB方程(Hamilton-Jacobi-Bellman):

∂V/∂t + (1/2)σ²S² ∂²V/∂S² + max_{δ_b, δ_a} [ λ_b(δ_b)(V(t, x+δ_b, q+1, S) - V) 
    + λ_a(δ_a)(V(t, x+δ_a, q-1, S) - V) ] = 0

看到这个方程别慌。说白了,它就是在说:最优报价策略,就是在每个时刻平衡「成交带来的收益」和「库存变化带来的风险」。

4.5 最优报价的解析解

通过求解HJB方程,可以得到一个非常优雅的解析解。最优报价为:

δ_b* = (1/γ) * ln(1 + γ/k) + (γσ²/2) * (T - t) * q(t)
δ_a* = (1/γ) * ln(1 + γ/k) - (γσ²/2) * (T - t) * q(t)

这个公式告诉我们几件事:

  • 第一项 (1/γ) * ln(1 + γ/k):这是基础价差,由风险厌恶系数和订单敏感度决定
  • 第二项 (γσ²/2) * (T - t) * q(t):这是库存调整项,库存越多,报价越偏向于减少库存的方向

核心洞察:当 q(t) > 0(持有多头)时,卖单报价 δ_a* 会变小(更容易卖出),买单报价 δ_b* 会变大(更难买入)。这就是在做「去库存」操作。

4.6 模型的直观理解

我用一个具体例子来说明。假设:

  • γ = 0.1,k = 1.5,σ = 0.2(年化20%波动率)
  • 当前库存 q = 10(持有多头)
  • 剩余时间 T - t = 1小时

计算得到:

基础价差 = (1/0.1) * ln(1 + 0.1/1.5) ≈ 0.64 个基点
库存调整 = (0.1 * 0.2² / 2) * 1 * 10 ≈ 0.02 个基点

所以:

  • 卖单报价:市场价 + 0.64 - 0.02 = 市场价 + 0.62 个基点
  • 买单报价:市场价 - 0.64 - 0.02 = 市场价 - 0.66 个基点

你看,因为持有多头,卖单报得比买单更激进,目的就是尽快把库存降下来。

避坑指南:我曾经在回测时直接用这个公式,结果发现实盘里根本跑不通。原因在于:模型假设订单到达率是静态的,但实际市场里,大单冲击会导致瞬时流动性枯竭。所以建议在实盘前,至少加一个「最小报价间隔」的保护逻辑。

4.7 模型的局限与改进方向

Avellaneda-Stoikov模型虽然经典,但有几个明显的局限:

局限 说明 改进方向
不考虑跳跃风险 模型假设价格连续变化,但实际有跳空 加入跳跃扩散过程
订单到达率静态 k 和 A 是常数,实际会变 用GARCH模型动态估计参数
不考虑对手方策略 假设其他交易者是被动的 引入博弈论框架
单资产模型 只适用于一个品种 扩展到多资产做市

我个人在实际项目中,通常会把模型里的 k 参数改成动态的——用过去5分钟的成交数据来实时估计。效果比固定参数好不少。

4.8 本章知识体系

下面这张图把Avellaneda-Stoikov模型的整体逻辑串起来了:

Avellaneda-Stoikov 做市模型知识体系 核心目标:最大化期望效用 模型假设:价格GBM + 泊松到达 + 限价单 + 无费用 核心推导:HJB方程 → 最优报价解析解 买单报价 δ_b* 基础价差 + 库存调整项 卖单报价 δ_a* 基础价差 - 库存调整项 局限:跳跃风险/静态参数 改进:动态参数/多资产扩展 实盘前必须加保护逻辑

这个模型最大的价值,是给了我们一个可量化的报价框架。虽然实际用起来需要各种调整,但它的核心思想——在收益和风险之间做动态平衡——是所有做市策略的基石。

我的建议:刚开始学这个模型时,别急着上实盘。先用历史数据做回测,把 γ、k、σ 这几个参数调明白。我花了大概两周时间,才找到适合自己交易品种的参数组合。


公众号:蓝海资料掘金营,微信deep3321