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的选取依赖市场波动与库存容量,需结合历史数据调参;本案例使用固定值演示机制。 - 随机模拟仅用于验证逻辑自洽性,不代表真实市场收益表现。