4. 订单流不平衡度量

订单流不平衡(Order Flow Imbalance, OFI)是把“谁在主动推动价格”这件事量化为可计算指标的过程。它回答的核心问题是:在当前时刻,主动买入与主动卖出、挂单深度与消耗速度之间,哪一方占据优势,这种优势有多强。本节围绕三条主线展开:以买卖量差刻画主动成交的方向性压力,以订单簿深度不平衡刻画被动挂单的承接结构,以成交方向分类为前两者提供基础标签。三者构成一个从原始逐笔数据到可建模特征的完整链条。

一、成交方向分类:一切度量的起点

逐笔成交本身不带“买/卖”标签,交易所推送的成交通常只有价格、数量、时间与成交编号。要计算买卖量差,必须先判定每一笔成交是主动买还是主动卖。行业通用做法是逐笔成交比较法(Lee-Ready 思路的简化版):将成交价与同一时刻的买一价、卖一价比较。

  • 主动买(买方发起):成交价 ≥ 卖一价,说明买方愿意跨过价差吃掉卖盘挂单,记为 +V。
  • 主动卖(卖方发起):成交价 ≤ 买一价,说明卖方愿意砸向买盘挂单,记为 −V。
  • 中间价成交:成交价严格位于买一与卖一之间(常见于隐藏单或价差较大的品种),可用“上一笔成交价比较法”兜底:价格上行归为主动买,下行归为主动卖,持平沿用前一笔方向。

需要强调参照约定:本课程统一以买方主动为正、卖方主动为负,所有量差、累计量差与后续信号方向均遵循此约定,图示与正文保持一致。分类完成后,每笔成交得到一个带符号的成交量 signed_vol = direction × volume,这是后续所有指标的最小单元。

二、买卖量差:主动压力的直接度量

最朴素的度量是固定时间窗口内的净主动成交量:

# 示例参数:窗口 1 分钟,逐笔成交聚合
delta_t   = sum(signed_vol for trade in window_t)      # 净主动成交量(买卖量差)
buy_vol   = sum(v for v in window_t if dir == +1)
sell_vol  = sum(v for v in window_t if dir == -1)
ratio_t   = (buy_vol - sell_vol) / (buy_vol + sell_vol)  # 归一化量差,取值 [-1, 1]

绝对量差 delta_t 受品种流动性与时段影响极大,直接跨品种比较没有意义,因此更常用归一化量差 ratio_t。举例说明(示例数据,非实测):某分钟窗口内主动买成交 820 手、主动卖成交 540 手,则 delta_t = +280 手,ratio_t = 280 / 1360 ≈ +0.206,表示买方主动压力占优约两成。若把窗口拉长到 5 分钟并做累计,可得到累计量差曲线(CVD),其斜率变化比单点数值更能反映压力的持续性。

量差指标对“大单拆分”敏感:一笔大额主动买可能被拆成数十笔小单连续成交,方向一致但单笔量小。因此实际计算中常配合成交量加权或按成交编号合并,避免单笔阈值过滤误伤真实压力。

三、订单簿深度不平衡:被动承接结构的度量

买卖量差只看“已经成交的”,订单簿深度不平衡(Depth Imbalance, DI)则看“还挂着的”。在任意快照时刻,取买盘前 N 档与卖盘前 N 档的挂单量:

# 示例参数:N = 5 档,快照频率 500ms
bid_depth = sum(qty for level in bid_levels[:5])
ask_depth = sum(qty for level in ask_levels[:5])
DI = (bid_depth - ask_depth) / (bid_depth + ask_depth)   # 取值 [-1, 1]

DI 为正表示买盘挂单更厚,理论上对价格有支撑;为负表示卖压更重。但 DI 有一个关键陷阱:挂单可以被撤。卖盘挂单突然变厚,可能是真实卖压,也可能是做市商在价差外侧“虚挂”诱导;买盘挂单突然变薄,可能是被主动卖单吃掉,也可能是撤单。因此 DI 必须与成交方向、撤单率联合解读,单独使用容易误判。

更稳健的做法是引入深度变化量而非绝对深度:比较相邻两个快照的买一/卖一档量变化,把“新增挂单”与“被成交消耗”区分开。当买一量增加且伴随主动买成交,说明买方既主动又愿意挂单承接,信号强度最高;当买一量减少但成交为主动买,说明买盘在被消耗,属于弱势承接。

四、三类度量的联合判读

把成交方向分类、买卖量差、深度不平衡放在同一时间轴上,可以形成对价格压力的分层判断。下图展示了一个快照窗口内三条信息流的汇聚关系与典型状态判读:

原始逐笔与快照数据 逐笔成交 价格 / 数量 / 时间 订单簿快照 买一~买五 / 卖一~卖五 撤单与新增挂单 订单编号 / 档位变化 成交方向分类 价 vs 买一/卖一 → ±V 买卖量差 delta_t / ratio_t 深度不平衡 DI = (B−A)/(B+A) 联合状态判读(示例阈值:|ratio| ≥ 0.15,|DI| ≥ 0.20) ratio > +0.15 且 DI > +0.20 主动买强 + 买盘厚 → 上行压力强 ratio > +0.15 且 DI < −0.20 主动买强但卖盘厚 → 上行受阻,警惕反转 ratio < −0.15 且 DI < −0.20 主动卖强 + 卖盘厚 → 下行压力强 |ratio| < 0.15 且 |DI| < 0.20 双向均衡 → 观望,等待方向确认 特征输出 ratio_t DI_t CVD 斜率 撤单率

图中四个判读格给出的是示例阈值,实际使用时应按品种的波动率与流动性分位数重新标定,例如取过去 20 个交易日 ratio 的 70% 分位作为强弱分界,而不是固定 0.15。阈值标定的意义在于让“强/弱”相对于该品种自身的历史分布,而非绝对数值。

五、实现要点与常见偏差

第一,时间对齐。逐笔成交与订单簿快照的时间戳精度不同,成交可能落在两个快照之间。稳妥做法是用成交时刻之前最近一个快照的买一/卖一价做方向判定,而不是用成交之后的快照,否则会引入前视偏差。

第二,窗口选择。窗口过短(如 1 秒)噪声大,单笔大单即可翻转符号;窗口过长(如 30 分钟)会平滑掉真实压力变化。实践中常同时计算 1 分钟、5 分钟、15 分钟三档 ratio,观察其一致性:三档同号且绝对值递增,说明压力在累积;长短窗口符号相反,说明短期反转或长期趋势中的回调。

第三,深度不平衡的档位选择。只取买一卖一噪声极大,取前五档较稳健,取前二十档则混入大量远离盘口的“背景挂单”,对短期价格压力不敏感。建议以“覆盖 80% 近期成交量的档位数”作为 N 的选取依据。

不要把 DI 当作独立买卖信号。挂单是可撤的,深度不平衡在盘口附近极易被诱导性挂单操纵。DI 的正确用法是作为量差指标的确认或否决条件:量差强但 DI 反向,应降低信号置信度而非直接反向交易。