3. 数据基础与预处理:行情数据(OHLCV)、财务数据、另类数据、数据清洗与对齐、幸存者偏差

做量化研究这么多年,我越来越觉得一个道理:因子研究,七分在数据,三分在模型。你想想看,再漂亮的数学公式,喂进去一堆垃圾数据,出来的结果能看吗?

这一章,我们就来聊聊数据的那些事儿。说白了,就是搞清楚我们手头到底有什么牌可以打,以及怎么把这些牌洗好、对齐,别让「幸存者偏差」这种坑给埋了。

3.1 行情数据(OHLCV)—— 最基础的「心跳」

OHLCV 是每个量化人的老朋友了。Open(开盘价)、High(最高价)、Low(最低价)、Close(收盘价)、Volume(成交量)。这五个字段,构成了我们分析市场最原始的素材。

我个人习惯,拿到一份行情数据,第一件事不是算因子,而是先看一眼数据质量。比如,有没有出现 High < Low 这种荒唐事?我曾在项目中遇到过某家数据商提供的期货数据,连续三天最高价低于最低价,一问才知道是数据解析时字段搞反了。嗯,这种低级错误,人工检查一遍就能发现。

另外,要注意复权问题。股票有除权除息,不复权的价格序列会出现跳空缺口,那算出来的收益率就失真了。我建议做因子研究时,统一使用后复权价格,这样能保持历史收益率的连续性。

核心要点: 拿到 OHLCV 数据后,先做三件事——检查极值合理性、确认复权方式、处理缺失值。

3.2 财务数据 —— 基本面因子的「血肉」

财务数据是构建基本面因子的基础。市盈率、市净率、ROE、营收增长率……这些指标都来自财报。但这里有个大坑:财报的发布时间和报告期是两码事

举个例子,一家公司2024年一季报,可能在4月底才发布。如果你在3月份就用了一季报的数据来做因子,那就是「未来函数」,属于严重的偷跑行为。我曾经见过一个实习生,回测业绩好得离谱,一查才发现他用了未来数据,整个策略都是假的。

所以,处理财务数据时,一定要做时间对齐。我通常的做法是:建立一个「财报发布日期」的数据库,确保在回测时,只有已经发布的财报数据才能被使用。

数据类型 常见字段 注意事项
资产负债表 总资产、总负债、股东权益 注意季度间的可比性
利润表 营业收入、净利润、扣非净利润 关注季节性因素
现金流量表 经营活动现金流、投资活动现金流 警惕「纸面富贵」

3.3 另类数据 —— 超额收益的「金矿」

当大家都在用同样的行情和财务数据时,超额收益从哪来?答案往往是另类数据

什么是另类数据?说白了,就是传统行情和财报之外的数据。比如:

  • 舆情数据:新闻标题、社交媒体讨论、股吧帖子
  • 产业链数据:上游原材料价格、下游出货量、物流数据
  • 卫星数据:停车场车辆数、农田面积、港口集装箱数量
  • 支付数据:线下消费频次、电商平台销售额

我记得有一次,为了验证一个基于「电商评论情感」的因子,我们团队爬了整整三个月的用户评论数据。清洗、分词、打标签,折腾下来发现,这个因子在消费类股票上确实有不错的预测能力。但代价也很大——数据采购成本高、处理流程复杂。

我的建议: 刚开始做因子研究,不要一上来就搞另类数据。先把传统数据吃透,再考虑用另类数据做「锦上添花」。否则,数据还没处理明白,精力先耗光了。

3.4 数据清洗与对齐 —— 磨刀不误砍柴工

数据清洗,听起来很枯燥,但这是最见功力的地方。我见过太多人,因子公式写得漂亮,结果因为数据没洗干净,回测曲线全是假的。

常见的清洗步骤包括:

  1. 去重:同一只股票在同一天出现多条记录,保留一条即可。
  2. 处理缺失值:是填充(比如用前值填充)还是删除?要看具体情况。我个人习惯,对于停牌导致的缺失,用前值填充;对于数据源本身缺失,直接删除。
  3. 异常值处理:比如某只股票一天涨了100倍,明显是数据错误。可以用中位数去极值,或者直接剔除。
  4. 时间对齐:不同数据源的频率可能不同。行情数据是日频,财务数据是季频,另类数据可能是周频。怎么对齐?我通常的做法是:以交易日为基准,将低频数据向前填充到每个交易日。
# 一个简单的数据对齐示例(伪代码)
# 假设 df_price 是日频行情数据,df_financial 是季频财务数据
# 将财务数据向前填充到每个交易日
df_aligned = df_price.join(df_financial, how='left')
df_aligned = df_aligned.fillna(method='ffill')  # 前向填充
避坑指南: 我曾经犯过一个错误——在数据对齐时,用了「后向填充」。结果呢?把未来的财务数据填充到了过去,回测效果当然好,但实盘一塌糊涂。记住:永远不要用未来信息填充过去的数据

3.5 幸存者偏差 —— 量化研究的「隐形杀手」

幸存者偏差,这个词在量化圈里提得很多,但真正重视的人不多。说白了,就是你的回测样本里,只包含了现在还活着的股票,那些退市、被ST的股票都被剔除了。这样一来,你的回测结果会系统性偏高

为什么会这样?你想想看,那些退市的股票,往往都是表现很差的。如果你把它们排除在外,你的样本里就只剩下「幸存者」,回测的收益率自然好看。

怎么避免?我个人的做法是:

  • 使用全样本数据:包括已经退市的、被并购的、ST的股票。
  • 构建「上市状态」标签:在回测时,只交易那些正常上市的股票,但数据要保留所有历史记录。
  • 定期检查样本构成:看看你的股票池里,有没有大量「新上市」的股票?如果有,要小心,因为新上市股票往往有「新股效应」,表现可能异常。
一句话总结: 幸存者偏差会让你的回测曲线看起来很美,但实盘时你会发现,那些「消失的股票」才是真正的风险来源。

3.6 本章知识体系总览

为了让你更直观地理解本章的知识结构,我画了一张图。这张图展示了从原始数据到可用因子数据的完整流程,以及每个环节需要注意的关键点。

数据基础与预处理:知识体系总览 行情数据 (OHLCV) 财务数据 另类数据 数据清洗与对齐 去重 → 缺失值处理 → 异常值处理 → 时间对齐 ⚠ 幸存者偏差处理 保留退市/ST股票 · 构建上市状态标签 · 避免新股效应 ✅ 可用因子数据 数据质量决定因子质量,预处理环节不可跳过

这张图清晰地展示了从三个数据源出发,经过清洗对齐、幸存者偏差处理,最终得到可用因子数据的完整链路。每一步都马虎不得。


好了,关于数据基础与预处理,我们就聊到这里。记住一句话:数据是量化研究的基石,基石不稳,大厦将倾。下一章,我们会深入探讨因子构建的具体方法,到时候见。

蓝海数据掘金营,专注资料整理