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 做理论校准,上层用信号模型做动态调整。这样既有理论支撑,又有工程稳健性,还能捕捉市场机会。

核心总结:没有完美的模型,只有适合当前市场状态的模型。做市策略的本质是风险管理,而不是预测价格。记住这一点,你就能在模型选择上少走很多弯路。

经典做市模型知识体系 Avellaneda-Stoikov • 理论最优解 • 风险厌恶系数 γ • 波动率 σ • 时间窗口 T • 库存 q 适用:理论基准线 基于库存模型 • 工程实用解 • 库存调整系数 k • 目标库存 • 库存容忍区间 • 强制平仓逻辑 适用:新手/稳健策略 基于信号自适应 • 实战进化解 • 订单簿不平衡 • 成交速度 • 价差变化率 • 大单检测 适用:高阶/高频策略 理论校准 动态增强 三层架构:库存模型(基础) → A-S(校准) → 信号模型(动态调整)

我的个人经验:刚开始做做市策略时,别想着一步到位用最复杂的模型。先用基于库存的模型跑通整个回测流程,理解库存风险是怎么影响盈亏的。等你能熟练调参了,再逐步加入信号和理论校准。做市策略的优化,80%的收益来自正确的风险控制,只有20%来自模型本身的精度。

专注资料整理