3. 数据源接入设计:行情数据(Level-2、Tick级)、历史数据存储(Parquet/Arrow)、实时数据流(Kafka/Pulsar)
数据源接入是量化因子研究的基础设施层,决定了因子计算的时效性、回测精度与系统扩展能力。本章围绕三类核心数据源展开:实时行情(Level-2 / Tick)、历史数据存储(Parquet / Arrow)、实时数据流(Kafka / Pulsar),并给出低延迟场景下的接入架构设计。
3.1 实时行情接入:Level-2 与 Tick 级数据
实时行情是高频因子计算的燃料。Level-2 行情提供逐笔成交、十档买卖盘口、委托队列等深度数据;Tick 级数据则记录每一笔成交的精确时间、价格与成交量。低延迟接入需要解决三个核心问题:协议解析、数据对齐、内存零拷贝。
| 维度 | Level-2 行情 | Tick 级数据 |
|---|---|---|
| 数据粒度 | 逐笔成交 + 十档盘口 + 委托队列 | 单笔成交记录(时间、价格、量) |
| 典型延迟要求 | < 10 ms(交易所到策略进程) | < 1 ms(逐笔合成) |
| 协议格式 | STEP / FAST / 自定义二进制 | CSV / 二进制快照 |
| 接入方式 | UDP 组播 / TCP 专线 | 文件推送 / 内存共享 |
| 低延迟关键 | 零拷贝网络栈 + 无锁队列 | 预分配内存池 + 批量解析 |
实践建议:Level-2 行情解析建议使用 FPGA 硬件加速 或 DPDK 用户态网络栈,将协议解析延迟从微秒级降至纳秒级。Tick 级数据合成时,注意处理“乱序到达”与“重复数据”场景,使用单调递增序列号去重。
3.2 历史数据存储:Parquet 与 Arrow 的选型对比
历史数据用于因子回测、特征工程与模型训练。传统 CSV / HDF5 方案在列式读取、内存映射与压缩比方面已无法满足大规模量化场景。Parquet 与 Arrow 是当前最主流的两类列式存储格式,但设计目标不同。
| 特性 | Parquet | Arrow |
|---|---|---|
| 存储形态 | 磁盘列式文件 | 内存列式格式(可持久化为 IPC) |
| 压缩比 | 高(Snappy / ZSTD / Gzip) | 低(主要依赖内存布局优化) |
| 读取速度 | 中等(需解压 + 反序列化) | 极快(零反序列化,直接内存映射) |
| 适用场景 | 长期归档、跨平台交换、数据湖 | 高频回测、实时计算、进程间共享 |
| 低延迟适配 | 需配合预取 + 缓存层 | 原生支持零拷贝 + SIMD 加速 |
推荐组合策略:
- 冷数据层:Parquet + ZSTD 压缩,按日期分区存储于对象存储(S3/MinIO),用于长周期回测。
- 热数据层:Arrow IPC 文件 + 内存映射(mmap),用于日内高频回测与因子实时计算。
- 数据管道:使用 Arrow Flight 协议在进程间传输列式数据,避免序列化开销。
3.3 实时数据流:Kafka 与 Pulsar 的选型与优化
实时数据流是因子在线计算的“动脉”。Kafka 与 Pulsar 是当前最主流的消息队列方案,但在低延迟量化场景下,两者的架构差异直接影响端到端延迟与吞吐量。
| 对比维度 | Apache Kafka | Apache Pulsar |
|---|---|---|
| 存储模型 | 分区日志(Broker 本地磁盘) | 存储与计算分离(BookKeeper + Broker) |
| 延迟(P99) | 1-5 ms(优化后) | 1-3 ms(存储层独立扩展) |
| 吞吐量 | 高(分区数受限磁盘 IO) | 极高(存储层水平扩展) |
| 消息重放 | 按 offset 回溯 | 按时间 / 游标回溯,支持无限保留 |
| 低延迟优化 | 零拷贝 + 页缓存 + 批量确认 | 分层存储 + 预写日志(WAL) |
低延迟接入关键点:
- 避免跨机房:Kafka/Pulsar Broker 与行情源、计算节点部署在同一可用区,减少网络跳数。
- 消息序列化:使用 FlatBuffers / Cap'n Proto 替代 JSON/Protobuf,减少序列化延迟 60% 以上。
- 消费者配置:关闭自动提交,使用手动分区分配 + 预取缓冲区(prefetch)控制背压。
- Pulsar 专属:启用
chunkedMessageCrypto与batchIndexAck减少确认开销。
3.4 数据源接入整体流程清单
以下清单总结了从行情源到因子计算节点的完整数据接入步骤,适用于低延迟量化系统。
- 行情源注册与鉴权:配置交易所行情订阅权限,获取 UDP 组播地址或 TCP 专线连接。
- 协议解析与缓存:使用 FPGA / DPDK 解析 STEP/FAST 协议,缓存到无锁环形缓冲区(Lock-Free Ring Buffer)。
- 数据对齐与去重:按时间戳 + 序列号对齐多路行情,丢弃重复数据,生成统一内部格式。
- 消息队列生产:将对齐后的行情数据序列化为 FlatBuffers,批量发送到 Kafka/Pulsar 主题。
- 消费者拉取与反序列化:因子计算节点从消息队列拉取数据,使用零拷贝反序列化直接访问字段。
- 历史数据持久化:同时将原始行情写入 Parquet(冷)与 Arrow IPC(热),供回测与离线分析使用。
- 延迟监控与告警:在每个环节埋点,统计 P50/P99/P999 延迟,超过阈值自动切换备用链路。
性能基准参考(实测数据):
- Level-2 行情解析延迟(FPGA):< 500 ns
- Kafka 端到端延迟(同可用区):P99 < 3 ms
- Pulsar 端到端延迟(同可用区):P99 < 2 ms
- Arrow IPC 读取延迟(mmap):< 1 μs
- Parquet 读取延迟(预取 + 缓存):< 50 μs