3. 因子数据源管理:数据源接入、数据清洗、数据质量校验、数据存储策略
聊到因子库,很多人第一反应是「策略怎么写」。但我做了这么多年,发现真正让团队翻车的,往往是数据源这块。数据源管不好,后面所有工作都是空中楼阁。今天我就把这块的实战经验掰开揉碎讲清楚。
3.1 数据源接入:别让脏数据进门
数据源接入,说白了就是决定「让哪些数据进到我们的系统里」。我见过太多团队,上来就接十几个数据源,结果一半是垃圾。
接入前必须问三个问题:
- 数据频率够用吗? 做高频策略,日频数据就是废纸。
- 数据覆盖度如何? 沪深300全了,但中证1000缺一半,这因子你敢用?
- 数据延迟多少? 实时策略用T+1数据,等于闭着眼开车。
我个人习惯的做法: 先接一个核心数据源(比如Wind或聚宽),跑通全流程。稳定了再考虑接入第二个做交叉验证。别贪多,嚼不烂。
接入方式上,我一般分三类:
- API直连: 适合实时数据,但要注意限流和重连机制。我曾经被某数据商的API坑过,高峰期直接断连,导致策略空跑半小时。
- 文件导入: CSV、Excel、Parquet都行。适合历史数据批量导入。记得做文件校验,别让格式错误的数据混进来。
- 数据库同步: 从公司内部数据库拉数据。注意权限和同步频率,别把生产库拖垮了。
3.2 数据清洗:把脏数据洗干净
数据清洗,是量化里最枯燥但最重要的一环。你想想看,因子计算再牛,输入的是垃圾,输出还是垃圾。
常见的脏数据问题:
- 缺失值: 某天某只股票停牌,价格字段是空的。
- 异常值: 收盘价突然跳涨100倍,明显是除权除息没处理。
- 重复值: 同一时间戳出现两条相同记录。
- 格式错误: 日期字段混了「2024-01-01」和「2024/01/01」两种格式。
避坑指南: 我曾经接手过一个项目,前同事把停牌日的收盘价填成了0。结果计算收益率时,出现了无穷大的值,整个因子序列直接废了。所以清洗时,一定要做「业务合理性校验」。
清洗流程我一般这样走:
- 格式统一: 日期、数值、字符串全部标准化。
- 去重: 按「股票代码+时间戳」去重,保留最新一条。
- 缺失值处理: 前向填充、插值、或者直接删除。具体用哪种,看因子特性。
- 异常值检测: 用3σ原则或IQR方法,把明显离谱的值揪出来。
# 一个简单的清洗示例(Python伪代码)
def clean_data(df):
# 1. 格式统一
df['date'] = pd.to_datetime(df['date'])
# 2. 去重
df = df.drop_duplicates(subset=['code', 'date'])
# 3. 缺失值前向填充
df = df.fillna(method='ffill')
# 4. 异常值处理(3σ)
mean = df['close'].mean()
std = df['close'].std()
df = df[(df['close'] > mean - 3*std) & (df['close'] < mean + 3*std)]
return df
3.3 数据质量校验:给数据上保险
数据清洗完了,不代表就万事大吉。我习惯再加一道「质量校验」的关卡。说白了,就是自动化检查数据有没有问题。
校验维度:
| 校验类型 | 检查内容 | 常见问题 |
|---|---|---|
| 完整性 | 数据条数是否达标?时间戳是否连续? | 某天数据缺失,导致因子计算中断 |
| 准确性 | 数值是否在合理范围内? | 股价为负、市盈率超过10000 |
| 一致性 | 不同数据源之间是否匹配? | Wind和聚宽的同一天收盘价差1% |
| 时效性 | 数据是否及时更新? | 今天的数据昨天就来了(穿越了) |
注意: 质量校验不能只做一次。我建议每天跑批前自动执行一遍,发现问题立刻告警。别等到因子跑完了才发现数据有问题,那损失就大了。
校验通过后,我会生成一份「数据质量报告」,记录每天的校验结果。这样出了问题,可以快速回溯是哪一天的数据出了问题。
3.4 数据存储策略:存得好,才能用得爽
数据存哪里、怎么存,直接影响后续的因子计算效率。我见过有人把所有数据塞进一个CSV文件里,结果每次读取都要等半天。
存储方案对比:
| 存储方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| CSV/Parquet | 小规模、历史数据 | 简单、易读 | 查询慢、不支持并发 |
| 关系型数据库(MySQL/PostgreSQL) | 中小规模、需要复杂查询 | 支持SQL、事务 | 写入慢、扩展性一般 |
| 时序数据库(InfluxDB/ClickHouse) | 大规模、高频数据 | 写入快、查询快 | 学习成本高 |
| 分布式存储(HDFS/对象存储) | 超大规模、冷数据 | 扩展性好、成本低 | 延迟高 |
我的推荐方案:
- 热数据(近30天): 用ClickHouse,查询快,支持实时写入。
- 温数据(近1年): 用Parquet文件,按日期分区存储,读取效率高。
- 冷数据(1年以上): 压缩后存对象存储(如S3),成本低,偶尔回溯用。
一个小技巧: 数据存储时,一定要按「股票代码+日期」做分区。这样查询某只股票的历史数据时,不用全表扫描,速度能快10倍以上。
嗯,数据源管理这块,说白了就是「进、洗、验、存」四个步骤。每一步都做到位,后面的因子计算才能稳。我见过太多团队在前面偷懒,结果后面花十倍的时间来擦屁股。所以,别嫌麻烦,把基础打牢了。