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. 一段简化的防泄露伪代码思路
下面的伪代码展示“调仓日只能看过去”的思想。
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:给自己的研究设一道门槛
请写下你未来看到漂亮回测时必须先问的五个问题。
示例:
- 数据当时可见吗?
- 股票池有没有幸存者偏差?
- 参数是不是试出来的?
- 扣成本后还有效吗?
- 这个逻辑为什么应该存在?
把这五个问题贴在研究笔记开头。
它们会帮你少走很多弯路。
核心复盘
知识清单:
- [ ] 我能解释数据泄露为什么像提前看答案。
- [ ] 我知道财报报告期不等于公告日,调仓日只能用已可见数据。
- [ ] 我能识别幸存者偏差、成分股回填和退市样本遗漏。
- [ ] 我知道过拟合和参数挖掘会把历史噪声伪装成规律。
- [ ] 我会用排雷清单检查成本、容量、数据清洗和可复现性。
金句总结
漂亮曲线先别急着相信,先确认它没有偷看未来、挑走失败者、量身定制历史。