3. 评估订单流不平衡风险
任务说明
做市商持续接收买卖订单,当某一方向的订单持续多于另一方向时,库存会单向累积,形成失衡风险。本案例基于订单簿快照中的逐笔委托数据,计算订单流不平衡(Order Flow Imbalance, OFI)指标,并据此评估库存风险等级,输出应对策略建议。
核心实现
import pandas as pd
import numpy as np
from dataclasses import dataclass
from typing import List, Tuple
@dataclass
class Order:
"""单笔订单"""
price: float
side: str # 'buy' 或 'sell'
qty: float
@dataclass
class InventoryRisk:
"""库存风险评估结果"""
ofi: float
risk_level: str # 'low', 'medium', 'high'
action: str
def compute_ofi(orders: List[Order], window: int = 50) -> float:
"""
计算订单流不平衡指标。
OFI = (买单量 - 卖单量) / (买单量 + 卖单量),取值[-1, 1]。
使用滑动窗口内的累计量,避免单笔噪声。
"""
if len(orders) < window:
window = len(orders)
recent = orders[-window:]
buy_qty = sum(o.qty for o in recent if o.side == 'buy')
sell_qty = sum(o.qty for o in recent if o.side == 'sell')
total = buy_qty + sell_qty
if total == 0:
return 0.0
return (buy_qty - sell_qty) / total
def assess_inventory_risk(orders: List[Order],
inventory: float,
max_inventory: float = 1000.0,
window: int = 50) -> InventoryRisk:
"""
综合订单流不平衡与当前库存水平评估风险。
风险判定逻辑:
- 若 |OFI| < 0.2 且 |inventory| < 0.3*max_inventory → low
- 若 |OFI| < 0.5 且 |inventory| < 0.6*max_inventory → medium
- 其余情况 → high
应对策略:
- low: 维持当前报价
- medium: 向逆方向调整报价,缩小价差
- high: 暂停同方向报价,主动吃单对冲
"""
ofi = compute_ofi(orders, window)
inv_ratio = abs(inventory) / max_inventory
# 库存方向与OFI方向一致时风险更高
# 若库存为正(净买入)且OFI为正(买压持续),风险叠加
if (inventory > 0 and ofi > 0) or (inventory < 0 and ofi < 0):
risk_score = abs(ofi) * 0.7 + inv_ratio * 0.3
else:
# 库存与OFI方向相反,部分对冲
risk_score = abs(ofi) * 0.3 + inv_ratio * 0.7
if risk_score < 0.25:
level = 'low'
action = '维持当前报价策略'
elif risk_score < 0.55:
level = 'medium'
action = '向逆方向调整报价,收窄价差以加速库存回归'
else:
level = 'high'
action = '暂停同方向新增报价,主动吃单对冲降低库存'
return InventoryRisk(ofi=ofi, risk_level=level, action=action)
# 最小可运行示例
if __name__ == '__main__':
# 模拟订单流:连续买单压力
np.random.seed(42)
sample_orders = []
for i in range(100):
if i < 70: # 前70笔以买单为主
side = 'buy' if np.random.random() < 0.8 else 'sell'
else:
side = 'sell' if np.random.random() < 0.6 else 'buy'
price = 100 + np.random.randn() * 0.5
qty = np.random.randint(1, 10)
sample_orders.append(Order(price=price, side=side, qty=float(qty)))
# 当前库存:假设已净买入300(正库存)
current_inventory = 300.0
result = assess_inventory_risk(sample_orders, current_inventory)
print(f"订单流不平衡指标 OFI: {result.ofi:.4f}")
print(f"风险等级: {result.risk_level}")
print(f"应对策略: {result.action}")
# 预期输出(基于代码逻辑可唯一推出):
# OFI 为正(约0.3~0.5),库存为正,方向一致 → 风险等级 medium 或 high
# 具体数值取决于随机种子,但风险判定逻辑可复现
运行与验证
环境依赖:Python 3.8+,pandas 与 numpy(示例中仅使用 numpy,pandas 可扩展用于批量数据处理)。
运行方式:
python order_flow_risk.py
验证方法:
- 程序正常输出三行结果,无异常报错。
- 修改
sample_orders中买卖比例(例如将前70笔改为卖单为主),重新运行后 OFI 符号应反转,风险等级与策略相应变化。 - 将
current_inventory改为 -300(净卖出),观察库存方向与 OFI 方向不一致时的风险评分变化。 - 构造极端输入(全部为买单且库存接近上限),应输出
high风险与对冲策略。
关键逻辑说明
本实现将订单流不平衡(OFI)与当前库存水平结合为综合风险评分。OFI 反映短期买卖压力方向,库存反映累积敞口大小。当两者方向一致时(如库存为正且买压持续),风险权重偏向 OFI;方向相反时,库存权重更高——因为此时订单流可能帮助库存回归,风险主要来自库存规模。风险阈值(0.25/0.55)可根据实际做市品种的波动率与库存上限调整。