第八章:连续时间模型:Avellaneda-Stoikov模型、基于随机控制的做市策略、最优报价与库存管理
做市商的核心难题是什么?说白了就两个:报什么价,以及手里留多少货。
前面几章我们聊的都是离散时间模型,比如格点上的最优报价。但真实市场是连续流动的,订单在毫秒级别涌入。这时候,我们需要一套能处理连续时间的数学框架。
我个人习惯把Avellaneda-Stoikov模型称为「做市商的随机控制圣经」。它把做市问题转化成了一个最优控制问题,用HJB方程求解。嗯,听起来有点吓人,但拆开来看其实很直观。
8.1 Avellaneda-Stoikov模型的核心思想
这个模型是2008年由Marco Avellaneda和Sasha Stoikov提出的。它的出发点很简单:
- 做市商同时挂买单和卖单
- 订单到达是随机的(泊松过程)
- 做市商需要管理库存风险
- 目标是最大化期望效用
模型假设做市商有一个库存过程Q(t),初始库存为q₀。当买单成交时,库存增加;卖单成交时,库存减少。做市商通过调整报价δᵇ和δᵃ(相对于中间价的偏移)来控制成交概率和库存变化。
关键公式:
库存过程:dQ(t) = dNᵇ(t) - dNᵃ(t)
其中Nᵇ和Nᵃ是强度为λ(δ)的泊松过程,λ(δ) = A·exp(-κ·δ)
现金过程:dX(t) = pᵃ·dNᵃ(t) - pᵇ·dNᵇ(t)
目标:最大化 E[-exp(-γ·(X(T) + Q(T)·S(T) - φ·Q(T)²))]
我在项目中遇到过一个问题:很多初学者直接套用这个公式,但忽略了λ(δ)的校准。你想想看,如果A和κ没校准好,整个模型就是空中楼阁。
8.2 基于随机控制的做市策略
Avellaneda-Stoikov模型的核心解法是HJB方程。这里我不推导完整过程,直接给结论——最优报价偏移量:
最优报价公式:
δᵃ(q, t) = (1/κ) + (γ·σ²·(T-t)·q) + (γ·σ²·(T-t)²/2)
δᵇ(q, t) = (1/κ) - (γ·σ²·(T-t)·q) + (γ·σ²·(T-t)²/2)
其中:γ是风险厌恶系数,σ是波动率,T是剩余时间
这个公式告诉我们三件事:
- 库存影响报价:库存为正时,卖报价差缩小(想卖出去),买报价差扩大(不想再买)
- 时间衰减:越接近T,库存调整力度越大
- 风险厌恶:γ越大,对库存越敏感
我曾经在实盘测试中发现一个坑:直接用这个公式算出来的报价偏移量,在波动率突变时会剧烈跳动。后来我加了一个平滑处理,效果好了很多。
8.3 最优报价与库存管理
库存管理是做市商的生命线。Avellaneda-Stoikov模型给出了一个优雅的解决方案:库存均值回归。
模型隐含的库存动态是:
dQ(t) = -κ·Q(t)·dt + 噪声项
这意味着库存会自然向0回归。回归速度由κ和γ共同决定。我个人习惯把κ设为0.5-1.0之间,γ根据账户风险承受能力调整。
实战技巧:
我在做BTC/USDT做市时,把γ设成了0.1,κ设成了0.8。结果发现库存波动太大。后来改成γ=0.3,κ=1.2,库存曲线平滑了很多。建议你从保守参数开始调。
8.4 模型扩展与实战应用
原始Avellaneda-Stoikov模型有几个假设需要留意:
- 订单到达率是指数形式——实际市场可能不是
- 中间价服从几何布朗运动——有跳跃风险
- 不考虑对手方风险——大单时需要考虑
我在实际项目中做了几个扩展:
- 加入跳跃项:用Merton跳跃扩散模型替代GBM
- 非线性到达率:用幂律函数替代指数函数
- 多资产库存管理:考虑资产间的相关性
避坑指南:
我曾经在ETH做市时直接套用BTC的参数,结果亏了一周。不同资产的波动率、订单到达率差异很大,必须单独校准。别偷懒。
8.5 知识体系总览
下面这张图总结了本章的核心逻辑:
这张图把整个流程串起来了。从Avellaneda-Stoikov模型出发,通过随机控制框架和HJB方程,得到最优报价策略。然后库存管理机制确保风险可控,最后加上实战扩展应对真实市场。
我的建议:
刚开始做连续时间模型时,别急着上复杂扩展。先把基础版本的Avellaneda-Stoikov跑通,用历史数据回测一个月。等你对参数敏感度有感觉了,再逐步加入跳跃项和非线性项。我当年就是太心急,结果debug花了两周。
连续时间模型的好处是数学优雅,但坏处是计算量大。实盘时我通常用离散化近似,把时间切成1秒的步长,效果已经足够好。毕竟,市场不会因为你用了连续时间模型就变得连续——订单还是离散到达的。