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笔成交中主动买入量与主动卖出量的差值占比。步骤如下:
- 读取逐笔成交数据,提取成交时间、成交量、主动方标识。
- 按时间戳排序,去除重复成交编号。
- 将主动方标识映射为买入或卖出,缺失时根据成交价与中间价关系推断。
- 滚动计算过去N笔的主动买入量与主动卖出量。
- 计算不平衡因子:(主动买入量 - 主动卖出量) / (主动买入量 + 主动卖出量)。
- 将因子对齐到快照时间,用于预测下一周期收益。
这个案例的关键在于:主动方标识的准确性直接影响因子方向。若交易所未提供主动方,需要用成交价与当时买卖价的关系推断,而买卖价又依赖快照对齐,因此时间戳对齐与清洗是因子有效性的前提。
五、常见误区与复盘
第一个误区是“用快照时间代替事件时间”。快照是离散的,事件是连续的,若把快照时间当作事件时间,会丢失事件顺序信息,导致因子在快速行情中失效。
第二个误区是“清洗时直接删除异常值”。订单簿数据具有连续性,删除某条记录可能导致盘口档位错位,正确做法是标记异常并保留原始记录,在因子计算时按规则跳过或修正。
第三个误区是“忽略主动方标识的推断误差”。不同交易所对主动方的定义不同,有的用成交价与买卖价比较,有的用委托方向。若推断规则不统一,因子在不同标的上表现差异很大。
总结来看,订单簿数据解析的核心是“字段语义清晰、时间戳对齐严谨、清洗策略可追溯”。只有把这三步做扎实,后续的微观结构因子才具备可解释性与稳健性。