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

验证方法:

  1. 程序正常输出三行结果,无异常报错。
  2. 修改 sample_orders 中买卖比例(例如将前70笔改为卖单为主),重新运行后 OFI 符号应反转,风险等级与策略相应变化。
  3. 将 current_inventory 改为 -300(净卖出),观察库存方向与 OFI 方向不一致时的风险评分变化。
  4. 构造极端输入(全部为买单且库存接近上限),应输出 high 风险与对冲策略。

关键逻辑说明

本实现将订单流不平衡(OFI)与当前库存水平结合为综合风险评分。OFI 反映短期买卖压力方向,库存反映累积敞口大小。当两者方向一致时(如库存为正且买压持续),风险权重偏向 OFI;方向相反时,库存权重更高——因为此时订单流可能帮助库存回归,风险主要来自库存规模。风险阈值(0.25/0.55)可根据实际做市品种的波动率与库存上限调整。