3. Level2数据分类与格式

在Level2行情体系中,数据并不是单一的一张“行情表”,而是由多个粒度、多个通道、多个时间切片共同构成的数据族。理解这些数据的分类与格式,是后续做逐笔回放、订单簿重建和微观结构分析的前提。本节将Level2数据拆成五类核心对象:逐笔委托、逐笔成交、快照行情、订单簿深度,以及交易所接口与字段规范,并说明它们之间的对应关系与常见陷阱。

一、核心原理:五类数据的定位与关系

逐笔委托(Order/Tick Order)记录的是“订单进入撮合系统”的事件,包含委托序号、方向、价格、数量、订单类型等;逐笔成交(Trade/Tick Trade)记录的是“撮合成交”的事件,包含成交序号、买卖双方订单号、成交价、成交量、成交方向等。两者是事件流,具有严格的时间顺序和唯一序号,是重建订单簿的原始素材。

快照行情(Snapshot)是交易所按固定频率(如每3秒或每500毫秒)推送的切片,包含最优买卖价、各档价格与数量、成交量统计等。订单簿深度(Order Book Depth)则是快照中多档买卖盘的结构化表达,通常为5档、10档或更多。快照与深度是“状态”,逐笔是“变化”,二者互为校验。

交易所数据接口与字段说明,是上述数据落地为可编程对象的桥梁。不同交易所(如上交所、深交所、中金所、港交所)在字段命名、序号规则、时间戳精度、订单类型编码上存在差异,必须逐字段对照。

Level2 数据族:事件流与状态切片的关系 逐笔委托 Order / Tick Order 序号·方向·价·量·类型 逐笔成交 Trade / Tick Trade 买方号·卖方号·价·量 快照行情 Snapshot 固定频率·最优价·统计量 订单簿深度 Order Book Depth 多档买卖盘·量价结构 交易所接口 API / 字段规范 编码·时间戳·序号规则 驱动 驱动 聚合 封装 封装

二、方法流程:从原始报文到可用对象

处理Level2数据的标准流程可分为四步:解析、对齐、重建、校验。解析阶段按交易所接口文档将二进制或JSON报文映射为字段;对齐阶段用交易所时间戳与本地接收时间做双时间轴;重建阶段用逐笔委托和逐笔成交驱动订单簿;校验阶段用快照深度比对重建结果。

  1. 解析:读取接口文档,确认字段偏移、字节序、编码方式(如深交所Binary、上交所FAST)。
  2. 对齐:统一时间戳精度(毫秒/微秒),处理序号跳变与重传。
  3. 重建:按订单号维护买卖队列,逐笔更新价格档位。
  4. 校验:每收到快照,比对最优价与各档量,偏差超阈值则触发复盘。

以下是一个字段映射的配置片段示例,用于将原始报文映射为内部结构:

{
  "exchange": "SZSE",
  "channel": "level2_order",
  "fields": {
    "seq_no":      {"offset": 0,  "type": "uint32"},
    "order_no":    {"offset": 4,  "type": "uint64"},
    "side":        {"offset": 12, "type": "char", "map": {"1":"B","2":"S"}},
    "price":       {"offset": 13, "type": "int64", "scale": 10000},
    "qty":         {"offset": 21, "type": "int64"},
    "order_type":  {"offset": 29, "type": "char"},
    "timestamp":   {"offset": 30, "type": "uint64", "unit": "ns"}
  }
}

三、案例/场景:逐笔与快照的交叉验证

假设某股票在10:00:00.000收到快照,买一价为10.50、量为5000。随后逐笔委托显示一笔卖单以10.50成交2000,逐笔成交确认该笔成交。此时重建订单簿的买一量应变为3000。若下一张快照仍显示买一量5000,则说明存在未处理的撤单或数据丢失。

常见场景还包括:集合竞价阶段的逐笔委托与连续竞价字段含义不同;科创板/创业板的价格笼子机制会产生特殊订单类型;港股市场的暗盘与碎股交易需要单独通道。这些场景都要求字段说明必须与交易所版本严格对应。

建议在重建订单簿时,同时维护“委托队列”和“成交队列”,并用快照做周期性快照对齐,可显著降低序号跳变带来的累积误差。

四、常见字段说明与对比清单

下表汇总了五类数据中最常见的字段及其含义,便于快速对照不同交易所接口:

数据类别 常见字段 含义说明 注意事项
逐笔委托 OrderNo、Side、Price、Qty、OrderType、Timestamp 订单进入撮合系统的事件 OrderType区分市价/限价/本方最优
逐笔成交 TradeNo、BidOrderNo、AskOrderNo、Price、Qty、Timestamp 撮合成交事件 成交方向由主动方决定
快照行情 BidPrice1、BidQty1、AskPrice1、AskQty1、Volume、Turnover 固定频率切片状态 注意快照时间与本地时间差
订单簿深度 BidPrice[1..N]、BidQty[1..N]、AskPrice[1..N]、AskQty[1..N] 多档买卖盘结构 档位数量因交易所而异
交易所接口 Channel、SeqNo、MsgType、Body、Checksum 报文封装与传输规范 序号连续性用于丢包检测
误区:把逐笔成交的“成交方向”直接当作订单方向。实际上成交方向是主动方方向,而订单方向是委托方向,二者在撤单和改单场景下可能不一致。复盘时应以订单号回溯原始委托。

另一个常见误区是忽略时间戳单位。部分交易所使用纳秒,部分使用毫秒,若未统一,重建出的订单簿时序会出现错乱。建议在解析层强制转换为统一微秒时间轴,并保留原始时间戳字段备查。

最后,交易所接口版本更新频繁,字段偏移和编码可能随版本变化。工程上应把字段映射配置化,并建立版本对照表,避免硬编码导致的解析失败。只有把数据分类、字段语义和接口规范三者对齐,后续的逐笔回放与订单簿重建才能稳定可靠。