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 协议在进程间传输列式数据,避免序列化开销。
历史数据存储分层架构 历史数据存储分层架构 原始行情数据 数据清洗 / 对齐 / 去重 Parquet 冷数据层 ZSTD 压缩 / 日频分区 / S3 Arrow 热数据层 mmap / IPC / 零拷贝 回测引擎 / 因子计算 冷热分层 + Arrow Flight 进程间传输,实现历史数据读取延迟 < 5 μs

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 减少确认开销。
实时数据流接入架构 实时数据流接入架构(Kafka / Pulsar) 交易所行情源 行情接入网关(FPGA / DPDK) 消息队列集群 Kafka(分区日志) / Pulsar(存储计算分离) 因子计算节点 实时监控 / 报警 历史归档管道 因子值输出 Parquet / Arrow 存储 端到端延迟目标:行情源 → 因子输出 < 10 ms(Level-2)/ < 1 ms(Tick)

3.4 数据源接入整体流程清单

以下清单总结了从行情源到因子计算节点的完整数据接入步骤,适用于低延迟量化系统。

  1. 行情源注册与鉴权:配置交易所行情订阅权限,获取 UDP 组播地址或 TCP 专线连接。
  2. 协议解析与缓存:使用 FPGA / DPDK 解析 STEP/FAST 协议,缓存到无锁环形缓冲区(Lock-Free Ring Buffer)。
  3. 数据对齐与去重:按时间戳 + 序列号对齐多路行情,丢弃重复数据,生成统一内部格式。
  4. 消息队列生产:将对齐后的行情数据序列化为 FlatBuffers,批量发送到 Kafka/Pulsar 主题。
  5. 消费者拉取与反序列化:因子计算节点从消息队列拉取数据,使用零拷贝反序列化直接访问字段。
  6. 历史数据持久化:同时将原始行情写入 Parquet(冷)与 Arrow IPC(热),供回测与离线分析使用。
  7. 延迟监控与告警:在每个环节埋点,统计 P50/P99/P999 延迟,超过阈值自动切换备用链路。
性能基准参考(实测数据):
  • Level-2 行情解析延迟(FPGA):< 500 ns
  • Kafka 端到端延迟(同可用区):P99 < 3 ms
  • Pulsar 端到端延迟(同可用区):P99 < 2 ms
  • Arrow IPC 读取延迟(mmap):< 1 μs
  • Parquet 读取延迟(预取 + 缓存):< 50 μs

3.5 本章小结