2. 高频行情数据基础:Tick级数据、快照数据、逐笔成交与逐笔委托的数据结构
高频行情数据是量化交易系统最底层的“燃料”。不同数据类型的结构、精度与更新频率,直接决定了策略计算的上限与回测的可靠性。本章将逐一拆解四种核心行情数据结构的字段定义、存储规范与工程落地要点。
2.1 数据结构总览与对比
下表从数据粒度、触发机制、典型字段数量与主要用途四个维度,对四种高频行情数据类型进行横向对比:
| 数据类型 | 数据粒度 | 触发机制 | 典型字段数 | 主要用途 |
|---|---|---|---|---|
| Tick级数据 | 逐笔驱动 | 每笔成交或委托簿变化 | 8–12 | 实时行情推送、盘口监控 |
| 快照数据 | 定时切片 | 固定间隔(如 500ms / 1s) | 20–40 | 策略回测、盘口重建 |
| 逐笔成交 | 单笔成交 | 每笔撮合完成 | 6–10 | 真实成交分析、订单流计算 |
| 逐笔委托 | 单笔订单 | 每笔委托进入/撤单 | 8–14 | 订单簿重建、微观结构研究 |
工程提示: 在实盘生产环境中,Tick 级数据与逐笔委托的数据量通常相差 1–2 个数量级。设计存储系统时,必须按数据类型分别规划写入吞吐量与压缩策略。
2.2 Tick级数据
Tick 级数据是交易所推送的最小行情单元,通常包含最新成交价、成交量、买卖盘口前五档等核心信息。其结构紧凑,更新频率可达毫秒级。
2.2.1 核心字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
ticker |
string | 合约代码,如 "600519.SH" |
timestamp |
int64 | 交易所时间戳,纳秒精度 |
last_price |
float64 | 最新成交价 |
volume |
int64 | 当日累计成交量 |
turnover |
float64 | 当日累计成交额 |
bid_price[5] |
float64[5] | 买盘前五档价格 |
ask_price[5] |
float64[5] | 卖盘前五档价格 |
bid_volume[5] |
int64[5] | 买盘前五档数量 |
ask_volume[5] |
int64[5] | 卖盘前五档数量 |
2.2.2 典型数据样例
{
"ticker": "600519.SH",
"timestamp": 1698765432123456789,
"last_price": 1782.50,
"volume": 1234567,
"turnover": 2198765432.10,
"bid_price": [1782.50, 1782.40, 1782.30, 1782.20, 1782.10],
"ask_price": [1782.60, 1782.70, 1782.80, 1782.90, 1783.00],
"bid_volume": [100, 200, 150, 80, 60],
"ask_volume": [120, 180, 90, 70, 50]
}
2.3 快照数据
快照数据是交易所或行情服务商按固定时间间隔(如 500ms、1s)生成的“全量盘口”切片。它包含完整的买卖盘口深度、当日统计信息,是回测系统中最常用的数据源。
2.3.1 核心字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
ticker |
string | 合约代码 |
snap_time |
int64 | 快照生成时间戳 |
bid_depth[10] |
float64[10] | 买盘前十档价格 |
ask_depth[10] |
float64[10] | 卖盘前十档价格 |
bid_depth_vol[10] |
int64[10] | 买盘前十档数量 |
ask_depth_vol[10] |
int64[10] | 卖盘前十档数量 |
open_interest |
int64 | 持仓量(期货/期权) |
pre_close |
float64 | 前收盘价 |
high_limit |
float64 | 涨停价 |
low_limit |
float64 | 跌停价 |
数据治理警告: 不同交易所的快照间隔不一致(上交所 3s,深交所 1s,中金所 500ms)。跨市场回测时,必须对快照时间戳做对齐处理,否则会引入时序偏差。
2.4 逐笔成交
逐笔成交数据记录每一笔撮合交易的详细信息,是分析真实资金流向、识别大单拆单行为的关键数据源。
2.4.1 核心字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
ticker |
string | 合约代码 |
trade_id |
int64 | 成交编号(全局唯一) |
trade_time |
int64 | 成交时间戳 |
price |
float64 | 成交价格 |
volume |
int64 | 成交量(股/手) |
buy_order_id |
int64 | 买方委托编号 |
sell_order_id |
int64 | 卖方委托编号 |
trade_flag |
int8 | 成交方向标志(0: 中性, 1: 主动买, 2: 主动卖) |
2.4.2 数据样例
{
"ticker": "IF2312",
"trade_id": 987654321,
"trade_time": 1698765432123457000,
"price": 3980.20,
"volume": 5,
"buy_order_id": 100001,
"sell_order_id": 100002,
"trade_flag": 1
}
2.5 逐笔委托
逐笔委托数据记录每一笔订单的进入、修改与撤单行为。它是重建完整订单簿、研究市场微观结构的基础。
2.5.1 核心字段定义
| 字段名 | 类型 | 说明 |
|---|---|---|
ticker |
string | 合约代码 |
order_id |
int64 | 委托编号 |
order_time |
int64 | 委托时间戳 |
order_type |
int8 | 委托类型(0: 限价, 1: 市价, 2: 撤单) |
direction |
int8 | 买卖方向(1: 买, 2: 卖) |
price |
float64 | 委托价格 |
volume |
int64 | 委托数量 |
status |
int8 | 状态(0: 有效, 1: 部分成交, 2: 全部成交, 3: 已撤单) |
2.6 数据结构关系图
下图展示了四种高频行情数据在交易系统中的生成顺序与关联关系:
2.7 数据治理要点
- 时间戳对齐: 不同数据源的时间戳精度可能不同(纳秒 vs 微秒 vs 毫秒),必须统一转换为同一精度后再做关联分析。
- 去重与校验: 逐笔成交与逐笔委托的 ID 应全局唯一,重复数据需在入库前过滤;快照数据需校验买卖盘口价格是否单调。
- 存储压缩: 高频行情数据量极大,建议对价格字段使用 delta 编码,对数量字段使用 varint 编码,可压缩 60%–80%。
- 回放一致性: 回测系统必须保证逐笔委托与逐笔成交的时间顺序与实盘一致,否则订单簿重建会出错。
实战建议: 在搭建高频行情数据库时,建议将 Tick 级数据与快照数据分别存储于不同的时序表,逐笔成交与逐笔委托则使用列式存储(如 Parquet)以提升查询性能。