4. 库存管理基础:库存风险的定义、库存与报价的关系、库存均值回归策略
做市商的核心工作,说白了就是「低买高卖」赚差价。
但这里有个坑——你买进来的货,不一定能马上卖出去。
这些暂时砸在手里的货,就是库存。库存管理,是做市策略里最容易被忽视、却又最致命的一环。我见过不少团队,策略回测时收益曲线漂亮得不行,一上实盘就亏,十有八九是库存管理出了问题。
4.1 库存风险的定义
库存风险,简单讲就是「你手里持有的资产,价格朝不利方向变动的风险」。
举个例子:你以100块的价格买入了1000股,准备在100.1块卖出。结果市场突然跳水,跌到99块。你手里的货瞬间贬值了1000块。这1000块的潜在亏损,就是库存风险。
库存风险的量化指标:
- 库存价值:当前持仓数量 × 当前市场价格
- 库存敞口:库存价值 / 总资产净值(百分比)
- 库存波动率:持仓资产的历史日波动率
- VaR(在险价值):给定置信水平下,未来一段时间内的最大可能亏损
我个人习惯用「库存敞口」作为核心监控指标。敞口超过30%,我就会开始紧张。为什么?因为一旦市场出现黑天鹅,30%的敞口意味着你可能一天亏掉总资产的10%以上。做市赚的那点差价,根本扛不住这种级别的回撤。
⚠️ 注意:库存风险不是线性的。当市场波动率突然放大时,库存风险会成倍增加。我曾经在实盘中遇到过,平时波动率1%的品种,一天内波动率飙到5%,库存敞口瞬间失控。所以,一定要给库存风险加上「波动率乘数」。
4.2 库存与报价的关系
库存状态直接影响你的报价策略。这个逻辑其实很直观:
- 库存为正(多头):你手里有货,更希望卖出去。所以卖价应该比正常价更低一些,买价也应该比正常价更低一些——目的是减少买入,增加卖出。
- 库存为负(空头):你欠着货,更希望买回来。所以买价应该比正常价更高一些,卖价也应该更高一些——目的是减少卖出,增加买入。
- 库存为零:两边均衡,按正常价差报价。
这里有个关键点:库存对报价的影响,不是「有或无」,而是「程度」的问题。
我一般用一个简单的线性公式来调整报价:
# 库存调整因子
inventory = current_position # 当前持仓(正数为多,负数为空)
max_inventory = 1000 # 最大允许持仓
# 调整系数,范围 [-1, 1]
adjustment = inventory / max_inventory
# 调整后的买价和卖价
base_bid = mid_price - spread / 2
base_ask = mid_price + spread / 2
adjusted_bid = base_bid - adjustment * skew_factor
adjusted_ask = base_ask - adjustment * skew_factor
# 当库存为正时,adjustment > 0,买价和卖价都降低
# 当库存为负时,adjustment < 0,买价和卖价都提高
你看,库存为正时,两边报价都往下压。这样做的效果是:你更可能卖出(因为卖价低了),同时更不可能买入(因为买价也低了)。库存自然慢慢降下来。
💡 实战技巧:skew_factor(偏移因子)这个参数很关键。设得太小,库存调整效果不明显;设得太大,报价会偏离市场太远,导致成交率下降。我一般用历史数据回测来调这个参数,目标是在「库存回归速度」和「成交率」之间找到平衡点。
4.3 库存均值回归策略
库存均值回归,核心思想就一句话:让库存围绕零轴波动,不要偏离太远。
为什么是零轴?因为做市商不是投机者。我们的利润来源是买卖价差,不是方向性押注。库存偏离零轴越远,方向性风险越大,做市策略就越像在赌博。
库存均值回归策略,通常包含以下几个要素:
- 目标库存:一般设为0,也可以根据市场情况动态调整
- 回归速度:库存偏离目标后,多快回到目标位置
- 回归触发条件:库存偏离到什么程度开始启动回归
- 回归执行方式:通过调整报价、主动对冲、还是等待被动成交
我常用的一个策略框架是这样的:
class InventoryMeanReversion:
def __init__(self, target=0, threshold=500, speed=0.1):
self.target = target # 目标库存
self.threshold = threshold # 触发阈值
self.speed = speed # 回归速度
def calculate_skew(self, current_inventory):
# 计算库存偏离程度
deviation = current_inventory - self.target
# 如果偏离在阈值内,不做调整
if abs(deviation) < self.threshold:
return 0.0
# 超出阈值,启动回归
# 偏离越大,调整力度越大
skew = deviation * self.speed
return skew
def adjust_quotes(self, mid_price, spread, inventory):
skew = self.calculate_skew(inventory)
bid = mid_price - spread/2 - skew
ask = mid_price + spread/2 - skew
return bid, ask
这个策略的核心逻辑是:库存偏离目标越远,报价偏移越大,从而加速库存回归。
嗯,这里要注意一个细节:阈值不能设得太小。否则市场稍微波动一下,你的报价就来回跳,成交率会很低,而且容易产生不必要的交易成本。
库存均值回归的三种执行方式:
| 方式 | 描述 | 适用场景 |
|---|---|---|
| 被动回归 | 通过调整报价,等待对手方成交 | 流动性好、价差小的市场 |
| 主动对冲 | 在市场上主动下单,平掉库存 | 库存偏离过大、需要快速回归 |
| 组合对冲 | 用相关品种的对冲头寸来抵消库存风险 | 单一品种流动性不足时 |
我个人的经验是:优先用被动回归。因为主动对冲会产生额外的交易成本,而且容易暴露你的意图。只有在库存偏离到危险水平(比如超过最大敞口的80%)时,才启动主动对冲。
曾经有一次,我在做某个小币种的做市,流动性很差。库存偏离后,被动回归根本回不来——因为市场上根本没有对手盘。最后只能硬着头皮用主动对冲,亏了不少手续费。那次之后,我学到一个教训:在做市之前,先评估市场的流动性深度。流动性差的市场,库存管理策略要更激进,阈值要设得更小。
💡 进阶技巧:库存均值回归可以和波动率联动。当市场波动率低时,库存回归可以慢一些,因为风险小;当波动率高时,库存回归要快,因为风险大。我一般用「波动率乘数」来动态调整回归速度:
volatility = get_current_volatility()
base_speed = 0.1
adjusted_speed = base_speed * (1 + volatility * 10)
知识体系总览
下面这张图,把库存管理的核心逻辑串起来了:
库存管理,说白了就是做市商的「安全带」。没有它,你赚再多差价,一次黑天鹅就能让你回到解放前。我建议你在实盘之前,先用历史数据把库存管理策略跑一遍,看看在不同市场环境下,库存偏离的幅度和回归的速度是否合理。
记住一句话:做市商赚的是流动性管理的钱,不是方向性投机的钱。库存管理,就是帮你守住这条底线。