4. 基于库存的做市报价偏移策略

任务目标

实现一个库存感知的做市报价偏移策略:当持仓库存高于目标水平时,下调卖价以加速去库存、上调买价以减少进一步买入;当库存低于目标时反向操作。通过一个可运行的Python回测脚本,验证该策略在给定订单流下的报价调整逻辑与库存收敛效果。

核心逻辑

策略维护一个目标库存target_inventory(设为0),根据当前库存inventory与目标的偏差,对基础买卖报价(base_bid, base_ask)施加线性偏移:

offset = -k * (inventory - target_inventory)
bid = base_bid + offset
ask = base_ask + offset

当inventory > 0时,offset < 0,买卖报价同步下移,使卖价更具吸引力(加速卖出),买价更低(抑制买入);当inventory < 0时反向。系数k控制库存回归速度。

完整实现

import random

class InventoryPricingMM:
    def __init__(self, base_bid, base_ask, target_inventory=0, k=0.05):
        self.base_bid = base_bid
        self.base_ask = base_ask
        self.target_inventory = target_inventory
        self.k = k
        self.inventory = 0
        self.trades = []

    def get_quotes(self):
        """根据当前库存返回调整后的买卖报价"""
        offset = -self.k * (self.inventory - self.target_inventory)
        bid = self.base_bid + offset
        ask = self.base_ask + offset
        return round(bid, 2), round(ask, 2)

    def on_trade(self, side, price):
        """side: 'buy'表示我们买入(库存+1), 'sell'表示我们卖出(库存-1)"""
        if side == 'buy':
            self.inventory += 1
        elif side == 'sell':
            self.inventory -= 1
        self.trades.append((side, price))

    def simulate(self, n_steps=100, seed=42):
        """模拟随机订单流,验证库存收敛行为"""
        random.seed(seed)
        mid = (self.base_bid + self.base_ask) / 2
        spread = self.base_ask - self.base_bid

        for _ in range(n_steps):
            bid, ask = self.get_quotes()
            # 随机决定订单方向:0=买(我们买入), 1=卖(我们卖出)
            side = random.choice(['buy', 'sell'])
            # 成交价在报价附近随机扰动
            if side == 'buy':
                price = round(bid + random.uniform(-0.01, 0.01), 2)
            else:
                price = round(ask + random.uniform(-0.01, 0.01), 2)
            self.on_trade(side, price)

        return self.inventory

# 运行验证
mm = InventoryPricingMM(base_bid=99.0, base_ask=101.0, target_inventory=0, k=0.05)
final_inv = mm.simulate(n_steps=200, seed=7)
print(f"最终库存: {final_inv}")
print(f"初始报价: bid=99.00, ask=101.00")
print(f"最终报价: bid={mm.get_quotes()[0]}, ask={mm.get_quotes()[1]}")

运行方式

将上述代码保存为inventory_mm.py,在Python 3.6+环境直接运行:

python inventory_mm.py

无需额外安装第三方库,仅使用标准库random。

验证方法与通过条件

运行脚本后观察输出:

  • 库存收敛:由于买卖方向随机且对称,长期期望库存为0。单次运行最终库存应接近0(例如在-5到+5之间),说明策略没有系统性偏向。
  • 报价偏移方向正确:在模拟过程中,当库存为正时,买卖报价应低于基础报价(bid < 99.0且ask < 101.0);库存为负时报价高于基础报价。可通过在simulate中临时打印(self.inventory, bid, ask)验证。
  • 偏移幅度与库存成比例:库存为10时,偏移量应为0.05 * 10 = 0.5,即买价报98.50、卖价报100.50(在无随机扰动时)。

若最终库存值过大(如超过20),可调大k值(如0.1)重试,观察收敛速度变化。

关键说明

  • 本实现聚焦报价偏移逻辑本身,未包含订单簿深度、成交概率模型等真实市场微观结构因素;实际部署时需将on_trade替换为交易所成交回调。
  • 系数k的选取依赖市场波动与库存容量,需结合历史数据调参;本案例使用固定值演示机制。
  • 随机模拟仅用于验证逻辑自洽性,不代表真实市场收益表现。