3. Level2 行情数据结构解析
Level2 行情数据相比传统 Level1 行情,提供了更细粒度的逐笔成交、十档买卖盘口以及委托队列信息。理解这三种核心数据结构,是进行高频策略回测与收益模拟的基础。本章将逐一解析其字段含义、组织方式与典型应用场景。
3.1 逐笔成交数据结构
逐笔成交数据记录每一笔实际发生的交易,而非 Level1 的分钟或秒级统计快照。它直接反映了市场资金的真实博弈过程。
| 字段名称 | 数据类型 | 说明 |
|---|---|---|
| 交易时间 | int64 (毫秒级) | 交易所撮合时间戳,精确到毫秒,如 093025001 表示 9:30:25.001 |
| 成交价格 | float64 | 该笔交易的撮合价格,单位为元 |
| 成交量 | int64 | 该笔交易的成交股数(手数 × 100) |
| 买卖方向 | int8 | 主动成交方向:1=主动买(外盘),2=主动卖(内盘),0=未知 |
| 成交编号 | int64 | 交易所生成的唯一成交流水号,用于去重与排序 |
关键应用:通过逐笔成交数据可以计算真实的资金流向(主动买 vs 主动卖),识别大单拆单行为,以及构建 Tick 级交易模拟器。
# 逐笔成交数据示例(Python 伪代码)
trade_records = [
{"time": 93025001, "price": 10.25, "volume": 1000, "direction": 1, "id": 100001},
{"time": 93025002, "price": 10.26, "volume": 200, "direction": 2, "id": 100002},
{"time": 93025005, "price": 10.25, "volume": 500, "direction": 1, "id": 100003},
]
3.2 十档行情数据结构
十档行情展示了买卖双方在十个最优价位上的挂单情况,比 Level1 的五档数据提供了更深的流动性视图。
| 字段组 | 字段列表 | 说明 |
|---|---|---|
| 买盘(Bid) | 买一价、买一量 … 买十价、买十量 | 从最高买入价(买一)到第十高买入价(买十),价格递减 |
| 卖盘(Ask) | 卖一价、卖一量 … 卖十价、卖十量 | 从最低卖出价(卖一)到第十低卖出价(卖十),价格递增 |
| 快照时间 | timestamp | 该帧快照的生成时间,通常每 3 秒或每笔变动推送一次 |
实战提示:十档数据中的“价差分布”可用于衡量市场深度。例如,买一至买五的总量远大于卖一至卖五,通常表明下方支撑较强。
# 十档行情快照示例
snapshot = {
"time": 93030000,
"bid_prices": [10.25, 10.24, 10.23, 10.22, 10.21, 10.20, 10.19, 10.18, 10.17, 10.16],
"bid_volumes": [1500, 2300, 800, 1200, 600, 400, 300, 200, 100, 50],
"ask_prices": [10.26, 10.27, 10.28, 10.29, 10.30, 10.31, 10.32, 10.33, 10.34, 10.35],
"ask_volumes": [1800, 1100, 900, 700, 500, 300, 200, 100, 80, 40],
}
3.3 委托队列数据结构
委托队列(Order Book Queue)展示了买一或卖一价位上等待成交的订单明细,包括每个委托单的委托量、委托时间与订单编号。这是 Level2 数据中最微观的订单簿信息。
| 字段名称 | 数据类型 | 说明 |
|---|---|---|
| 价位 | float64 | 当前队列所属的价位(买一或卖一) |
| 委托方向 | int8 | 1=买方队列,2=卖方队列 |
| 委托明细 | list[dict] | 每个元素包含:委托量、委托时间、订单编号(可选) |
| 队列总笔数 | int32 | 当前价位上未成交的委托单数量 |
| 队列总量 | int64 | 当前价位上所有委托单的累计股数 |
注意:委托队列数据量极大,通常只在行情剧烈波动或大单出现时推送。在回测中,建议仅对关键价位(如买一/卖一)的队列变化进行采样,避免数据膨胀。
# 委托队列示例(买一价位)
order_queue = {
"price": 10.25,
"side": 1, # 买方
"total_orders": 5,
"total_volume": 1500,
"details": [
{"volume": 500, "time": 93025001, "order_id": "A001"},
{"volume": 300, "time": 93025002, "order_id": "A002"},
{"volume": 400, "time": 93025003, "order_id": "A003"},
{"volume": 200, "time": 93025004, "order_id": "A004"},
{"volume": 100, "time": 93025005, "order_id": "A005"},
]
}
3.4 三种数据结构的关系与对比
| 维度 | 逐笔成交 | 十档行情 | 委托队列 |
|---|---|---|---|
| 数据粒度 | 单笔交易 | 价位快照 | 单笔委托 |
| 更新频率 | 每笔成交触发 | 每 3 秒或每笔变动 | 仅买一/卖一变动时 |
| 核心用途 | 资金流向、大单识别 | 市场深度、价差分析 | 订单簿微观结构、冰山订单检测 |
| 数据量级 | 高(每日数万笔) | 中(每日数千帧) | 极高(每日数十万条明细) |
综合应用:在收益模拟中,通常使用逐笔成交数据驱动交易执行,用十档行情数据评估滑点成本,用委托队列数据判断瞬时流动性。三者结合可以构建接近真实交易所环境的回测引擎。
3.5 数据结构关系图
下图展示了 Level2 行情中三种核心数据结构之间的逻辑关系与数据流向:
3.6 数据解析注意事项
- 时间同步:逐笔成交与十档行情的时间戳来自不同数据流,回测前需对齐到统一的时间轴,避免时序错乱。
- 去重处理:逐笔成交数据可能因网络重传出现重复记录,需按成交编号去重。
- 队列快照 vs 增量:委托队列通常以增量方式推送(新增/撤销),回测时需维护本地订单簿状态,不能直接使用快照覆盖。
- 数据压缩:Level2 原始数据体积较大(单只股票每日可达数百 MB),建议使用 Parquet 或 HDF5 格式存储,并做必要的字段裁剪。
推荐实践:在收益模拟课程中,建议先使用逐笔成交数据构建基础交易流水,再叠加十档行情计算滑点,最后用委托队列数据验证订单簿的瞬时冲击成本。这种分层解析方式能有效降低回测复杂度。