2. 订单簿数据结构与关键指标

要测算订单簿的韧性,第一步不是写公式,而是把订单簿“读”清楚。限价订单簿(Limit Order Book, LOB)本质是一个按价格优先、时间优先排序的双边挂单集合:买盘(bid side)与卖盘(ask side)各自维护若干价格档位,每个档位记录该价位上的委托数量与委托笔数。韧性测算的所有指标,最终都从这两侧的结构与变化中提取。

一、订单簿的组成要素

一个可用的订单簿快照至少包含以下要素:价格档位(price level)、档位数量(size/quantity)、档位委托笔数(order count)、最优买价(best bid, BB)、最优卖价(best ask, BA)、时间戳与快照序号。其中 BB 与 BA 之间的差额即买卖价差(spread = BA − BB),它是流动性成本最直接的度量;BB 与 BA 的中点称为中间价(mid price),常作为价格参照基准。

需要特别强调参照约定:本文所有“深度”“失衡”均以中间价为对称中心,买盘深度向价格下方累计,卖盘深度向价格上方累计;价差恒为非负值(BA ≥ BB),若出现 BA < BB 则说明数据存在交叉盘异常,必须先清洗。这一约定在后续所有指标与图示中保持一致。

订单簿的“深度”有两种常见口径:一是档位深度,即前 N 档(如 5 档、10 档)累计挂单量;二是价格区间深度,即中间价上下各 x 个基点(bps)或 x 个最小变动价位(tick)内的累计挂单量。前者适合高频、短周期场景,后者对价格波动更稳健,适合跨时段比较。实际测算中应明确采用哪一种,并在整个研究期内保持不变。

二、韧性测算的基础指标定义

韧性刻画的是订单簿在受到冲击后“吸收—恢复”的能力,因此基础指标应覆盖三个维度:冲击前的静态结构、冲击中的瞬时变化、冲击后的恢复程度。

1. 相对价差:spread_bps = (BA − BB) / mid × 10000。用基点表示便于跨标的比较。示例:BB = 99.98,BA = 100.02,mid = 100.00,则价差为 4 bps。

2. 深度失衡:imbalance = (D_bid − D_ask) / (D_bid + D_ask),取值 [−1, 1]。D_bid、D_ask 为同一口径下的累计深度。失衡接近 +1 表示买盘显著厚于卖盘,价格上行压力较大;接近 −1 则相反。该指标对短期价格方向有较强指示性。

3. 冲击深度消耗率:当一笔市价单(或一组净主动成交)消耗掉 Q 数量的对手盘后,记录被消耗档位的累计量 D_0,定义 consumption = Q / D_0。它衡量单次冲击“吃掉”了多厚的流动性,是恢复测算的起点。

4. 恢复时间:从冲击发生时刻 t_0 起,到深度或价差回到冲击前基准的某一比例(如 80%)所需的时间 Δt。基准可取冲击前若干快照的均值,避免单点噪声。恢复时间越短,韧性越强。

5. 恢复比率:recovery_ratio = (D_t − D_trough) / (D_0 − D_trough),其中 D_trough 为冲击后深度的最低点,D_t 为观察时点深度。该比率把“恢复了多少”归一化到 [0, 1],便于不同冲击强度之间横向对比。

下面这张图把订单簿的双边结构、关键价位与上述指标的作用位置放在同一张“结构—指标”关系图中,便于建立整体印象。

限价订单簿结构与韧性基础指标作用位置 卖盘(Ask Side) Ask 5 档 · 100.10 · 量 320 Ask 4 档 · 100.08 · 量 260 Ask 3 档 · 100.06 · 量 210 Ask 2 档 · 100.04 · 量 180 Ask 1 档(BA)· 100.02 · 量 150 买盘(Bid Side) Bid 1 档(BB)· 99.98 · 量 170 Bid 2 档 · 99.96 · 量 200 Bid 3 档 · 99.94 · 量 240 Bid 4 档 · 99.92 · 量 290 价差 4 bps mid = 100.00 韧性基础指标 相对价差 spread_bps (BA − BB) / mid × 10000 深度失衡 imbalance (D_bid − D_ask) / (D_bid + D_ask) 冲击消耗率 consumption Q / D₀(被冲击档位累计量) 恢复时间 Δt 深度/价差回到基准 80% 所需时间 恢复比率 recovery_ratio (D_t − D_trough) / (D₀ − D_trough) 注:示例价格与数量为教学假设值,非实测数据;深度口径需在全研究期内保持一致

三、从快照到指标:一次可复现的计算过程

假设我们拿到某标的连续两个快照(教学示例,非实测):

快照 t0(冲击前):
  BB = 99.98, BA = 100.02, mid = 100.00
  Bid 前5档累计 D_bid = 170+200+240+290+310 = 1210
  Ask 前5档累计 D_ask = 150+180+210+260+320 = 1120

快照 t1(一笔 400 手市价买单冲击后):
  BB = 99.98, BA = 100.06(Ask 1、2 档被吃掉)
  Ask 前5档累计 D_ask' = 0+0+210+260+320 = 790

据此可算:冲击前 spread_bps = (100.02 − 99.98)/100.00 × 10000 = 4 bps;imbalance = (1210 − 1120)/(1210 + 1120) ≈ +0.039,买盘略厚。冲击消耗率 consumption = 400 / (150+180) ≈ 1.21,说明该笔冲击消耗了被触及两档全部挂单还多出约 21%,属于“穿透式”冲击。冲击后 D_ask 从 1120 降至 790,若后续快照在 3 个更新周期内恢复到 900,则 recovery_ratio = (900 − 790)/(1120 − 790) ≈ 0.33,恢复尚不充分,需继续观察 Δt。

计算前务必统一三件事:深度口径(前 N 档还是 ±x bps)、快照频率(逐笔还是固定间隔)、基准窗口(冲击前取几个快照均值)。三者不一致,指标之间不可比。

四、指标使用中的常见陷阱

第一,只看价差会误判韧性。价差可能因少量挂单迅速收窄,但深度并未恢复,此时 spread 好看而实际承接能力仍弱,应同时看深度与恢复比率。第二,档位数量与委托笔数要区分。同样 1000 手,由 2 笔大单构成与由 200 笔小单构成,其被冲击后的重构速度差异很大,建议在快照中保留 order count 字段。第三,失衡指标对口径敏感,前 1 档失衡波动极大,前 10 档又可能掩盖近端压力,实践中常同时计算多档失衡并观察其一致性。