第4章:经典做市模型:Avellaneda-Stoikov模型、库存管理模型、报价调整模型、对称与非对称报价
做市策略的核心,说白了就是回答两个问题:报什么价?报多少量?
我刚开始做市商系统那会儿,以为只要盯着买卖价差就能赚钱。后来发现,库存风险才是真正的噩梦。你想想看,如果手里攒了一大堆卖不出去的货,市场突然跳水,那点价差收益根本不够赔的。
这一章,我们来拆解几个经典模型。它们不是纸上谈兵,而是我在实盘系统里反复验证过的。
4.1 Avellaneda-Stoikov模型:做市策略的基石
这个模型是2008年提出的,但直到今天,很多高频做市商还在用它的变体。为什么?因为它把做市问题变成了一个最优控制问题。
模型的核心思想很简单:
- 你有一个库存,需要管理它的风险
- 你报出买卖价格,等待成交
- 成交是随机的,服从泊松过程
- 你的目标是最大化收益,同时控制库存风险
我记得第一次在实盘里跑这个模型时,发现它有个很妙的特性——它会根据库存自动调整报价。库存多了,就压低卖价、抬高买价,加速出货。库存少了,反过来操作。
核心公式(简化版):
# 最优报价偏移量
delta_bid = (spread / 2) + gamma * sigma^2 * (T - t) * (q - 1/2)
delta_ask = (spread / 2) - gamma * sigma^2 * (T - t) * (q + 1/2)
# 其中:
# spread: 当前市场价差
# gamma: 风险厌恶系数(我一般设0.1-0.5)
# sigma: 波动率
# T-t: 剩余时间
# q: 当前库存(标准化为[-1, 1])
这里有个坑,我踩过:gamma参数不能太大。我曾经在回测里设了1.0,结果报价变得极其激进,库存倒是清得快,但滑点损失把利润全吃掉了。
4.2 库存管理模型:别让库存吃掉你的利润
做市商最怕什么?不是单边行情,而是库存失控。
我见过一个团队,策略在震荡市里赚得盆满钵满,结果遇到一次趋势行情,库存方向做反了,一周亏掉三个月的利润。
库存管理的核心目标:把库存维持在一个安全区间内。
常用的方法有三种:
| 方法 | 原理 | 我的经验 |
|---|---|---|
| 目标库存法 | 设定一个目标库存水平,偏离时调整报价 | 适合低波动市场,简单有效 |
| 库存惩罚项 | 在效用函数中加入库存的二次惩罚 | 数学上优美,但参数调起来很头疼 |
| 动态对冲 | 用期货或期权对冲库存风险 | 成本高,但能扛住极端行情 |
我的建议:刚开始做,用目标库存法就够了。把库存控制在[-20%, +20%]的范围内,超过就强制调整报价。等系统稳定了,再上更复杂的模型。
4.3 报价调整模型:让价格随市场呼吸
静态报价是死路一条。市场在变,你的报价也得跟着变。
报价调整模型,说白了就是根据市场状态动态调整买卖报价。我常用的几个维度:
- 波动率调整:波动率越高,价差越大。这是为了补偿不确定性
- 订单流调整:买单多就抬高卖价,卖单多就压低买价
- 时间调整:临近收盘时缩小价差,因为持仓过夜风险大
- 库存调整:库存偏多时,让报价偏向出货方向
举个例子,我在做比特币做市时,发现一个规律:晚上8点到12点,波动率是白天的两倍。这时候如果还用白天的价差,很容易被吃掉。
注意:报价调整不能太频繁。我曾经设了每秒调整一次,结果系统在震荡行情里疯狂报单撤单,被交易所罚了不少钱。建议至少间隔3-5秒调整一次。
4.4 对称报价 vs 非对称报价
这是做市策略里一个很基础但很重要的选择。
对称报价:买卖价差对称分布在中间价两侧。比如中间价100,价差0.2,那么买价99.9,卖价100.1。
非对称报价:买卖价差不对称。比如买价99.8,卖价100.1,价差0.3但偏向买方。
什么时候用对称?什么时候用非对称?
我的经验是:
- 对称报价:市场平稳、库存中性时用。简单,不容易出错
- 非对称报价:库存偏离目标、或者有方向性预期时用
举个例子。假设你手里有一大堆ETH,想尽快出货。这时候你会怎么做?
对称报价的话,买卖价差一样,出货速度慢。非对称报价的话,你可以把卖价压低一点,买价抬高一点——说白了就是让卖单更有吸引力,让买单更没吸引力。这样库存就能快速降下来。
非对称报价的数学表达:
# 对称报价
bid_price = mid_price - spread / 2
ask_price = mid_price + spread / 2
# 非对称报价(库存偏多时)
bid_price = mid_price - spread / 2 + skew
ask_price = mid_price + spread / 2 + skew
# skew > 0 表示偏向卖方(鼓励卖出)
# skew < 0 表示偏向买方(鼓励买入)
这里有个细节:skew的大小要和库存量挂钩。我一般用线性关系:skew = k * inventory,k取0.1-0.3。库存越大,skew越大,报价越偏向出货方向。
4.5 实战中的坑与经验
讲完理论,说点实战中踩过的坑。
坑一:模型参数过拟合
我曾经花了两周时间,在历史数据上把Avellaneda-Stoikov模型的参数调得完美无缺。结果一上实盘,亏得亲妈都不认识。为什么?因为历史数据里的波动率、订单流模式,和实盘完全不一样。
我的建议:参数要留有余地。宁可保守一点,也别太激进。
坑二:忽略交易成本
很多模型假设交易成本为零。但现实中,手续费、滑点、交易所返佣,这些都会影响你的实际收益。我见过一个策略,回测年化50%,实盘只有5%,就是因为没算手续费。
坑三:库存管理太激进
有些模型会在库存偏离时大幅调整报价。这看起来很合理,但实际效果很差——因为大幅调整报价会吸引套利者来吃你的单子。我建议调整幅度不要超过价差的20%。
一个小技巧:在实盘上线前,先用模拟盘跑一周。模拟盘的数据虽然不完美,但能帮你发现很多模型里没考虑到的问题。我每次上线新策略,都会先跑模拟盘,等稳定了再切实盘。
4.6 总结
这一章我们聊了四个模型:
- Avellaneda-Stoikov:把做市变成最优控制问题,核心是库存和报价的平衡
- 库存管理:别让库存失控,目标库存法是最简单的起点
- 报价调整:根据波动率、订单流、时间、库存动态调整
- 对称 vs 非对称:对称简单,非对称灵活,根据场景选择
这些模型不是孤立的。在实际系统中,它们会组合使用。比如,用Avellaneda-Stoikov计算基础报价,再用库存管理模型调整偏移量,最后用报价调整模型做微调。
下一章,我们会聊做市策略的风险管理。说实话,这部分比模型本身更重要——因为模型只能帮你赚钱,风险管理才能帮你活下去。
嗯,今天就到这里。有问题欢迎在课程群里讨论。