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
实战技巧:订单流不平衡的阈值不要设得太低。我一般用0.3,低于这个值说明市场相对均衡,不需要过度调整。

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'

你可能会问:就这么简单?嗯,逻辑上确实简单,但执行起来有坑。

避坑指南:我曾经犯过一个错误——库存刚超出区间就立刻执行回归操作。结果市场一个反弹,我反而亏了。后来我加了确认机制:库存偏离区间超过一定时间(比如3个tick)才触发操作。

4.2.2 回归操作的执行策略

触发信号之后,怎么执行?我建议用分层执行

  1. 轻度偏离(库存超出区间10%以内):只调整报价宽度,不主动吃单
  2. 中度偏离(库存超出区间10%-30%):主动挂单,但价格偏保守
  3. 重度偏离(库存超出区间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