数据准备基础:数据源选择、清洗对齐与存储方案

做量化因子挖掘,有一件事我特别想强调——数据是地基。地基没打好,后面盖的楼再漂亮也得塌。我自己刚入行那会儿,就吃过数据不对齐的亏,回测曲线漂亮得不行,实盘一跑直接崩。嗯,今天咱们就把数据准备这块彻底聊透。

数据源选择:行情、财务、另类

数据源的选择,说白了就是决定你「看什么」来挖因子。我个人习惯把数据源分成三大类:

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股票的数据就不完整。

我的做法是:

  1. 统一时间戳:把所有数据都对齐到同一个时间频率(比如日线就对齐到收盘时间)
  2. 统一标的池:确保所有因子计算时,用的股票列表是一致的
  3. 处理停牌:停牌期间的数据要特殊标记,不能直接填充

小技巧:我习惯在数据对齐后,做一个「数据完整性检查」。比如检查某只股票在回测期间是否有超过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开销。

知识体系结构图

下面这张图,是我自己梳理的数据准备全流程。你可以把它当作一个检查清单:

数据准备全流程 行情数据 财务数据 另类数据 数据清洗 缺失值处理 → 异常值检测 → 复权处理 → 去重 数据对齐 统一时间戳 → 统一标的池 → 停牌处理 HDF5 Parquet

这张图把整个数据准备流程串起来了。从数据源选择,到清洗、对齐,再到存储。每一步都环环相扣。我个人建议你把这个流程做成自动化脚本,每次拿到新数据就跑一遍,省时省力还不出错。

我的经验:数据准备阶段花的时间,通常占整个因子挖掘项目的60%以上。别嫌麻烦,这一步做得越扎实,后面挖因子的效率就越高。我曾经因为偷懒没做数据对齐,结果花了三天时间排查一个因子失效的原因,最后发现是数据时间戳差了1秒。嗯,从那以后我再也不敢跳过数据对齐了。

专注资料整理