3. 订单簿数据解析

在订单簿微观结构因子的构建中,数据解析是决定后续因子有效性的第一道关口。很多研究者把精力放在模型和因子上,却忽略了原始行情数据的字段语义、时间戳口径与清洗逻辑,导致因子在回测中表现良好、实盘却迅速失效。本节围绕四类核心行情数据展开:Level-1、Level-2、逐笔委托与逐笔成交,重点讲清字段含义、时间戳对齐机制与数据清洗方法。

一、四类行情数据的字段含义与结构差异

Level-1 是最粗粒度的行情快照,通常包含最优一档买卖价、买卖量、最新成交价、成交量与成交额等字段。它的优势是数据量小、传输稳定,适合做中低频因子;劣势是丢失了盘口深度信息,无法刻画挂单撤单行为。

Level-2 在 Level-1 基础上扩展了多档盘口,常见为五档或十档,字段包括每档的买价、买量、卖价、卖量。部分交易所还提供委托队列、加权平均价等衍生字段。Level-2 能反映盘口厚薄与买卖压力,是构建订单簿不平衡因子的基础。

逐笔委托记录每一笔进入撮合系统的委托单,字段通常包括委托编号、委托时间、方向、价格、数量、委托类型。逐笔成交记录每一笔撮合结果,字段包括成交编号、成交时间、成交价、成交量、买卖方向、主动方标识。两者结合可以还原订单簿的动态演化过程,是微观结构因子最核心的数据源。

数据类型 核心字段 时间粒度 典型用途
Level-1 最优买卖价、量、最新价、成交量 快照(3秒或更高频) 价差、中间价、基础收益
Level-2 多档买卖价、量、委托队列 快照(3秒或更高频) 盘口不平衡、深度因子
逐笔委托 委托编号、时间、方向、价、量 事件级(毫秒/微秒) 挂单撤单行为、委托流
逐笔成交 成交编号、时间、价、量、主动方 事件级(毫秒/微秒) 成交不平衡、主动买卖压力

二、时间戳对齐:从事件时间到快照时间

四类数据的时间戳口径往往不一致。Level-1 与 Level-2 是快照时间,逐笔委托与逐笔成交是事件时间。快照时间通常表示该时刻的盘口状态,而事件时间表示该笔委托或成交发生的瞬间。若直接按时间戳合并,容易出现“未来信息泄露”或“事件错配”。

推荐的对齐流程是:先以逐笔事件为基准,按事件时间排序;再将快照数据按快照时间对齐到事件时间轴上,采用“最近过去快照”原则,即对每个事件只使用其发生前最近一次快照,避免使用未来快照。对于高频因子,还可以在事件时间窗口内做滚动聚合,例如过去100毫秒的主动买入成交量。

对齐原则:事件时间为主轴,快照时间为辅轴;任何因子计算只能使用当前事件之前已发生的信息,严禁使用未来快照或未来成交。

在工程实现上,常用做法是将所有数据统一转换为纳秒或微秒时间戳,然后使用有序归并或时间窗口聚合。下面是一个简化的对齐伪代码:

# 假设 events 为逐笔事件,snapshots 为快照
events.sort(key=lambda x: x.timestamp)
snapshots.sort(key=lambda x: x.timestamp)

aligned = []
snap_idx = 0
for e in events:
    while snap_idx + 1 < len(snapshots) and snapshots[snap_idx + 1].timestamp <= e.timestamp:
        snap_idx += 1
    aligned.append({
        "event": e,
        "snapshot": snapshots[snap_idx] if snap_idx < len(snapshots) else None
    })

三、数据清洗:异常值、重复与缺失处理

原始行情数据常见问题包括:重复推送、时间戳乱序、价格为零或负、成交量异常大、买卖方向缺失、快照档位缺失等。清洗策略需要结合业务逻辑,不能简单删除。

  • 重复记录:按委托编号或成交编号去重,保留最早时间戳的记录。
  • 时间戳乱序:按时间戳重新排序,并检查是否存在跨日或跨会话的异常跳变。
  • 价格异常:价格应大于零且落在涨跌停范围内,超出范围的记录标记为异常。
  • 数量异常:成交量或委托量应为整数且不超过市场总股本,异常值需回溯原始报文。
  • 缺失档位:Level-2 某档缺失时,可用前一快照填充或标记为缺失,避免因子计算时误判。
清洗不是“删掉所有异常”,而是“标记并隔离异常”。直接删除可能破坏订单簿的连续性,导致因子在特定时段失真。

四、案例:从逐笔成交构建主动买卖不平衡因子

假设我们要构建一个短周期因子:过去N笔成交中主动买入量与主动卖出量的差值占比。步骤如下:

  1. 读取逐笔成交数据,提取成交时间、成交量、主动方标识。
  2. 按时间戳排序,去除重复成交编号。
  3. 将主动方标识映射为买入或卖出,缺失时根据成交价与中间价关系推断。
  4. 滚动计算过去N笔的主动买入量与主动卖出量。
  5. 计算不平衡因子:(主动买入量 - 主动卖出量) / (主动买入量 + 主动卖出量)。
  6. 将因子对齐到快照时间,用于预测下一周期收益。

这个案例的关键在于:主动方标识的准确性直接影响因子方向。若交易所未提供主动方,需要用成交价与当时买卖价的关系推断,而买卖价又依赖快照对齐,因此时间戳对齐与清洗是因子有效性的前提。

订单簿数据解析与对齐流程 Level-1 / Level-2 快照数据 逐笔委托 事件数据 逐笔成交 事件数据 数据清洗 去重 / 排序 异常标记 缺失填充 方向推断 时间戳对齐 事件时间为主轴 最近过去快照 滚动窗口聚合 禁止未来信息 因子 输入

五、常见误区与复盘

第一个误区是“用快照时间代替事件时间”。快照是离散的,事件是连续的,若把快照时间当作事件时间,会丢失事件顺序信息,导致因子在快速行情中失效。

第二个误区是“清洗时直接删除异常值”。订单簿数据具有连续性,删除某条记录可能导致盘口档位错位,正确做法是标记异常并保留原始记录,在因子计算时按规则跳过或修正。

第三个误区是“忽略主动方标识的推断误差”。不同交易所对主动方的定义不同,有的用成交价与买卖价比较,有的用委托方向。若推断规则不统一,因子在不同标的上表现差异很大。

复盘建议:每次构建新因子前,先抽样检查原始数据的字段分布、时间戳间隔与异常比例,再决定清洗与对齐策略。数据质量报告应作为因子开发的标准前置步骤。

总结来看,订单簿数据解析的核心是“字段语义清晰、时间戳对齐严谨、清洗策略可追溯”。只有把这三步做扎实,后续的微观结构因子才具备可解释性与稳健性。