4. 逐笔数据解析入门

逐笔数据是订单簿重建的“原始矿石”。与快照数据相比,逐笔数据保留了市场每一次委托、撤单与成交的微观事件,是还原限价订单簿(LOB)最细粒度的输入。本节聚焦两类核心消息:逐笔成交与逐笔委托,从字段语义、时间戳精度、序列号机制、方向判断到清洗要点,建立可落地的解析框架。

一、核心原理:两类逐笔消息的字段语义

逐笔委托描述“订单进入或离开订单簿”的意图,逐笔成交描述“订单簿中两笔委托发生撮合”的结果。二者共同构成订单簿状态变化的完整事件流。理解字段含义是解析的第一步。

字段类别 逐笔委托(Order) 逐笔成交(Trade)
唯一标识 委托编号 order_id 成交编号 trade_id / 买卖双方 order_id
方向 买卖方向 side(B/S) 通常由主动方决定,需推断
价格与数量 委托价 price、委托量 qty 成交价 price、成交量 qty
订单类型 限价/市价/本方最优等 order_type 成交类型(如撤单成交、对手方成交)
时间 委托到达时间戳 撮合时间戳
序列 委托序号 seq 成交序号 seq

关键点在于:逐笔委托的 side 是显式字段,而逐笔成交的“主动方向”往往需要结合委托簿状态或成交价与盘口的关系推断。这是后续方向判断的核心难点。

二、时间戳精度与序列号:事件排序的基石

逐笔数据的时间戳精度直接决定订单簿重建的准确性。常见精度包括毫秒(ms)、微秒(μs)和纳秒(ns)。同一毫秒内可能发生多笔事件,若仅用毫秒时间戳排序,会导致订单簿状态错乱。

时间戳精度对照:

  • 毫秒级:适合低频策略,但同毫秒内事件顺序不可靠。
  • 微秒级:主流交易所常见,可区分绝大多数事件。
  • 纳秒级:高频场景,需注意系统时钟同步误差。

序列号(seq)是交易所为每条逐笔消息分配的单调递增编号,是事件排序的“权威依据”。当时间戳相同或存在时钟漂移时,必须优先使用序列号排序。解析时需检查序列号是否连续,若出现跳号,说明数据丢失或订阅不完整。

# 序列号连续性检查示例
prev_seq = None
for msg in stream:
    if prev_seq is not None and msg.seq != prev_seq + 1:
        print(f"序列号跳变: {prev_seq} -> {msg.seq}, 缺失 {msg.seq - prev_seq - 1} 条")
    prev_seq = msg.seq

三、方向判断:主动买卖的推断逻辑

逐笔成交的方向判断是订单簿重建的关键环节。常见方法有三种:

  1. 成交价与盘口对比法:若成交价等于卖一价,通常为主动买入;若等于买一价,通常为主动卖出。
  2. 委托编号匹配法:若成交记录中买方 order_id 晚于卖方 order_id 进入订单簿,则买方为主动方。
  3. 交易所标记法:部分交易所直接提供 aggressor_side 字段,优先使用。

方向判断的准确性直接影响订单簿的买卖压力分析。建议在解析阶段保留原始字段,并在重建阶段用多种方法交叉验证。

四、数据清洗要点与常见误区

逐笔数据在采集、传输、存储过程中可能引入噪声。清洗要点包括:

  • 去重:同一序列号的消息可能因重传而重复,需按 seq 去重。
  • 乱序处理:网络抖动可能导致消息乱序,需按 seq 重排。
  • 缺失补全:序列号跳变时,需标记缺口,避免订单簿状态错误累积。
  • 异常值过滤:价格为 0、数量为负、时间戳倒流等异常需剔除或修正。
  • 撤单识别:逐笔委托中撤单通常表现为数量为负或特定 order_type,需正确解析。

常见误区:直接用时间戳排序而忽略序列号;将逐笔成交的方向默认为买方主动;未处理撤单消息导致订单簿残留“幽灵订单”。这些都会在后续订单簿重建中放大误差。

逐笔数据解析与订单簿重建数据流 逐笔委托 order_id / side / price 逐笔成交 trade_id / price / qty 解析与清洗 序列号排序 去重 / 补缺 时间戳对齐 异常值过滤 方向推断 订单簿重建 买盘队列 卖盘队列 撤单移除 成交扣减 状态快照 LOB 实时状态 关键检查点: ① 序列号连续性 → ② 时间戳精度对齐 → ③ 方向推断交叉验证 → ④ 撤单与成交正确扣减 → ⑤ 订单簿状态一致性校验 任何一步缺失或错误,都会导致订单簿出现“幽灵订单”或“状态漂移”,需在重建后做快照比对。

五、案例复盘:一次序列号跳变引发的订单簿漂移

某次实盘数据中,逐笔委托序列号在 10:15:32.145 处从 88421 跳至 88425,缺失 3 条消息。解析程序未做缺口标记,直接继续重建。结果买一价从 12.35 变为 12.34,与交易所快照比对发现偏差。复盘发现:缺失的 3 条消息中包含 2 笔撤单和 1 笔新委托,导致买盘队列深度错误。

修正方案:在解析层增加序列号缺口检测,遇到跳变时暂停重建并记录缺口区间,待补全数据后再继续。同时,每 1000 条消息与快照做一次状态校验,及时发现漂移。

清洗流程建议:

  1. 按 seq 排序,检测连续性。
  2. 去重:相同 seq 只保留第一条。
  3. 时间戳对齐:统一转换为微秒或纳秒。
  4. 方向推断:结合盘口与 order_id 匹配。
  5. 异常过滤:价格、数量、时间戳合法性检查。
  6. 状态校验:定期与快照比对。

逐笔数据解析是订单簿重建的“地基”。字段含义决定解析正确性,时间戳与序列号决定事件顺序,方向判断决定买卖压力,清洗要点决定数据质量。只有把这四者都做扎实,后续的订单簿重建才能稳定可靠。