高频行情数据基础:Tick级数据、Level2行情、数据频率与存储格式
高频行情是量化风控哨兵系统的“第一滴血”。在坏账率 PSI 监控中,数据颗粒度越细,漂移发现越早。本章从 Tick 级数据出发,厘清 Level2 行情结构、数据频率层级与存储选型,为后续 PSI 计算打下坚实的数据基础。
2.1 Tick级数据:最小时间切片
Tick 是交易所对外发布的最小行情快照单元。在 A 股市场,每笔 Tick 包含以下核心字段:
| 字段 | 含义 | 示例值 |
|---|---|---|
| Time | 交易所撮合时间(毫秒级) | 09:30:01.250 |
| LastPrice | 最新成交价 | 15.68 |
| Volume | 当前 Tick 成交量(股) | 1200 |
| Turnover | 当前 Tick 成交额(元) | 18816.00 |
| BidPrice1 / AskPrice1 | 买一 / 卖一价 | 15.67 / 15.69 |
| BidVol1 / AskVol1 | 买一 / 卖一挂单量 | 5800 / 3200 |
风控视角: Tick 级数据能捕捉到毫秒级的流动性突变。例如,买一挂单量在 3 个 Tick 内从 5000 股骤降至 200 股,往往是机构撤单或大单出逃的前兆,PSI 哨兵应在此刻触发高频漂移预警。
2.2 Level2 行情:从快照到逐笔
Level2 行情相比基础 Level1 增加了逐笔成交、逐笔委托和十档盘口。以下是两者的关键差异:
| 维度 | Level1(基础行情) | Level2(深度行情) |
|---|---|---|
| 快照频率 | 3 秒一次 | 3 秒一次(含更多档位) |
| 盘口深度 | 5 档买卖 | 10 档买卖 |
| 逐笔成交 | 无 | 有(每笔成交明细) |
| 逐笔委托 | 无 | 有(委托进入与撤单) |
| 总买卖队列 | 无 | 有(前 50 笔挂单明细) |
逐笔成交数据是 PSI 计算中“真实成交分布”的最佳来源。通过逐笔数据,可以精确统计每个价格区间的成交量占比,而非依赖快照插值。
实战要点: Level2 逐笔委托中的“撤单”行为是坏账率先行指标。如果某只股票在连续 10 个 Tick 内撤单量超过委托量的 60%,说明市场参与者对该价格区间缺乏共识,PSI 漂移概率显著上升。
2.3 数据频率层级与选择策略
高频行情数据按时间粒度可分为四个层级,不同风控场景应选择不同频率:
- Tick 级(毫秒级) — 用于逐笔成交分析、微观结构建模、瞬时流动性监测。数据量最大,单只股票日均约 4000~8000 条 Tick。
- 秒级(1s / 3s) — 用于高频因子计算、快照对齐。Level2 快照默认 3 秒一次,适合计算短期波动率。
- 分钟级(1min / 5min) — 用于 PSI 常规监控、坏账率日间对比。平衡精度与存储成本。
- 日级 — 用于回测、归因分析、报表输出。数据量最小,但无法捕捉日内漂移。
避坑提示: 不要对所有股票统一使用 Tick 级数据。对于日均成交额低于 5000 万元的冷门股,Tick 级数据稀疏且噪声大,建议降采样至 1 分钟频率后再计算 PSI,否则会因零值过多导致指标失真。
2.4 存储格式选型:速度与压缩的平衡
高频行情数据具有“写多读少、时序性强、单条体积小”的特点。以下是三种主流存储格式的对比:
| 格式 | 压缩比 | 写入速度 | 查询性能(时间范围) | 适用场景 |
|---|---|---|---|---|
| Parquet | 高(5~10x) | 中等 | 快(列式剪枝) | 离线批处理、日级回测 |
| Arrow IPC | 低(1~2x) | 极快 | 极快(内存零拷贝) | 实时流计算、Tick 级缓存 |
| CSV | 无 | 慢 | 慢(全表扫描) | 仅用于调试或小样本导出 |
在哨兵系统中,推荐采用 分层存储策略:
- 热层(近 7 天):使用 Arrow IPC 格式,内存映射文件,支持毫秒级查询。
- 温层(7~90 天):使用 Parquet 格式,按日期分区,配合列式存储加速 PSI 计算。
- 冷层(90 天以上):使用 Parquet + Zstd 压缩,归档至对象存储,保留原始 Tick 数据用于重算。
# 示例:使用 PyArrow 将 Tick 数据写入 IPC 格式(热层)
import pyarrow as pa
import pyarrow.ipc as ipc
table = pa.table({
"time": ["09:30:01.250", "09:30:01.350"],
"last_price": [15.68, 15.69],
"volume": [1200, 800],
"bid_vol1": [5800, 5600],
"ask_vol1": [3200, 3100]
})
with ipc.new_file("tick_hot_20250220.arrow", table.schema) as writer:
writer.write_table(table)
2.5 高频行情数据流架构
下图展示了从交易所到 PSI 哨兵计算引擎的完整数据流,重点标注了 Tick 级数据的采集、缓存与降采样路径:
2.6 数据质量校验:Tick 级 PSI 的前置条件
在将高频行情送入 PSI 计算之前,必须通过以下质量检查,否则计算结果毫无意义:
| 检查项 | 阈值 | 处理方式 |
|---|---|---|
| Tick 时间戳单调递增 | 不允许回退 | 丢弃乱序 Tick 并记录日志 |
| LastPrice 非负且非零 | 价格 > 0 | 标记为脏数据,不参与 PSI 统计 |
| Volume 非负 | 成交量 ≥ 0 | 负值直接置零并告警 |
| BidPrice1 ≤ AskPrice1 | 必须成立 | 若违反,取前一个有效 Tick 的价差插值 |
| 日间 Tick 数量范围 | [1000, 20000] | 超出范围说明数据源异常,触发人工核查 |
哨兵最佳实践: 在 Tick 数据入库阶段即嵌入质量校验逻辑,使用 Apache Arrow 的
filter 和 take 操作快速剔除脏数据,避免 PSI 计算时重复清洗。建议将校验结果写入单独的监控表,用于评估数据源健康度。