2、高频行情数据源解析:Level-2 行情快照、逐笔成交、逐笔委托的数据结构、字段含义与典型数据样例
高频行情是量化交易的“原油”。沪深交易所推出的 Level-2 行情数据,相比传统 Level-1 行情,提供了更细粒度、更丰富的信息维度。本章将深入解析三种核心 Level-2 数据源:行情快照、逐笔成交与逐笔委托,涵盖其数据结构、关键字段含义及典型数据样例,为后续 Spark 处理打下坚实基础。
前置认知:Level-2 行情通常通过行情 SDK(如中证指数、万得、恒生等)以二进制流或结构化文件形式推送。本章以最通用的 CSV/Parquet 列式存储结构为例进行讲解,实际生产环境中需根据具体接口做字段映射。
2.1 Level-2 行情快照(Snapshot)
行情快照是交易所每隔固定时间(通常为 3 秒)发布的“截面”数据,反映了某一时刻的盘口状态。它包含十档买卖盘口、逐笔加权均价、成交总量等核心指标。
2.1.1 数据结构与字段含义
| 字段名 | 类型 | 含义说明 |
|---|---|---|
ts_code |
string | 股票代码(如 600519.SH) |
trade_date |
int | 交易日期(YYYYMMDD) |
update_time |
string | 快照时间戳(HHMMSSsss,精确到毫秒) |
pre_close |
double | 昨收价 |
open |
double | 今开盘价 |
high |
double | 截至快照时刻的最高价 |
low |
double | 截至快照时刻的最低价 |
last_price |
double | 最新成交价(快照时刻) |
volume |
long | 累计成交量(股) |
amount |
double | 累计成交金额(元) |
bid_prices |
array<double> | 十档买价(从买一到买十) |
bid_volumes |
array<long> | 十档买量(对应买价的手数) |
ask_prices |
array<double> | 十档卖价(从卖一到卖十) |
ask_volumes |
array<long> | 十档卖量(对应卖价的手数) |
2.1.2 典型数据样例
ts_code,trade_date,update_time,pre_close,open,high,low,last_price,volume,amount,bid_prices,bid_volumes,ask_prices,ask_volumes
600519.SH,20250320,093000000,1800.00,1805.00,1810.00,1798.00,1808.00,1250000,2256000000.00,"[1807.00,1806.00,1805.00,1804.00,1803.00,1802.00,1801.00,1800.00,1799.00,1798.00]","[100,200,150,80,60,40,30,20,10,5]","[1808.00,1809.00,1810.00,1811.00,1812.00,1813.00,1814.00,1815.00,1816.00,1817.00]","[80,120,90,50,30,20,15,10,5,2]"
关键洞察:快照数据是计算“买卖压力指标”(如买卖盘口深度差、加权平均价差)的基础。在 Spark 中,通常将
bid_prices 和 ask_prices 等数组字段展开为多行,以便进行逐档分析。
2.2 逐笔成交(Tick Trade)
逐笔成交记录每一笔实际发生的交易,是市场微观结构的“原子”事件。它包含成交价格、成交量、成交方向(主动买/主动卖)以及成交编号等关键信息。
2.2.1 数据结构与字段含义
| 字段名 | 类型 | 含义说明 |
|---|---|---|
ts_code |
string | 股票代码 |
trade_date |
int | 交易日期 |
trade_time |
string | 成交时间(精确到毫秒) |
trade_id |
long | 交易所生成的唯一成交编号 |
price |
double | 成交价格 |
volume |
long | 成交量(股) |
buy_order_id |
long | 买方委托编号(用于关联委托) |
sell_order_id |
long | 卖方委托编号 |
trade_flag |
string | 成交方向标志:'B' 主动买,'S' 主动卖,'N' 未知 |
2.2.2 典型数据样例
ts_code,trade_date,trade_time,trade_id,price,volume,buy_order_id,sell_order_id,trade_flag
600519.SH,20250320,093000123,1000001,1808.00,100,200001,300001,B
600519.SH,20250320,093000456,1000002,1807.50,200,200002,300002,S
600519.SH,20250320,093000789,1000003,1808.00,50,200003,300003,B
注意事项:逐笔成交的
trade_flag 字段在不同交易所或数据源中定义可能不同。上交所 Level-2 通常以 'B'/'S' 区分主动买卖;深交所则可能用 '1'/'2' 表示。在 Spark 清洗阶段,务必进行标准化映射。
2.3 逐笔委托(Tick Order)
逐笔委托记录每一笔进入交易所撮合主机的订单,包括订单的提交、撤单、部分成交等状态变化。它是还原市场订单流、计算订单不平衡度的核心数据。
2.3.1 数据结构与字段含义
| 字段名 | 类型 | 含义说明 |
|---|---|---|
ts_code |
string | 股票代码 |
trade_date |
int | 交易日期 |
order_time |
string | 委托时间(精确到毫秒) |
order_id |
long | 交易所委托编号 |
price |
double | 委托价格 |
volume |
long | 委托数量(股) |
side |
string | 买卖方向:'1' 买,'2' 卖 |
order_type |
string | 订单类型:'1' 限价单,'2' 市价单,'3' 撤单 |
order_status |
string | 订单状态:'0' 新单,'1' 部分成交,'2' 完全成交,'3' 已撤单 |
2.3.2 典型数据样例
ts_code,trade_date,order_time,order_id,price,volume,side,order_type,order_status
600519.SH,20250320,093000000,200001,1808.00,500,1,1,0
600519.SH,20250320,093000100,300001,1807.50,300,2,1,0
600519.SH,20250320,093000120,200001,1808.00,500,1,1,2
600519.SH,20250320,093000200,300002,1807.00,200,2,1,0
实战要点:逐笔委托数据量极大,单只股票一天可能产生数十万条记录。在 Spark 中,通常按
ts_code 和 trade_date 进行分区,并利用 order_id 与逐笔成交进行关联,以还原完整的“订单→成交”链路。
2.4 三种数据源对比总结
| 维度 | 行情快照 | 逐笔成交 | 逐笔委托 |
|---|---|---|---|
| 数据粒度 | 3 秒截面 | 每笔交易 | 每笔订单 |
| 数据量级 | 低(约 2400 条/股/天) | 中(约 1-5 万条/股/天) | 高(约 5-20 万条/股/天) |
| 核心用途 | 盘口深度、价差分析 | 主动买卖方向、成交量分布 | 订单流不平衡、撤单率 |
| Spark 处理难点 | 数组字段展开 | 时间序列对齐 | 大规模数据 Join |
| 典型因子示例 | 买卖盘口压力差 | 主动买入占比 | 订单流不平衡指标 |