数据准备基础:数据源选择、清洗对齐与存储方案
做量化因子挖掘,有一件事我特别想强调——数据是地基。地基没打好,后面盖的楼再漂亮也得塌。我自己刚入行那会儿,就吃过数据不对齐的亏,回测曲线漂亮得不行,实盘一跑直接崩。嗯,今天咱们就把数据准备这块彻底聊透。
数据源选择:行情、财务、另类
数据源的选择,说白了就是决定你「看什么」来挖因子。我个人习惯把数据源分成三大类:
1. 行情数据
这是最基础、最常用的数据。包括:
- 日线数据:开盘价、收盘价、最高价、最低价、成交量、成交额
- 分钟线数据:1分钟、5分钟、30分钟等,用于高频因子
- 盘口数据:买卖五档、逐笔成交,这个数据量很大
行情数据来源很多,Wind、聚宽、Tushare、RiceQuant都有。我建议你至少备两个数据源做交叉验证。为什么?因为我在项目中遇到过某数据源某天的收盘价算错了小数点,要不是我习惯做校验,那个因子就废了。
2. 财务数据
财务数据是基本面因子的命根子。主要包括:
- 三大报表:资产负债表、利润表、现金流量表
- 财务指标:ROE、ROA、毛利率、净利率等
- 估值数据:PE、PB、PS、股息率等
这里有个坑——财务数据的发布时点。你想想看,年报截止日是4月30日,但很多公司3月就发了。如果你直接用年报数据,等于用了未来信息。我习惯的做法是:建立一个「实际可用日期」字段,确保因子计算时只用到了当时已公开的数据。
3. 另类数据
这是近几年越来越火的方向。包括:
- 舆情数据:新闻情感分析、社交媒体热度
- 产业链数据:上下游价格、库存、开工率
- 卫星数据:停车场车辆数、农田面积变化
- 电商数据:销量、价格、评价
另类数据的特点是:非结构化、频率不固定、质量参差不齐。我建议刚开始做因子挖掘的朋友,先把行情和财务数据玩透,再碰另类数据。不然很容易陷入「数据很多但因子不赚钱」的窘境。
核心原则:数据源选择要遵循「够用就好」原则。不是数据越多越好,而是你能驾驭的数据才是好数据。
数据清洗与对齐
数据拿到手,第一件事不是算因子,而是清洗。我见过太多人跳过这步直接开干,结果因子里全是噪音。
数据清洗的常见问题
| 问题类型 | 表现 | 处理方法 |
|---|---|---|
| 缺失值 | 某天某只股票没有数据 | 向前填充、插值、或直接剔除 |
| 异常值 | 价格突然涨了100倍 | 用中位数绝对偏差(MAD)检测 |
| 重复值 | 同一时间戳出现多条记录 | 去重,保留最后一条 |
| 停牌数据 | 股票停牌期间价格不变 | 标记停牌状态,计算因子时跳过 |
我曾经遇到过一个案例:某只股票因为分红除权,价格从100元直接跳到80元。如果没做复权处理,算出来的动量因子全是错的。所以,复权处理是清洗环节的重中之重。
数据对齐:时间与标的
数据对齐是量化里最容易被忽视的环节。你想想看,如果A股票的交易时间是9:30-15:00,B股票是9:00-15:30,那你在15:00这个时间点算因子,B股票的数据就不完整。
我的做法是:
- 统一时间戳:把所有数据都对齐到同一个时间频率(比如日线就对齐到收盘时间)
- 统一标的池:确保所有因子计算时,用的股票列表是一致的
- 处理停牌:停牌期间的数据要特殊标记,不能直接填充
小技巧:我习惯在数据对齐后,做一个「数据完整性检查」。比如检查某只股票在回测期间是否有超过10%的交易日缺失数据。如果有,直接剔除这只股票,省得后面出幺蛾子。
数据存储方案:HDF5 vs Parquet
数据清洗好了,接下来就是存起来。存储方案的选择直接影响你的计算效率。目前主流方案就两个:HDF5和Parquet。
HDF5
HDF5是Hierarchical Data Format的缩写,说白了就是一种能存大量数据的文件格式。它的特点:
- 支持分层结构:可以像文件夹一样组织数据
- 读取速度快:特别是按列读取时
- 压缩率高:能省不少磁盘空间
我早期做因子挖掘时,一直用HDF5。它的Python接口pandas.HDFStore用起来很顺手。但后来发现一个问题——并发读写容易出冲突。如果你有多个进程同时写同一个HDF5文件,很容易崩溃。
Parquet
Parquet是后来兴起的列式存储格式。它的优势:
- 列式存储:读取某几列数据时,速度极快
- 支持并发:多个进程同时读写没问题
- 跨平台:Spark、Pandas、Dask都能直接读
我现在的主力存储方案就是Parquet。特别是当数据量超过100GB时,Parquet的优势非常明显。
两种方案的对比
| 特性 | HDF5 | Parquet |
|---|---|---|
| 读取速度(单列) | 快 | 极快 |
| 写入速度 | 快 | 中等 |
| 并发支持 | 差 | 好 |
| 压缩率 | 高 | 高 |
| 跨平台 | 一般 | 好 |
注意:不要把所有数据都塞到一个文件里。我建议按「日期」或「股票代码」做分区存储。比如每天一个Parquet文件,或者每只股票一个文件。这样查询时能大幅减少IO开销。
知识体系结构图
下面这张图,是我自己梳理的数据准备全流程。你可以把它当作一个检查清单:
这张图把整个数据准备流程串起来了。从数据源选择,到清洗、对齐,再到存储。每一步都环环相扣。我个人建议你把这个流程做成自动化脚本,每次拿到新数据就跑一遍,省时省力还不出错。
我的经验:数据准备阶段花的时间,通常占整个因子挖掘项目的60%以上。别嫌麻烦,这一步做得越扎实,后面挖因子的效率就越高。我曾经因为偷懒没做数据对齐,结果花了三天时间排查一个因子失效的原因,最后发现是数据时间戳差了1秒。嗯,从那以后我再也不敢跳过数据对齐了。