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 行情中三种核心数据结构之间的逻辑关系与数据流向:

Level2 行情数据结构关系图 Level2 行情数据结构关系图 交易所撮合引擎 逐笔成交数据 时间·价格·量·方向 十档行情快照 买一~买十·卖一~卖十 委托队列明细 买一/卖一委托列表 资金流向分析 市场深度评估 订单簿微观结构 收益模拟与策略回测引擎

3.6 数据解析注意事项

  • 时间同步:逐笔成交与十档行情的时间戳来自不同数据流,回测前需对齐到统一的时间轴,避免时序错乱。
  • 去重处理:逐笔成交数据可能因网络重传出现重复记录,需按成交编号去重。
  • 队列快照 vs 增量:委托队列通常以增量方式推送(新增/撤销),回测时需维护本地订单簿状态,不能直接使用快照覆盖。
  • 数据压缩:Level2 原始数据体积较大(单只股票每日可达数百 MB),建议使用 Parquet 或 HDF5 格式存储,并做必要的字段裁剪。
推荐实践:在收益模拟课程中,建议先使用逐笔成交数据构建基础交易流水,再叠加十档行情计算滑点,最后用委托队列数据验证订单簿的瞬时冲击成本。这种分层解析方式能有效降低回测复杂度。