4、经典做市模型:Avellaneda-Stoikov模型、基于库存的做市模型、基于信号的自适应模型
做市策略的核心,说白了就是回答三个问题:报什么价?报多少量?什么时候调整?
不同的模型给出了不同的答案。我个人习惯把经典模型分成三代:第一代是理论最优解(Avellaneda-Stoikov),第二代是工程实用解(基于库存),第三代是实战进化解(基于信号)。
嗯,咱们一个一个来看。
4.1 Avellaneda-Stoikov模型:理论界的扛把子
这个模型是2008年由Avellaneda和Stoikov提出的。我第一次读这篇论文时,差点被数学公式劝退。但后来在实际项目中拆解后发现,它的核心思想其实很朴素:做市商应该根据库存风险动态调整报价。
模型的核心公式长这样:
# 最优 bid 和 ask 价格偏移量
δ_bid = (1/2) * γ * σ² * T + (q * γ * σ² * T) / (2 * (1 - q))
δ_ask = (1/2) * γ * σ² * T - (q * γ * σ² * T) / (2 * (1 + q))
# 其中:
# γ: 风险厌恶系数(越大越保守)
# σ: 波动率
# T: 做市时间窗口
# q: 当前库存(标准化为[-1, 1])
公式看着复杂,但你可以这样理解:
- 库存 q 为正(手里有多头仓位):bid 价要压低,ask 价也要压低。目的是尽快把货出掉。
- 库存 q 为负(手里是空头仓位):bid 价抬高,ask 价抬高。目的是尽快补货。
- 风险厌恶 γ 越大:报价偏移越激进,因为怕死。
关键洞察:这个模型给出了一个「理论最优」的报价偏移量。但它假设市场是连续扩散的,没有跳跃,也没有对手盘策略博弈。说白了,它是个理想化的基准线。
我在项目中遇到过一个问题:直接用这个模型跑实盘,在低波动行情下表现还行,但一遇到大单冲击,库存瞬间爆仓。为什么?因为它没有考虑订单簿的深度信息。
4.2 基于库存的做市模型:工程师的务实选择
既然理论模型有局限,那我们就自己动手造轮子。基于库存的模型,核心逻辑就一句话:库存偏离目标位置越远,报价越激进。
它的数学表达更简单:
# 库存偏移量计算
inventory_skew = -k * (current_inventory - target_inventory)
# 调整后的报价
adjusted_bid = mid_price + spread_bid + inventory_skew
adjusted_ask = mid_price + spread_ask + inventory_skew
# k: 库存调整系数(经验值通常在0.01~0.1之间)
这里有个工程上的坑,我曾经踩过:k 值不能设得太大。有一次我把 k 设成 0.5,结果库存稍微偏离一点,报价就跑到离谱的位置,直接被套利机器人收割了。嗯,血的教训。
我的建议:k 值最好用历史数据做滚动优化。我一般用过去20个交易日的波动率来动态调整 k,波动率大时 k 小一点,波动率小时 k 大一点。这样能自适应市场状态。
基于库存的模型还有一个变种:区间做市。设定一个库存容忍区间 [q_min, q_max],在区间内正常报价,超出区间则强制平仓式报价。这其实是一种风险控制的思路。
| 模型类型 | 核心参数 | 优点 | 缺点 |
|---|---|---|---|
| Avellaneda-Stoikov | γ, σ, T | 理论最优,有闭式解 | 假设太强,实盘需调整 |
| 基于库存 | k, 目标库存 | 简单直观,易实现 | 参数敏感,需调参 |
| 基于信号 | 信号权重, 阈值 | 能捕捉市场微观结构 | 信号质量决定成败 |
4.3 基于信号的自适应模型:实战进化的产物
你想想看,如果市场突然出现大买单,你还按库存模型慢慢调整报价,那黄花菜都凉了。基于信号的自适应模型,就是来解决这个问题的。
它的核心思路是:把市场微观结构信号作为报价调整的前馈输入。
常用的信号包括:
- 订单簿不平衡:(bid_volume - ask_volume) / (bid_volume + ask_volume)
- 成交速度:过去N秒的成交笔数/成交量
- 价差变化率:spread 的短期趋势
- 大单检测:单笔成交量超过阈值
我一般这样组合使用:
# 信号合成
signal = w1 * order_imbalance + w2 * trade_speed + w3 * spread_trend
# 自适应报价偏移
adaptive_skew = -k * inventory + alpha * signal
# alpha: 信号权重(通常0.2~0.5)
这里有个细节:信号要归一化。不同信号的量纲差异很大,订单簿不平衡在[-1,1]之间,成交速度可能是几百笔/秒。不归一化的话,权重根本没法调。
避坑指南:我曾经在信号中加入「过去1分钟涨跌幅」作为趋势信号,结果在震荡行情中频繁切换方向,导致报价来回跳,成交率极低。后来我加了一个「信号置信度」的过滤:只有当信号强度超过阈值时才启用,否则用纯库存模型。效果好了很多。
4.4 三种模型的对比与选择
说了这么多,到底该用哪个?我的经验是:
- 新手入门:先用基于库存的模型。简单、可控、容易 debug。
- 有一定经验:在库存模型基础上,叠加 Avellaneda-Stoikov 的理论偏移作为基准线。
- 高阶玩家:用基于信号的自适应模型,但一定要做好信号质量监控和回测验证。
我个人现在的做法是:三层架构。底层用库存模型做基础报价,中层用 Avellaneda-Stoikov 做理论校准,上层用信号模型做动态调整。这样既有理论支撑,又有工程稳健性,还能捕捉市场机会。
核心总结:没有完美的模型,只有适合当前市场状态的模型。做市策略的本质是风险管理,而不是预测价格。记住这一点,你就能在模型选择上少走很多弯路。
我的个人经验:刚开始做做市策略时,别想着一步到位用最复杂的模型。先用基于库存的模型跑通整个回测流程,理解库存风险是怎么影响盈亏的。等你能熟练调参了,再逐步加入信号和理论校准。做市策略的优化,80%的收益来自正确的风险控制,只有20%来自模型本身的精度。