共计 1798 个字符,预计需要花费 5 分钟才能阅读完成。
基础概念对比
先看两种行情的主要区别(以 2023 年沪深交易所协议为基准):

| 特性 | Level1(五档行情) | Level2(十档行情 + 逐笔) |
|---|---|---|
| 更新频率 | 3 秒 / 次快照 | 实时逐笔更新 |
| 买卖档位 | 前 5 档买卖报价 | 前 10 档买卖报价 +50 档委托队列 |
| 关键字段 | LastPrice/Volume/Turnover | BizIndex/OrderKind/OrderVolume |
| 数据完整性 | 仅含快照数据 | 包含委托明细 + 成交明细 |
| 典型应用 | 行情展示 | 高频策略 / 订单簿分析 |
特别提醒:L2 的 OrderKind 字段(0- 买撤 1- 买增 2- 卖撤 3- 卖增)是分析资金流向的关键。
数据合成实战
逐笔数据转 1 分钟 K 线
核心步骤是通过 pandas 的 resample 方法聚合数据,但需特别注意:
- 处理乱序数据:先用
sort_values('BizIndex')按交易所时序编号排序 - 过滤异常值:交易所可能推送测试数据(如 Price=0)
import pandas as pd
import numpy as np
def ticks_to_1min(ticks_df):
# 基础清洗
valid_ticks = ticks_df[(ticks_df['Price'] > 0) &
(ticks_df['Volume'] > 0)
].copy()
# 按交易所时序编号排序(防乱序)valid_ticks.sort_values('BizIndex', inplace=True)
# 聚合逻辑
klines = valid_ticks.resample('1T', on='TradeTime').agg({'Price': ['first', 'max', 'min', 'last'],
'Volume': 'sum',
'Turnover': 'sum'
})
# 处理可能的空时间段(填充前值)return klines.ffill()
处理丢包问题
建议在合成前先检查连续性(特别是 09:25 集合竞价后的首分钟):
def check_missing(ticks_df):
time_gaps = ticks_df['TradeTime'].diff() > pd.Timedelta('2s')
if time_gaps.any():
print(f'警告:发现 {time_gaps.sum()} 处数据间隔 >2 秒')
# 可在此添加数据源切换或报警逻辑
性能优化技巧
内存管理
当处理全市场 L2 数据(约 20GB/ 日)时:
- 使用
dtype优化: - 将
Price字段设为float32(足够表示股票价格精度) -
Volume字段用uint32(最大可表示 42 亿股) -
分块处理方案(Dask 示例):
import dask.dataframe as dd
def process_large_file(path):
ddf = dd.read_parquet(
path,
columns=['Symbol', 'TradeTime', 'Price', 'Volume'],
dtype={'Price': 'float32', 'Volume': 'uint32'}
)
# 按股票代码分组处理
return ddf.groupby('Symbol').apply(
ticks_to_1min,
meta={'Open': 'f8', 'High': 'f8', 'Low': 'f8', 'Close': 'f8'}
).compute()
常见陷阱与应对
错误场景 1:用 L1 数据回测高频策略
- 现象:策略在 3 秒间隔内重复交易
- 解决 :必须使用 L2 的逐笔成交数据(
TradeType=0普通成交)
错误场景 2:忽略协议版本
- 案例 :2025 年上交所将调整
OrderKind的枚举值定义 - 应对:动态加载交易所协议文档(每年 6 月更新)
错误场景 3:错误合成 K 线
- 典型错误:直接用最后成交价作为收盘价(应取时间段内最后一笔)
- 正确做法 :使用
resample+last而非groupby+last
2025 新规影响
根据已披露的《证券期货业数据规范(2025 征求意见稿》):
- 新增
TradeSession字段区分集合竞价 / 连续交易时段 OrderKind将扩展为 8 种状态(新增大宗交易标识)- 深市 L2 数据延迟从 500ms 降至 300ms
延伸思考
验证跨交易所时序一致性的方法:
- 选取同一股票在沪深两市的关联交易(如 ETF 套利)
- 比较
BizIndex的增长规律(各交易所独立编号) - 通过 NTP 服务器时间校准交易所时钟差异
实际开发中,建议在数据接入层就添加交易所时区标记(SH/SZ 的 ExchangeTime 字段)
正文完
