Skip to content

8.10 因子研究的常见坑

课前导读

本节目标

你将学会:在因子研究报告看起来很漂亮时,如何用排雷清单检查它是不是踩了数据和方法的坑。

适合基础:已经学完因子分类、基本检验、中性化、换手率和稳定性监控的读者。

难度:intermediate

预计用时:约 45 分钟

想象你参加一场考试。

有人在考试结束后,把标准答案偷偷塞回了你的草稿纸里。

你再回头检查,会发现自己“全都会”。

但这不是真本事。

因子研究里也有类似问题。

如果研究时不小心使用了未来才知道的信息,回测就会像提前看答案一样漂亮。

本节不教你搭完整回测系统,也不展开组合优化。

我们只做一件非常重要的事:

学会识别因子研究中最常见、最容易让新手误判的坑。


知识正文

1. 数据泄露:不小心偷看了未来答案

数据泄露是因子研究里最危险的坑之一。

它指的是:你在做历史某一天的决策时,使用了那一天当时还不可能知道的信息。

这就像考试前看到了答案。

结果当然好,但没有真实意义。

A 股研究中,常见泄露包括:

  • 用当天收盘价生成信号,又假设当天收盘前能按该信号成交;
  • 用未来财报数据计算过去的因子;
  • 用事后修正过的行业分类、成分股名单回填历史;
  • 用未来是否退市的信息筛选过去股票;
  • 用全样本统计量标准化历史数据。

例如,你在 2023 年 4 月 1 日做选股。

某公司 2022 年年报可能还没有披露。

如果你的因子直接使用完整年报数据,就可能把未来几周才公布的信息提前拿来用了。

这会让回测显得更聪明。

但真实投资者当时并不知道这些数字。

风险提醒

任何“当时不可见”的信息进入信号,都会让回测结果失真。漂亮收益可能只是偷看未来。

2. 财报可得性:财务数据不是报告期当天就可用

很多新手看到财务表里写着“2023-12-31”,就以为 2023 年底可以使用这份数据。

这是误解。

2023-12-31 通常是报告期截止日,不是披露日。

投资者真正能看到年报,往往是在次年公告日之后。

做 A 股财务因子时,必须区分:

日期类型含义研究中怎么用
报告期财报覆盖的会计期间不能直接当作可用日期
公告日市场能看到报告的日期更接近真实可用时间
调仓日策略实际做决策的日期只能使用此前已公告数据

如果你在 2024 年 1 月初用 2023 年年报利润选股,大概率就是提前使用信息。

更稳妥的做法是:

调仓日只使用该日之前已经公告的数据。

如果无法确认公告日,就要保守处理,例如滞后一段时间。

这不是吹毛求疵。

财务因子常常依赖利润、资产、现金流等数据。

一旦可得性处理错,结果可能完全不可信。

3. 幸存者偏差:只看活下来的样本

幸存者偏差可以用“只采访成功创业者”来理解。

如果你只问活下来的公司为什么成功,会觉得成功经验到处都是。

但那些倒闭的公司没有出现在样本里。

于是你低估了失败概率。

股票研究也一样。

如果你的股票池只包含现在还上市的公司,再回看十年前,就会漏掉已经退市、长期停牌或被合并的公司。

这样会让历史结果偏乐观。

因为很多表现差的样本被悄悄删除了。

A 股退市数量相比成熟市场曾经较少,但随着注册制、退市制度完善,忽略退市和风险警示股票会越来越不可靠。

即使不研究退市,成分股名单也会带来类似问题。

例如用今天的沪深 300 成分股回测过去十年。

这等于假设十年前你已经知道哪些股票未来能进入指数并留到今天。

这也是一种事后选择。

常见误区

“我只是为了方便下载当前股票列表”并不能消除幸存者偏差。方便不等于真实。

4. 过拟合:把历史噪声当规律

过拟合可以理解为给一把钥匙修出太多奇怪齿纹。

它刚好能打开眼前这把锁,却打不开别的锁。

因子研究中,如果你不断调整参数,只为了让历史收益曲线更漂亮,就可能过拟合。

例如:

  • 试了 5 日、7 日、9 日、11 日、13 日动量,只保留最好那个;
  • 试了几十种财务比率组合,只展示收益最高的组合;
  • 反复调整调仓日、持仓数量、过滤条件,直到曲线最好看;
  • 根据某段历史行情定制规则,却声称规则长期有效。

历史数据里有真实规律,也有随机噪声。

过拟合就是把噪声也当成规律学习了。

它在样本内很好看,样本外容易变差。

样本内可以理解为你用来研究和调参的历史区间。

样本外可以理解为没有参与调参、用来检验规则的新区间。

不要被术语吓到。

直觉是:练习题做得好,不代表陌生考题也会做。

5. 参数挖掘:试得越多,越容易碰巧中奖

参数挖掘和过拟合很像。

区别在于,它强调“你试了太多次”。

如果一个人买 1000 张彩票,总会有几张看起来运气不错。

如果研究者测试 1000 个因子,挑出收益最高的 5 个,不能直接说这 5 个都有真实逻辑。

它们可能只是碰巧适配了历史。

所以,专业研究要记录失败实验。

只展示成功因子,会让读者误以为命中率很高。

研究日志中至少应记录:

  • 测试了哪些参数;
  • 为什么选择当前参数;
  • 有没有经济或投资逻辑支持;
  • 样本外表现如何;
  • 是否扣除了交易成本;
  • 是否和已有因子高度重复。

这听起来麻烦。

但它能保护你不被自己的实验结果骗到。

6. 忽略成本:纸面收益变不成账户收益

前一节我们讲过换手率和容量。

在常见坑里,忽略成本必须再次出现。

因为很多因子在不扣成本时很好看,扣成本后只剩噪声。

尤其是高换手、短周期、偏小盘的策略。

它们可能在回测里频繁抓到微小价差。

但真实交易要支付佣金、税费、买卖价差、滑点和冲击成本。

如果研究报告没有说明成本假设,你应该提高警惕。

一个负责任的因子报告,至少要说清楚:

  • 调仓频率;
  • 平均换手率;
  • 成本假设;
  • 扣成本前后差异;
  • 资金规模放大后的可能影响。

只看毛收益,就像只看工资不看房贷、交通和生活成本。

7. 数据清洗不透明:结果无法复现

有些研究问题不是来自高深模型,而是来自表格处理。

比如:

  • 缺失值直接填 0;
  • 极端值随意删除;
  • 停牌日收益处理不清楚;
  • 涨跌停无法成交却假设成交;
  • 股票代码变更没有追踪;
  • 复权价格和未复权价格混用。

这些看起来是“小细节”。

但因子研究是由很多小细节堆起来的。

一个缺失值处理方式,就可能改变排序。

一个涨跌停处理假设,就可能改变收益。

量化开发必须让处理流程可复现。

投资者也要学会问:

如果别人按同样规则重新跑一遍,能得到类似结果吗?

如果不能,报告的可信度就要打折。

8. 逻辑缺失:只有曲线,没有原因

最后一个坑,是只有结果,没有解释。

一个因子收益很好,但说不清为什么应该有效。

这种情况需要谨慎。

不是每个因子都必须有完美理论。

但至少要有合理直觉。

例如:

价值因子的直觉可能是市场过度悲观后价格修复。

质量因子的直觉可能是稳健经营更能穿越周期。

动量因子的直觉可能是信息扩散需要时间。

低波动因子的直觉可能是投资者过度追逐刺激,低波动资产被低估。

如果一个因子只是“我试了很多公式,这个最好”,就要问它是否只是参数挖掘。

关键心得

好因子需要三条腿:可解释的逻辑、干净的数据、经得起检验的结果。

9. 一段简化的防泄露伪代码思路

下面的伪代码展示“调仓日只能看过去”的思想。

python
for rebalance_date in rebalance_dates:
    available_financials = financials[financials["announce_date"] <= rebalance_date]
    latest_data = available_financials.sort_values("announce_date").groupby("stock").tail(1)
    signal = make_factor(latest_data)
    portfolio = select_stocks(signal)

重点不是语法,而是第一行筛选条件。

只有公告日不晚于调仓日的数据,才允许进入信号。

如果把报告期当成公告日,或者直接使用未来整理好的最新数据,就可能发生泄露。

这条原则适用于财务数据、成分股数据、行业分类数据和风险标签。

10. 从三重角度看排雷

专业老师会提醒你:先定义问题,再谈模型。

投资者会提醒你:回测收益不等于账户收益。

量化开发会提醒你:任何结果都要能被代码、数据版本和日志复现。

这三种视角合在一起,就是因子研究的安全带。

当你看到一条漂亮曲线时,不要急着兴奋。

先问:

数据当时可见吗?

样本完整吗?

参数是不是试出来的?

成本扣了吗?

逻辑说得通吗?

如果这些问题都能经得起检查,再进入下一步研究。

完整回测系统、组合优化和实盘工程会在后续章节继续展开。

本节先帮你建立排雷意识。


交互实验室

因子研究排雷清单

请把下面清单复制到你的研究日志中。

每完成一项,就在方框里打勾。

A. 时间可得性

  • [ ] 我确认调仓日使用的数据在当时已经可见。
  • [ ] 财务数据使用公告日或保守滞后处理,而不是直接使用报告期。
  • [ ] 价格信号没有用当天收盘后才知道的信息假设当天成交。
  • [ ] 标准化、分位数、行业均值等统计量只使用当时样本。

B. 样本完整性

  • [ ] 股票池不是简单使用今天仍然存在的股票倒推历史。
  • [ ] 指数成分股使用历史成分,而不是今天成分。
  • [ ] 退市、长期停牌、风险警示等样本处理有记录。
  • [ ] 行业分类和公司状态尽量使用历史口径。

C. 参数与逻辑

  • [ ] 因子有清楚的经济或投资直觉。
  • [ ] 参数选择有理由,而不是只选历史最好结果。
  • [ ] 失败实验和替代参数有记录。
  • [ ] 做过样本外或分阶段观察。

D. 交易现实

  • [ ] 回测结果同时展示扣成本前和扣成本后。
  • [ ] 记录调仓频率、平均换手率和持仓数量。
  • [ ] 考虑买卖价差、滑点、冲击成本和涨跌停影响。
  • [ ] 估计策略适合的资金规模,避免无限放大。

E. 可复现性

  • [ ] 数据来源、下载时间和版本有记录。
  • [ ] 缺失值、异常值和停牌处理方法有记录。
  • [ ] 代码能从原始数据重新生成关键结果。
  • [ ] 研究结论写明适用边界和下一步复查计划。

练习 1:识别三个坑

请判断下面描述可能踩了什么坑。

描述可能问题
用今天沪深 300 成分股回测 2015 年以来表现______
用 2023 年年报数据在 2024 年 1 月初选股______
测试 200 个参数后只展示收益最高的一个______

参考答案:

  • 第一个可能是成分股幸存者偏差;
  • 第二个可能是财报可得性错误和数据泄露;
  • 第三个可能是参数挖掘和过拟合。

练习 2:把结论写得更诚实

原句:

“本因子年化收益 25%,说明策略非常有效。”

请改写成:

“本因子在 ______ 样本区间内,未扣成本年化收益为 ______。当前仍需检查 和 ______。在完成这些检查前,不能直接推断未来实盘有效。”

这个练习的目标不是让你悲观。

而是让研究结论更诚实、更能经受追问。

练习 3:给自己的研究设一道门槛

请写下你未来看到漂亮回测时必须先问的五个问题。

示例:

  1. 数据当时可见吗?
  2. 股票池有没有幸存者偏差?
  3. 参数是不是试出来的?
  4. 扣成本后还有效吗?
  5. 这个逻辑为什么应该存在?

把这五个问题贴在研究笔记开头。

它们会帮你少走很多弯路。


核心复盘

知识清单

  • [ ] 我能解释数据泄露为什么像提前看答案。
  • [ ] 我知道财报报告期不等于公告日,调仓日只能用已可见数据。
  • [ ] 我能识别幸存者偏差、成分股回填和退市样本遗漏。
  • [ ] 我知道过拟合和参数挖掘会把历史噪声伪装成规律。
  • [ ] 我会用排雷清单检查成本、容量、数据清洗和可复现性。

金句总结

漂亮曲线先别急着相信,先确认它没有偷看未来、挑走失败者、量身定制历史。

本文档仅供学习交流用途,不构成任何投资建议。股市有风险,入市需谨慎。