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
三、方向判断:主动买卖的推断逻辑
逐笔成交的方向判断是订单簿重建的关键环节。常见方法有三种:
- 成交价与盘口对比法:若成交价等于卖一价,通常为主动买入;若等于买一价,通常为主动卖出。
- 委托编号匹配法:若成交记录中买方 order_id 晚于卖方 order_id 进入订单簿,则买方为主动方。
- 交易所标记法:部分交易所直接提供
aggressor_side字段,优先使用。
方向判断的准确性直接影响订单簿的买卖压力分析。建议在解析阶段保留原始字段,并在重建阶段用多种方法交叉验证。
四、数据清洗要点与常见误区
逐笔数据在采集、传输、存储过程中可能引入噪声。清洗要点包括:
- 去重:同一序列号的消息可能因重传而重复,需按 seq 去重。
- 乱序处理:网络抖动可能导致消息乱序,需按 seq 重排。
- 缺失补全:序列号跳变时,需标记缺口,避免订单簿状态错误累积。
- 异常值过滤:价格为 0、数量为负、时间戳倒流等异常需剔除或修正。
- 撤单识别:逐笔委托中撤单通常表现为数量为负或特定 order_type,需正确解析。
常见误区:直接用时间戳排序而忽略序列号;将逐笔成交的方向默认为买方主动;未处理撤单消息导致订单簿残留“幽灵订单”。这些都会在后续订单簿重建中放大误差。
五、案例复盘:一次序列号跳变引发的订单簿漂移
某次实盘数据中,逐笔委托序列号在 10:15:32.145 处从 88421 跳至 88425,缺失 3 条消息。解析程序未做缺口标记,直接继续重建。结果买一价从 12.35 变为 12.34,与交易所快照比对发现偏差。复盘发现:缺失的 3 条消息中包含 2 笔撤单和 1 笔新委托,导致买盘队列深度错误。
修正方案:在解析层增加序列号缺口检测,遇到跳变时暂停重建并记录缺口区间,待补全数据后再继续。同时,每 1000 条消息与快照做一次状态校验,及时发现漂移。
清洗流程建议:
- 按 seq 排序,检测连续性。
- 去重:相同 seq 只保留第一条。
- 时间戳对齐:统一转换为微秒或纳秒。
- 方向推断:结合盘口与 order_id 匹配。
- 异常过滤:价格、数量、时间戳合法性检查。
- 状态校验:定期与快照比对。
逐笔数据解析是订单簿重建的“地基”。字段含义决定解析正确性,时间戳与序列号决定事件顺序,方向判断决定买卖压力,清洗要点决定数据质量。只有把这四者都做扎实,后续的订单簿重建才能稳定可靠。