4、经典做市模型:Avellaneda-Stoikov模型原理与推导
做市策略里,Avellaneda-Stoikov模型是个绕不开的经典。说实话,我刚开始接触量化做市时,看到一堆随机微分方程头都大了。后来真正在实盘里跑过几轮,才明白这个模型到底在说什么。
今天咱们就把这个模型掰开揉碎,看看它到底怎么推导出来的。
4.1 模型的核心思想
Avellaneda-Stoikov模型解决的是个什么问题?说白了就是:作为做市商,我该怎么报价才能既赚到价差,又不至于被聪明钱吃掉?
这个模型把做市商的状态抽象成两个变量:
- 库存 q(t):当前持有的资产数量(可正可负)
- 现金 X(t):当前持有的现金余额
做市商的目标很明确:在给定时间区间 [0, T] 内,最大化期望效用。这里的效用函数用的是指数形式:
U(x) = -exp(-γx)
其中 γ 是风险厌恶系数。γ 越大,说明你越怕亏钱,报价就会越保守。
关键理解:这个模型不是让你预测价格涨跌,而是告诉你如何在不确定的市场中,通过调整报价来控制库存风险。
4.2 模型假设与设定
做任何模型都得有假设。Avellaneda-Stoikov模型做了这么几个设定:
- 市场价服从几何布朗运动:dS_t = σ dW_t(漂移项设为0,因为短期做市不考虑趋势)
- 订单到达是泊松过程:买单和卖单的到达强度与报价偏离市场价的程度有关
- 做市商只能报限价单:不能吃单,只能挂单等成交
- 不考虑手续费和滑点:简化处理,实际中要加上
嗯,这里要注意一点:实际市场里订单到达并不是完全随机的。我在做回测时发现,波动率飙升的时候,订单到达率会急剧增加,这个模型在那种极端行情下会有点偏差。
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模型的整体逻辑串起来了:
这个模型最大的价值,是给了我们一个可量化的报价框架。虽然实际用起来需要各种调整,但它的核心思想——在收益和风险之间做动态平衡——是所有做市策略的基石。
我的建议:刚开始学这个模型时,别急着上实盘。先用历史数据做回测,把 γ、k、σ 这几个参数调明白。我花了大概两周时间,才找到适合自己交易品种的参数组合。
公众号:蓝海资料掘金营,微信deep3321