2. 因子失效的根源:数据陷阱与幸存者偏差
做量化研究这么多年,我见过太多漂亮的回测曲线,一到实盘就崩。说实话,十有八九的问题都出在数据上。数据陷阱和幸存者偏差,这两个坑我踩过不止一次。今天咱们就好好聊聊,这些因子失效的根源到底在哪。
2.1 幸存者偏差:你看到的只是活下来的
幸存者偏差这个概念,最早来自二战时期的一个经典案例。当时军方研究返航飞机上的弹孔分布,想加强防护。统计学家指出一个致命问题——你们只看到了返航的飞机,那些被打中要害坠毁的,根本没机会被统计。
放到量化里,道理一模一样。我刚开始做因子研究时,用的是一份「干净」的股票数据库。回测结果漂亮得不像话,年化收益30%+,夏普比3.0。我当时还挺得意,觉得发现了圣杯。
结果呢?实盘跑了一个月,亏了8%。
后来我才发现,那个数据库只保留了当前还在上市的公司。那些退市的、被ST的、破产的,全被剔除了。你想想看,这意味着什么?
核心问题:幸存者偏差会让你的回测结果系统性高估。因为只有活下来的股票才有完整的历史数据,而这些股票本身就有「幸存」的偏倚。
举个具体的例子。假设你在2005年用某个因子选股,选到了10只股票。到2023年,其中3只退市了,2只被ST了,剩下5只活得不错。如果你用2023年的数据库回测,那3只退市的股票根本不存在,你的回测组合里只有那5只活下来的。收益自然好看。
但实盘呢?你会真金白银地买入那3只后来退市的股票,亏得底裤都不剩。
2.2 前视偏差:你用了未来的信息
另一个常见的坑是前视偏差。说白了,就是你用今天才知道的信息,去预测昨天的行情。
我记得有一次,一个同事兴冲冲地跑过来说发现了一个超强因子——「业绩预告修正因子」。回测效果惊人,年化超额收益超过15%。
我问他:「你的业绩预告数据是什么时候发布的?」
他愣了一下:「呃...数据库里直接有的啊。」
问题就在这里。很多数据库会把历史财报数据「回溯修正」。比如某公司2018年的年报,后来因为会计差错做了更正。数据库里直接存的是更正后的数据,而不是当时实际发布的数据。
你用更正后的数据做回测,相当于提前知道了未来才会发布的信息。这能不准吗?
避坑指南:我曾经在构建财务因子时,吃过这个亏。后来我养成了一个习惯——所有因子计算必须使用「当时可得」的数据。具体来说:
- 财报数据使用原始发布版本,而非回溯修正版
- 行情数据使用复权价格时,注意复权方式是否引入了未来信息
- 事件类数据(如分红、送转)使用实际公告日期
2.3 数据清洗中的隐性陷阱
数据清洗听起来是个苦力活,但这里面的门道可不少。我见过太多人在这一步埋下隐患。
举个例子,处理缺失值。很多人习惯用均值填充、中位数填充,或者直接删除。但不同的处理方式,对因子效果的影响天差地别。
我曾经做过一个实验:同一个因子,用不同的缺失值处理方法,回测结果能差出5个百分点的年化收益。你想想看,这5个百分点足以让一个「无效因子」变成「有效因子」。
| 缺失值处理方法 | 年化收益 | 夏普比 | 最大回撤 |
|---|---|---|---|
| 直接删除 | 12.3% | 1.2 | -18.5% |
| 均值填充 | 15.8% | 1.5 | -15.2% |
| 行业均值填充 | 14.1% | 1.3 | -16.8% |
| 前向填充 | 13.6% | 1.4 | -17.1% |
看到没?均值填充的结果最好看。但这是真实的吗?不一定。因为均值填充会引入「信息泄露」——你用全样本的均值去填充某个时间点的缺失值,相当于用了未来的信息。
我的建议:处理缺失值时,一定要考虑时间维度。我个人习惯用「截面滚动窗口」的方法——只使用当前时间点之前的数据来计算填充值。虽然麻烦一点,但至少不会引入前视偏差。
2.4 因子失效的底层逻辑
聊了这么多数据陷阱,咱们来总结一下因子失效的底层逻辑。其实就三个字——不一致。
回测环境和实盘环境的不一致,导致了因子失效。这种不一致体现在:
- 数据不一致:回测用的数据是「事后修正版」,实盘用的是「实时发布版」
- 样本不一致:回测只包含幸存者,实盘包含所有股票
- 时间不一致:回测假设你能在收盘价成交,实盘可能滑点严重
- 成本不一致:回测忽略交易成本,实盘每笔交易都要交钱
我见过最离谱的一个案例,是有人用「未来函数」做回测。他的因子里包含了一个「涨停板打开」的信号,但他是用当天的收盘数据来判断的。你想想看,涨停板打开发生在盘中,收盘数据是盘后才有的。这能一样吗?
嗯,这里要注意。很多新手容易犯这个错误。他们觉得「反正数据都在那里,用一下怎么了」。但量化交易的核心就是「因果性」——你必须确保因子信号在交易之前就已经产生。
2.5 如何构建「干净」的回测框架
说了这么多问题,总得给点解决方案。我个人在实践中总结了一套「防坑指南」,分享给大家:
- 使用点播数据:每个时间点只使用该时间点之前的数据,绝不使用未来的任何信息
- 保留退市股票:数据库里必须包含所有曾经上市过的股票,包括已退市的
- 模拟真实交易:考虑滑点、手续费、冲击成本,别用理想化的假设
- 多维度验证:不要只看收益,还要看换手率、持仓集中度、因子衰减速度
- 样本外测试:留出一段数据做样本外测试,别在同一个数据集上反复调参
核心原则:回测不是用来证明因子有效的,而是用来证伪的。如果你的回测框架不能发现数据中的问题,那它本身就有问题。
最后说一句。数据陷阱和幸存者偏差,是每个量化研究员都会遇到的坎。我踩过,你也会踩。关键是要有意识地去识别和防范。别等到实盘亏钱了,才回过头来检查数据。
下面这张图,是我自己总结的因子失效诊断框架,希望能帮你理清思路。
这张图把因子失效的三大根源梳理清楚了。数据陷阱、幸存者偏差、前视偏差,这三者往往同时出现,互相叠加。你排查的时候,得一个一个过。
好了,这一章的内容就到这里。记住一句话:数据质量决定了因子上限,模型只是逼近这个上限的手段。数据有问题,再牛的模型也白搭。
公众号:蓝海数据掘金营,微信deep3321