数据基础设施:数据源分类、清洗对齐与存储架构
做量化研究,说白了就是跟数据打交道。我入行那会儿,最头疼的不是策略逻辑,而是数据本身——数据脏、数据乱、数据对不上。你想想看,因子算得再漂亮,底层数据是错的,那结果就是垃圾进垃圾出。
今天咱们聊聊数据基础设施。这部分我踩过不少坑,希望能帮你少走弯路。
一、数据源分类:行情、财务、另类
数据源分三类,我习惯这么划分:
- 行情数据:价格、成交量、盘口数据。这是最基础的,也是频率最高的。
- 财务数据:财报、资产负债表、利润表。频率低,但信息量大。
- 另类数据:舆情、卫星图像、供应链数据。这几年越来越火。
举个例子。我在做高频因子时,行情数据用的是Tick级数据,一天下来一个股票就有几万条记录。而财务数据呢,一个季度才更新一次。这两种数据的时间粒度完全不同,对齐起来特别麻烦。
核心要点:不同数据源的时间频率差异,是后续数据对齐的难点。
二、数据清洗与对齐:最磨人的环节
数据清洗,说白了就是去脏。我遇到过的情况:
- 缺失值:某天某只股票没有交易,价格字段是空的
- 异常值:价格突然跳空,或者成交量异常放大
- 重复值:同一时间戳出现多条记录
- 格式不一致:日期格式有的是"2024-01-01",有的是"20240101"
数据对齐更麻烦。行情数据是连续时间序列,财务数据是离散时间点。怎么对齐?
我常用的方法:
- 时间戳标准化:统一转为UTC时间,精确到毫秒
- 前向填充:财务数据用最新一期数据填充到下一期发布前
- 插值处理:对于行情数据中的短时间缺失,用线性插值
- 去极值:用MAD(中位数绝对偏差)方法剔除异常值
避坑指南:我曾经在财务数据对齐上吃过亏。某只股票财报发布日,我直接用发布日期作为数据日期,结果发现因子信号滞后了整整一天。后来改成用财报截止日期,问题才解决。
三、数据库选型:HDF5、Parquet、ClickHouse
选数据库,得看你的数据规模和查询场景。我整理了一张对比表:
| 特性 | HDF5 | Parquet | ClickHouse |
|---|---|---|---|
| 存储格式 | 二进制 | 列式 | 列式 |
| 读写速度 | 读快写慢 | 读写均衡 | 读极快 |
| 压缩率 | 中等 | 高 | 高 |
| 并发支持 | 单线程 | 多线程 | 分布式 |
| 适用场景 | 单机研究 | 数据交换 | 在线查询 |
我个人习惯:
- 研究阶段:用HDF5。简单、轻量,适合单机跑回测
- 数据交换:用Parquet。压缩率高,跨平台兼容性好
- 生产环境:用ClickHouse。查询速度快,支持高并发
注意:HDF5不支持并发写入。如果你有多个进程同时写数据,会出问题。我当年就因为这个,回测结果时好时坏,排查了两天才找到原因。
四、数据存储架构设计
架构设计,核心是分层。我常用的架构:
这个架构的好处是:每一层独立,互不干扰。原始数据出了问题,重新清洗就行,不影响因子计算。
具体实现上,我建议:
- 原始数据:用Parquet存储,按日期分区
- 清洗数据:用ClickHouse,方便快速查询
- 因子数据:用HDF5,研究阶段用着顺手
个人经验:我习惯在清洗层加一个数据质量监控模块。每天跑完清洗后,自动检查数据完整性、异常值比例。一旦发现问题,立刻报警。这个习惯帮我避免了好几次数据事故。
嗯,数据基础设施这块,说白了就是打好地基。地基不稳,上面盖的楼再漂亮也没用。你想想看,因子库再大,数据不对齐,算出来的因子值你敢用吗?
我见过不少团队,策略逻辑写得天花乱坠,结果数据层一塌糊涂。最后回测收益曲线漂亮得很,实盘一跑就崩。原因很简单——数据没对齐,过拟合了。
所以,花时间把数据基础设施搭好,绝对值。