第四章:Avellaneda-Stoikov模型——做市商报价的经典框架
做市商报价模型里,Avellaneda-Stoikov(简称A-S模型)是我个人最推崇的入门框架。为什么?因为它把做市商的核心矛盾——赚取价差 vs 控制存货风险——用数学语言讲得清清楚楚。
我记得2018年刚接触这个模型时,团队里有人觉得它太理论化。但后来我们在比特币期权做市上跑了一版简化实现,效果出奇的好。说白了,这个模型就像做市商的“牛顿力学”——虽然现实有摩擦,但底层逻辑跑不偏。
4.1 模型假设
A-S模型建立在几个关键假设上。嗯,这里要注意,假设越强,模型越干净,但离现实也越远。我们做工程时要心里有数。
- 市场微观结构:订单流服从泊松过程。说白了,买卖订单到达是随机的,但到达率与报价有关。
- 存货中性:做市商的目标是存货长期归零。他不赌方向,只赚价差。
- 风险厌恶:做市商对存货有风险厌恶系数γ。γ越大,越怕存货积压。
- 连续时间:报价可以随时调整,没有最小变动单位限制(现实中要取整)。
- 对称性:买卖订单的到达率函数形式对称,只是报价偏移方向相反。
我在项目中遇到过一个问题:假设订单流是泊松过程,但实际市场有自相关性(比如大单拆单)。这时候模型会低估连续同向订单的风险。我的建议是——先用A-S模型做基准,再叠加一个“订单流冲击”修正项。
4.2 最优报价推导
推导过程其实不复杂。我们定义做市商的财富过程,然后最大化其期望效用。这里我直接给结论,因为推导细节在教材里都有。
做市商的最优买价和卖价分别为:
买价:p_b = S - (γ * σ² * q * T) / 2 - (1/γ) * ln(1 + γ/κ)
卖价:p_a = S + (γ * σ² * q * T) / 2 + (1/γ) * ln(1 + γ/κ)
其中:
- S:当前市场中间价
- γ:风险厌恶系数
- σ:波动率
- q:当前存货(正数表示多头,负数表示空头)
- T:做市商的时间 horizon(比如一天)
- κ:订单流到达率的弹性系数
你看,报价由三部分组成:
- 中间价S:基准
- 存货调整项:(γ * σ² * q * T) / 2 —— 存货越多,买卖价差越不对称
- 价差项:(1/γ) * ln(1 + γ/κ) —— 基础价差,与风险厌恶和流动性有关
4.3 存货对报价的影响
这是A-S模型最精彩的部分。存货q直接决定了报价的偏移方向。
举个例子:假设你持有100个ETH的多头存货(q=100)。根据公式:
- 买价会下移:你不想再买入了,所以压低买价
- 卖价也会下移:你想尽快卖出存货,所以降低卖价
结果就是整个报价区间向下平移。反之,空头存货会让报价区间上移。
我曾经在模拟交易中犯过一个错误:把γ设得太小,导致模型对存货不敏感。结果回测时存货越积越多,最后爆仓。嗯,从那以后我养成了一个习惯——先跑一遍存货敏感性分析。
存货影响的数学本质:
存货调整项 = (γ * σ² * T) / 2 * q
这是一个线性项。q越大,调整幅度越大。但现实中,当存货接近仓位上限时,调整应该非线性加速。所以我在生产环境里加了一个tanh函数做限幅。
4.4 模型参数解读
参数调优是模型落地的关键。我整理了一个参数速查表:
| 参数 | 符号 | 典型范围 | 物理意义 | 调参建议 |
|---|---|---|---|---|
| 风险厌恶系数 | γ | 0.01 - 1.0 | 对存货风险的敏感度 | 先用回测找最优,再留20%裕度 |
| 波动率 | σ | 根据品种定 | 价格波动剧烈程度 | 用5分钟高频数据估算,别用日线 |
| 时间horizon | T | 0.5 - 4小时 | 做市商计划平仓的时间窗口 | 与流动性正相关,流动性差就设大 |
| 弹性系数 | κ | 0.1 - 10 | 订单流对报价的敏感度 | 用历史数据拟合,注意市场状态切换 |
参数之间还有耦合关系。比如γ和κ:γ越大,基础价差越大;κ越大,基础价差越小。两者共同决定了报价的“激进程度”。
我个人习惯用网格搜索+贝叶斯优化来调参。先粗搜确定范围,再细搜找最优。但记住——参数要定期重估,市场变了参数也得变。
4.5 知识体系图
下面这张SVG图总结了A-S模型的完整逻辑链:
这张图把四个模块串起来了。你从模型假设出发,推导出报价公式,再理解存货如何影响报价,最后用参数调优让模型落地。每一步都有对应的数学表达和工程考量。
公众号:蓝海资料掘金营,微信deep3321