数据基础设施:数据源分类、清洗对齐与存储架构

做量化研究,说白了就是跟数据打交道。我入行那会儿,最头疼的不是策略逻辑,而是数据本身——数据脏、数据乱、数据对不上。你想想看,因子算得再漂亮,底层数据是错的,那结果就是垃圾进垃圾出。

今天咱们聊聊数据基础设施。这部分我踩过不少坑,希望能帮你少走弯路。

一、数据源分类:行情、财务、另类

数据源分三类,我习惯这么划分:

  • 行情数据:价格、成交量、盘口数据。这是最基础的,也是频率最高的。
  • 财务数据:财报、资产负债表、利润表。频率低,但信息量大。
  • 另类数据:舆情、卫星图像、供应链数据。这几年越来越火。

举个例子。我在做高频因子时,行情数据用的是Tick级数据,一天下来一个股票就有几万条记录。而财务数据呢,一个季度才更新一次。这两种数据的时间粒度完全不同,对齐起来特别麻烦。

核心要点:不同数据源的时间频率差异,是后续数据对齐的难点。

二、数据清洗与对齐:最磨人的环节

数据清洗,说白了就是去脏。我遇到过的情况:

  • 缺失值:某天某只股票没有交易,价格字段是空的
  • 异常值:价格突然跳空,或者成交量异常放大
  • 重复值:同一时间戳出现多条记录
  • 格式不一致:日期格式有的是"2024-01-01",有的是"20240101"

数据对齐更麻烦。行情数据是连续时间序列,财务数据是离散时间点。怎么对齐?

我常用的方法:

  1. 时间戳标准化:统一转为UTC时间,精确到毫秒
  2. 前向填充:财务数据用最新一期数据填充到下一期发布前
  3. 插值处理:对于行情数据中的短时间缺失,用线性插值
  4. 去极值:用MAD(中位数绝对偏差)方法剔除异常值

避坑指南:我曾经在财务数据对齐上吃过亏。某只股票财报发布日,我直接用发布日期作为数据日期,结果发现因子信号滞后了整整一天。后来改成用财报截止日期,问题才解决。

三、数据库选型:HDF5、Parquet、ClickHouse

选数据库,得看你的数据规模和查询场景。我整理了一张对比表:

特性 HDF5 Parquet ClickHouse
存储格式 二进制 列式 列式
读写速度 读快写慢 读写均衡 读极快
压缩率 中等
并发支持 单线程 多线程 分布式
适用场景 单机研究 数据交换 在线查询

我个人习惯:

  • 研究阶段:用HDF5。简单、轻量,适合单机跑回测
  • 数据交换:用Parquet。压缩率高,跨平台兼容性好
  • 生产环境:用ClickHouse。查询速度快,支持高并发

注意:HDF5不支持并发写入。如果你有多个进程同时写数据,会出问题。我当年就因为这个,回测结果时好时坏,排查了两天才找到原因。

四、数据存储架构设计

架构设计,核心是分层。我常用的架构:

数据存储架构分层设计 原始数据层 (Raw Data) 行情Tick / 日线 / 财务数据 / 另类数据 数据清洗层 (Cleaned Data) 去重 / 去极值 / 填充缺失 / 时间对齐 因子数据层 (Factor Data) 计算后的因子值 / 标准化 / 中性化 应用层:回测 / 实盘 / 监控

这个架构的好处是:每一层独立,互不干扰。原始数据出了问题,重新清洗就行,不影响因子计算。

具体实现上,我建议:

  • 原始数据:用Parquet存储,按日期分区
  • 清洗数据:用ClickHouse,方便快速查询
  • 因子数据:用HDF5,研究阶段用着顺手

个人经验:我习惯在清洗层加一个数据质量监控模块。每天跑完清洗后,自动检查数据完整性、异常值比例。一旦发现问题,立刻报警。这个习惯帮我避免了好几次数据事故。

嗯,数据基础设施这块,说白了就是打好地基。地基不稳,上面盖的楼再漂亮也没用。你想想看,因子库再大,数据不对齐,算出来的因子值你敢用吗?

我见过不少团队,策略逻辑写得天花乱坠,结果数据层一塌糊涂。最后回测收益曲线漂亮得很,实盘一跑就崩。原因很简单——数据没对齐,过拟合了。

所以,花时间把数据基础设施搭好,绝对值。

专注资料整理