4. 因子存储架构:列式存储、时序数据库与分层策略
在量化因子库与低延迟评分系统中,存储架构直接决定了因子数据的写入吞吐、查询响应速度以及历史回测的效率。本章深入剖析三种核心存储方案——列式存储(Parquet/Arrow)、时序数据库(InfluxDB/ClickHouse)以及分层存储策略,帮助你在不同场景下做出最优选型。
4.1 列式存储:Parquet 与 Arrow
列式存储是量化因子库的基石。与传统行式存储(如 CSV、MySQL InnoDB)不同,列式存储将同一列的数据连续存放,极大提升了分析型查询的 I/O 效率。
| 特性 | Parquet | Arrow |
|---|---|---|
| 存储格式 | 磁盘持久化,高压缩比 | 内存列式,零拷贝 |
| 适用场景 | 历史因子库、批量回测 | 实时计算、进程间共享 |
| 压缩算法 | Snappy / Zstd / Gzip | 无(内存原生) |
| Schema 演进 | 支持(追加列) | 需预定义 |
| 读取速度 | 中等(需解压) | 极快(内存映射) |
实战建议:使用 Parquet 存储日频、周频的历史因子快照,压缩比可达 5:1~10:1;使用 Arrow 作为日内高频因子的内存交换格式,避免序列化开销。
4.2 时序数据库:InfluxDB 与 ClickHouse
当因子数据带有明确的时间戳标签,且需要频繁进行时间窗口聚合(如过去 5 分钟的平均波动率)时,时序数据库(TSDB)是比通用列式存储更优的选择。
4.2.1 InfluxDB:轻量级时序引擎
- 数据模型:measurement + tag(维度)+ field(指标)+ timestamp。
- 写入性能:单机每秒可处理数十万点,适合边缘节点或小规模因子流。
- 查询语言:Flux(功能强但学习曲线陡)或 InfluxQL。
- 局限:分布式能力较弱,大规模集群需企业版。
4.2.2 ClickHouse:分析型列式数据库
- 数据模型:MergeTree 家族引擎,按时间分区 + 主键排序。
- 写入性能:批量写入极佳(建议每批 ≥ 1000 行),支持实时插入。
- 查询性能:秒级聚合百亿行,适合因子回测与监控看板。
- 特色功能:物化视图、TTL 自动过期、跳数索引。
| 对比维度 | InfluxDB | ClickHouse |
|---|---|---|
| 写入模式 | 单点实时写入 | 批量写入为主 |
| 压缩比 | 中等(约 3:1) | 高(约 6:1~10:1) |
| SQL 兼容 | 部分(Flux 非标准) | 类 SQL(MySQL 协议) |
| 典型延迟 | 毫秒级(单点) | 亚秒级(聚合查询) |
| 运维复杂度 | 低 | 中高 |
避坑提示:不要将 InfluxDB 用于跨多标的复杂 Join 查询;ClickHouse 不适合高频单行写入(每次写入都会生成新 part,导致合并压力)。
4.3 分层存储策略
单一存储方案无法同时满足“低延迟写入”、“高压缩历史存储”和“实时聚合查询”三个目标。分层存储策略将因子数据按时间热度和访问模式划分为三层,每层使用最合适的存储引擎。
4.4 分层策略实施要点
- 数据写入路径:日内因子先写入热层(Arrow/Redis),同时异步复制到温层(ClickHouse);每日收盘后,温层数据批量压缩为 Parquet 并移至冷层。
- 查询路由:评分系统根据查询时间范围自动选择存储层——实时查询走热层,近 30 天查询走温层,历史回测走冷层。
- TTL 与归档:ClickHouse 使用
TTL event_time + INTERVAL 30 DAY TO DISK 'cold'自动迁移;冷层 Parquet 文件按日期分区,配合 Hive 分区表或 Presto 查询。 - 一致性保证:温层作为权威数据源,热层数据丢失可从温层重放恢复。
性能基准参考:某私募实盘案例中,采用 Arrow(热层)+ ClickHouse(温层)+ Parquet(冷层)三层架构后,因子查询 P99 延迟从 850ms 降至 12ms,历史回测数据加载速度提升 40 倍。
4.5 选型决策矩阵
| 需求场景 | 推荐方案 | 理由 |
|---|---|---|
| 日内高频因子(Tick 级) | Arrow + Redis Streams | 纳秒级序列化,内存管道 |
| 日频因子回测(5 年+) | Parquet + Presto/Spark | 高压缩,列式扫描,成本低 |
| 实时监控看板(秒级刷新) | ClickHouse 物化视图 | 亚秒级聚合,SQL 生态 |
| 边缘节点轻量部署 | InfluxDB OSS | 单机运维简单,写入快 |
| 全链路统一存储 | 分层策略(三层) | 兼顾实时、近线和历史 |
在实际构建因子库时,建议从“温层 + 冷层”起步(ClickHouse + Parquet),待延迟敏感度提升后再引入热层 Arrow。分层不是过度设计,而是量化系统从“能用”走向“高性能”的必经之路。