2. 盘口失衡信号的数据基础

要检验盘口失衡信号的收益分层,第一步不是写回测,而是把数据“对齐”。同一只股票在同一毫秒里,可能同时出现一笔逐笔委托、一笔逐笔成交和一次快照更新;如果三者的时间戳口径不统一,后续算出的买卖压力就会把不同时刻的信息混在一起,收益分层结果自然失真。本节围绕三类 Level-2 数据的字段结构、时间戳对齐规则,以及买卖压力失衡的原始计算口径展开。

三类数据的字段结构与角色分工

Level-2 行情通常包含逐笔委托、逐笔成交和快照(十档行情)三类数据,它们在盘口失衡计算中承担不同角色:

  • 逐笔委托:记录每一笔新委托的进入与撤单。核心字段包括证券代码、交易所、委托时间、委托编号、买卖方向、委托价格、委托数量、委托类型(限价/市价/本方最优等)。它回答“谁在什么价位挂了多少量”。
  • 逐笔成交:记录每一笔撮合成交。核心字段包括成交时间、成交编号、买/卖委托编号、成交价格、成交数量、成交方向(主动买/主动卖,部分数据源需自行推断)。它回答“谁吃掉了谁”。
  • 快照:按固定频率(如每 3 秒)推送的盘口切片,包含最新价、十档买卖价量、累计成交量/额、委托总量等。它回答“某一时刻盘口长什么样”。

三者的关系可以概括为:逐笔委托与逐笔成交是“事件流”,快照是“状态切片”。失衡信号本质上是事件流在时间轴上的累积,而快照提供校验与基准。

时间戳对齐规则

对齐是本节最容易出错的地方,需要明确三条规则:

  1. 统一时间基准:逐笔数据常带“委托时间/成交时间”,快照带“行情时间”,二者可能分别来自交易所撮合时钟与行情发布时钟,存在毫秒级偏差。实操中应统一转换为同一时区的毫秒时间戳,并以交易所时间为准。
  2. 事件归属区间:计算某一快照时刻的失衡值时,只应使用“上一快照时间 ≤ 事件时间 < 当前快照时间”的逐笔事件,避免把未来信息泄漏进当前状态。
  3. 同毫秒排序:同一毫秒内可能有多笔委托与成交,需按“委托编号/成交编号”或数据源给出的序列号稳定排序,保证可复现。
对齐的核心原则是“只用已发生的信息”。任何把当前快照之后的事件计入当前失衡值的做法,都会在回测中制造虚假的预测能力。

买卖压力失衡的原始计算口径

最基础的失衡口径是“委托量差”:在某一时刻,统计买方向与卖方向的有效委托量,计算

OFI = (买委托量 - 卖委托量) / (买委托量 + 卖委托量)

其中“有效委托量”需扣除已撤单部分。若使用逐笔成交,则可构造“主动买卖差”:

TradeImbalance = (主动买成交量 - 主动卖成交量) / 总成交量

两个口径的差别在于:OFI 反映“挂单意愿”,TradeImbalance 反映“成交意愿”。实际检验中常将二者结合,或分别做收益分层,观察哪一类信号更稳定。需要注意,分母为 0 时应置为缺失而非 0,避免制造虚假中性值。

Level-2 三类数据的时间对齐与失衡计算链路 逐笔委托 委托时间 / 编号 方向 / 价格 / 数量 撤单标记 逐笔成交 成交时间 / 编号 买/卖委托编号 价格 / 数量 / 方向 快照(十档) 行情时间 / 十档价量 时间对齐 统一毫秒时间戳 区间归属 同毫秒稳定排序 上一快照 ≤ t < 当前快照 OFI 委托量失衡 (买量 − 卖量) ÷ (买量 + 卖量) 扣除撤单后的有效量 成交失衡 (主动买 − 主动卖) ÷ 总成交量 分母为 0 置缺失

一个可复现的对齐示例

假设某股票快照时间为 10:00:00.000 与 10:00:03.000,逐笔事件如下(示例数据,仅用于说明口径):

事件时间类型方向价格数量
10:00:01.200委托买10.02500
10:00:01.800委托卖10.03300
10:00:02.100成交主动买10.03200
10:00:02.600撤单买10.02100

在 10:00:03.000 快照时刻,区间内有效买委托量为 500−100=400,卖委托量为 300,则 OFI=(400−300)/(400+300)≈0.143;成交失衡=(200−0)/200=1.0(区间内仅一笔主动买)。这两个值分别刻画了“挂单偏多”与“成交偏买”,方向一致但强度不同,正是后续收益分层要比较的对象。

常见错误:把撤单当作负向委托直接累加,或把快照十档量当作逐笔委托量使用。前者会重复扣减,后者混淆了“状态”与“事件”,都会让失衡值偏离真实口径。

完成上述对齐与计算后,每个快照时刻都能得到一组失衡特征。下一步才是按分位数分层、统计各层未来收益,检验信号是否具有单调性或分层差异。数据基础打得越扎实,分层结论才越可信。