3. 数据基础与预处理:行情数据(OHLCV)、财务数据、另类数据、数据清洗与对齐、幸存者偏差
做量化研究这么多年,我越来越觉得一个道理:因子研究,七分在数据,三分在模型。你想想看,再漂亮的数学公式,喂进去一堆垃圾数据,出来的结果能看吗?
这一章,我们就来聊聊数据的那些事儿。说白了,就是搞清楚我们手头到底有什么牌可以打,以及怎么把这些牌洗好、对齐,别让「幸存者偏差」这种坑给埋了。
3.1 行情数据(OHLCV)—— 最基础的「心跳」
OHLCV 是每个量化人的老朋友了。Open(开盘价)、High(最高价)、Low(最低价)、Close(收盘价)、Volume(成交量)。这五个字段,构成了我们分析市场最原始的素材。
我个人习惯,拿到一份行情数据,第一件事不是算因子,而是先看一眼数据质量。比如,有没有出现 High < Low 这种荒唐事?我曾在项目中遇到过某家数据商提供的期货数据,连续三天最高价低于最低价,一问才知道是数据解析时字段搞反了。嗯,这种低级错误,人工检查一遍就能发现。
另外,要注意复权问题。股票有除权除息,不复权的价格序列会出现跳空缺口,那算出来的收益率就失真了。我建议做因子研究时,统一使用后复权价格,这样能保持历史收益率的连续性。
3.2 财务数据 —— 基本面因子的「血肉」
财务数据是构建基本面因子的基础。市盈率、市净率、ROE、营收增长率……这些指标都来自财报。但这里有个大坑:财报的发布时间和报告期是两码事。
举个例子,一家公司2024年一季报,可能在4月底才发布。如果你在3月份就用了一季报的数据来做因子,那就是「未来函数」,属于严重的偷跑行为。我曾经见过一个实习生,回测业绩好得离谱,一查才发现他用了未来数据,整个策略都是假的。
所以,处理财务数据时,一定要做时间对齐。我通常的做法是:建立一个「财报发布日期」的数据库,确保在回测时,只有已经发布的财报数据才能被使用。
| 数据类型 | 常见字段 | 注意事项 |
|---|---|---|
| 资产负债表 | 总资产、总负债、股东权益 | 注意季度间的可比性 |
| 利润表 | 营业收入、净利润、扣非净利润 | 关注季节性因素 |
| 现金流量表 | 经营活动现金流、投资活动现金流 | 警惕「纸面富贵」 |
3.3 另类数据 —— 超额收益的「金矿」
当大家都在用同样的行情和财务数据时,超额收益从哪来?答案往往是另类数据。
什么是另类数据?说白了,就是传统行情和财报之外的数据。比如:
- 舆情数据:新闻标题、社交媒体讨论、股吧帖子
- 产业链数据:上游原材料价格、下游出货量、物流数据
- 卫星数据:停车场车辆数、农田面积、港口集装箱数量
- 支付数据:线下消费频次、电商平台销售额
我记得有一次,为了验证一个基于「电商评论情感」的因子,我们团队爬了整整三个月的用户评论数据。清洗、分词、打标签,折腾下来发现,这个因子在消费类股票上确实有不错的预测能力。但代价也很大——数据采购成本高、处理流程复杂。
3.4 数据清洗与对齐 —— 磨刀不误砍柴工
数据清洗,听起来很枯燥,但这是最见功力的地方。我见过太多人,因子公式写得漂亮,结果因为数据没洗干净,回测曲线全是假的。
常见的清洗步骤包括:
- 去重:同一只股票在同一天出现多条记录,保留一条即可。
- 处理缺失值:是填充(比如用前值填充)还是删除?要看具体情况。我个人习惯,对于停牌导致的缺失,用前值填充;对于数据源本身缺失,直接删除。
- 异常值处理:比如某只股票一天涨了100倍,明显是数据错误。可以用中位数去极值,或者直接剔除。
- 时间对齐:不同数据源的频率可能不同。行情数据是日频,财务数据是季频,另类数据可能是周频。怎么对齐?我通常的做法是:以交易日为基准,将低频数据向前填充到每个交易日。
# 一个简单的数据对齐示例(伪代码)
# 假设 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 本章知识体系总览
为了让你更直观地理解本章的知识结构,我画了一张图。这张图展示了从原始数据到可用因子数据的完整流程,以及每个环节需要注意的关键点。
这张图清晰地展示了从三个数据源出发,经过清洗对齐、幸存者偏差处理,最终得到可用因子数据的完整链路。每一步都马虎不得。
好了,关于数据基础与预处理,我们就聊到这里。记住一句话:数据是量化研究的基石,基石不稳,大厦将倾。下一章,我们会深入探讨因子构建的具体方法,到时候见。