4. 库存管理目标:目标库存区间设定、库存均值回归策略
做市商的库存管理,说白了就是回答三个问题:我该持多少货?什么时候补?什么时候抛?
我刚开始做市商系统那会儿,总觉得只要报价够快就能赚钱。结果有一次,某个币种突然单边上涨,我的库存被吃了个精光,后面只能干瞪眼看着行情走。嗯,从那以后我才真正重视起库存管理来。
4.1 目标库存区间的设定逻辑
目标库存区间,就是给库存画一条「安全线」。我个人习惯用动态区间,而不是固定值。为什么?因为市场波动率在变,你的风险承受能力也得跟着变。
4.1.1 基于波动率的区间设定
核心思路很简单:波动越大,区间越宽。你想想看,如果市场一天上下5%,你非要死守一个窄区间,那不是在给自己找麻烦吗?
我常用的公式是这样的:
# 目标库存区间 = 基准库存 ± 波动率调整因子
import numpy as np
def calc_inventory_zone(base_inv, price_series, lookback=20, z_score=1.5):
"""
计算动态库存区间
:param base_inv: 基准库存(通常为0,即中性库存)
:param price_series: 最近N个价格数据
:param lookback: 回看窗口
:param z_score: 置信度参数,越大区间越宽
"""
returns = np.diff(price_series) / price_series[:-1]
volatility = np.std(returns) * np.sqrt(252) # 年化波动率
# 波动率越高,区间越宽
width = base_inv * z_score * volatility * 100
upper = base_inv + width
lower = base_inv - width
return lower, upper, volatility
我在项目中遇到过一个问题:直接用波动率算出来的区间,有时候会宽得离谱。后来我加了个硬性边界,比如最大库存不超过总资金的20%。这样既保留了动态调整的灵活性,又不会让风险失控。
4.1.2 基于订单流不平衡的调整
光看波动率还不够。我记得有一次,波动率很低,但订单流明显偏向买方。如果只看波动率,你会觉得库存很安全,但实际上你的库存正在被一点点吃掉。
所以我建议加入订单流不平衡因子:
def adjust_zone_with_orderflow(lower, upper, order_imbalance, threshold=0.3):
"""
根据订单流不平衡调整库存区间
:param order_imbalance: 正数表示买方压力大,负数表示卖方压力大
"""
if order_imbalance > threshold:
# 买方压力大,适当提高库存上限
upper *= (1 + 0.1 * order_imbalance)
elif order_imbalance < -threshold:
# 卖方压力大,适当降低库存下限
lower *= (1 + 0.1 * abs(order_imbalance))
return lower, upper
4.2 库存均值回归策略
库存均值回归,说白了就是「涨多了就卖,跌多了就买」。但做市商和普通交易者不一样——我们不是为了赚方向性收益,而是为了把库存拉回目标区间。
4.2.1 均值回归的触发条件
我个人习惯用库存偏离度作为触发信号:
def mean_reversion_signal(current_inv, lower, upper, mid_price):
"""
判断是否需要触发均值回归操作
返回: 'buy', 'sell', 'hold'
"""
if current_inv > upper:
# 库存过高,需要卖出
return 'sell'
elif current_inv < lower:
# 库存过低,需要买入
return 'buy'
else:
return 'hold'
你可能会问:就这么简单?嗯,逻辑上确实简单,但执行起来有坑。
4.2.2 回归操作的执行策略
触发信号之后,怎么执行?我建议用分层执行:
- 轻度偏离(库存超出区间10%以内):只调整报价宽度,不主动吃单
- 中度偏离(库存超出区间10%-30%):主动挂单,但价格偏保守
- 重度偏离(库存超出区间30%以上):直接吃单,快速回归
def execute_mean_reversion(signal, current_inv, mid_price, depth):
"""
分层执行均值回归
"""
deviation = abs(current_inv) / (upper - lower) * 100
if deviation < 10:
# 轻度:调整报价宽度
return {'action': 'adjust_spread', 'width': 1.5 * base_spread}
elif deviation < 30:
# 中度:主动挂单
price_offset = 0.001 * mid_price # 0.1%的偏移
if signal == 'sell':
return {'action': 'limit_sell', 'price': mid_price + price_offset}
else:
return {'action': 'limit_buy', 'price': mid_price - price_offset}
else:
# 重度:直接吃单
return {'action': 'market_order', 'side': signal}
4.2.3 均值回归的止损机制
这里有个很多人忽略的点:均值回归策略也会亏钱。如果市场是趋势性的,你越回归越亏。
我个人的做法是加一个趋势过滤器:
def trend_filter(price_series, lookback=50):
"""
判断当前是趋势市还是震荡市
返回: 'trending', 'ranging'
"""
sma_short = np.mean(price_series[-10:])
sma_long = np.mean(price_series[-lookback:])
# 如果短期均线和长期均线偏离超过2%,认为是趋势市
if abs(sma_short - sma_long) / sma_long > 0.02:
return 'trending'
else:
return 'ranging'
如果是趋势市,我会暂停均值回归操作,转而采用趋势跟踪策略。说白了,你不能和市场对着干。
4.3 库存管理的整体框架
最后,我把整个库存管理的逻辑画成了一张图,方便你理解:
这张图的核心逻辑是:先定区间,再监控偏离,然后判断市场状态,最后分层执行。每一步都有对应的参数和策略,不能跳步。
好了,库存管理的核心内容就这些。记住一句话:库存管理不是预测市场,而是管理风险。你控制住了库存,就控制住了做市商最大的风险来源。
公众号:蓝海资料掘金营,微信deep3321