读懂回测报告
核心问题一份回测报告,哪些数字可以相信,哪些需要追问?
视频
待发布
预计 2026-10-21 17:30(北京时间)发布,以实际公开时间为准。
视频发布后会嵌入在这里,并加入 Bilibili 合集“量化与机器学习入门”。 预计时长约 8 分钟。
学习目标
- 掌握报告必备项:基准、净值、回撤、分年、换手、成本假设、尝试次数、样本外区间。
- 知道哪些结论不能宣称。
- 用自检清单检查自己和别人的报告。
让 AI 带你做模拟数据
把下面的提示词整段复制给任意一个 AI 助手。它会先生成一份模拟的股票月度数据(设定对每一节都一样),再带你把这一节的分析做一遍。数据是模拟的,具体数字会和视频不同,但应该看到同样的规律。
任务(第 14 节):看看“偷看”能把结果抬高多少,再写一份诚实的报告。
1. 偷看版:用全部 192 个月一次性训练梯度提升树(200 棵,参数同第 09 节),在第 60 个月以后每月买前 50 只,算年化收益。
2. 诚实版:用第 09 节按时间滚动训练的梯度提升树,同样买前 50 只,算年化收益;再按每次买卖 0.2% 扣成本,算一次。
3. 把三个年化画成一组柱子:偷看版、按时间滚动、扣成本以后。再列出诚实版和等权基准每一年的收益。
4. 最后用一句话写出结论:说清用的数据、方法、扣成本后的结果,以及不能宣称的东西。提示词开头的模拟数据设定
请用 Python(numpy、pandas,需要时用 scikit-learn)带我做一个量化入门练习。先生成一份模拟的股票月度数据,随机种子用 42:
1. 300 只股票,192 个月(月份编号 0–191,相当于 16 年)。
2. 每只股票有一个固定的波动 sigma,从 0.05 到 0.13 均匀抽取;它的 beta = 0.5 + 5 × sigma。
3. 每个月有五个特征:mom(动量)、val(估值,越大越便宜)、size(规模)、lowvol(低波动)、prof(盈利)。
- mom、val、size、prof:第 0 个月取标准正态;之后每个月,新值 = 0.9 × 上月值 + 0.44 × 标准正态。
- lowvol = −sigma + 0.02 × 标准正态。
- 每个月把五个特征各自在 300 只股票之间标准化(减平均、除以标准差)。
4. 每个月抽一个下个月的大盘收益 mkt_next ~ 正态(0.005, 0.05);再给五个特征各抽一个当月系数 = 基础系数 + 0.01 × 标准正态,基础系数依次是 0.004、0.003、0、0.005、0.002。
5. 下个月收益 ret_next = beta × mkt_next + Σ(当月系数 × 特征) + sigma × 标准正态。
6. 整理成一张长表:每行是一只股票的一个月,列为 month、stock、sigma、五个特征、mkt_next、ret_next。打印前几行和总行数。
后面统一的口径:
- IC:每个月,某一列和 ret_next 在 300 只股票之间的 Spearman 秩相关。
- 年化收益:把每月收益连乘,再按 12 / 月数 开方后减 1。
- 等权基准:每个月 300 只股票 ret_next 的平均。
- 第 m 个月这一行的特征在第 m 个月月底已知,标签 ret_next 是第 m+1 个月的收益。训练模型时,在第 s 个月月底打分,训练只用月份 ≤ s−2 的行(中间隔开一个月)。
接下来按我的要求一步一步做。每一步先用一两句话说明在做什么,再给代码和结果。应该看到
- 偷看版的年化,比按时间滚动高出大约 5–9 个百分点。这一段全是偷看出来的。
- 扣 0.2% 的成本以后,年化再少两到三个百分点。
- 结论里写明了:模拟数据、按时间滚动、扣成本后的年化,以及“不代表真实市场”。
对不上的时候,把你的结果和这几条一起发给 AI,让它解释是哪一步出了问题。
自测
用全部数据训练,再在同一段数据上回测,为什么结果会偏高?
- A. 因为数据更多了
- B. 因为树模型更好
- C. 模型已经见过要预测的那些月份的答案
- D. 不会偏高
看答案
答案 C。回测里的每一个月,都应该只用那个月以前的数据训练。
一份回测报告里,哪一项最常被漏掉,却很影响可信度?
- A. 一共试了多少个版本
- B. 净值曲线的颜色
- C. 用的是哪种编程语言
- D. 回测的开始日期是星期几
看答案
答案 A。只报最好的那一版,不说试了多少次,结果再好也要打折扣。
常见坑
- 只放净值图
- 隐藏样本内外的分界
- 不写成本假设
下一节
现在,独立走完一遍。
15独立完成一项研究能不能独立完成一项不骗自己的机器学习量化研究?下一步学什么?