做回测的人几乎都经历过:调了几轮参数,收益曲线漂亮得不像话,一上实盘就亏。这就是过拟合——参数记住了历史数据里的噪声,而不是找到了规律。
光讲概念没意思,我们直接做一个实验。
实验设计
策略:N 日累计跌超 X%,且当日收阳。信号次日开盘买入,持有 H 个交易日后收盘卖出。
参数网格:
- – N(统计跌幅的天数):3、5、10
- – X(跌幅阈值):5%、10%、15%、20%、25%
- – H(持有天数):1、3、5、10、20
共 3 × 5 × 5 = 75 组参数。
样本内:2016–2020 年,用来挑参数。
样本外:2021–2025 年,挑完之后只看一次,不再调整。
评价指标:日均超额 = 持有期超额收益 ÷ 持有天数。超额收益相对同日全部股票平均,除以天数后,不同持有期可以放在一起比较。
股票池为全 A 股,排除 ST、北交所,股价不低于 3 元,价格后复权,未计交易成本。
结果:样本内前10名,样本外表现如何
| 样本内排名 | 参数 | 样本内信号数 | 样本内日均超额 | 样本内胜率 | 样本外信号数 | 样本外日均超额 | 样本外胜率 | 样本外排名 |
|---|---|---|---|---|---|---|---|---|
| 1 | 3日跌超25%,持1日 | 140 | +1.30% | 62.9% | 208 | −2.00% | 40.9% | 75 |
| 2 | 3日跌超20%,持1日 | 867 | +0.74% | 68.3% | 1,336 | −1.78% | 43.6% | 74 |
| 3 | 10日跌超25%,持3日 | 6,829 | +0.24% | 60.3% | 7,320 | +0.80% | 76.6% | 2 |
| 4 | 10日跌超25%,持1日 | 6,829 | +0.24% | 48.6% | 7,320 | +0.24% | 63.0% | 19 |
| 5 | 10日跌超20%,持1日 | 19,337 | +0.22% | 54.6% | 19,609 | +0.18% | 60.1% | 30 |
| 6 | 5日跌超25%,持1日 | 1,003 | +0.21% | 56.8% | 1,693 | −1.30% | 41.2% | 73 |
| 7 | 10日跌超25%,持5日 | 6,829 | +0.18% | 58.3% | 7,320 | +0.82% | 77.0% | 1 |
| 8 | 10日跌超20%,持3日 | 19,337 | +0.17% | 61.4% | 19,609 | +0.44% | 69.6% | 6 |
| 9 | 10日跌超20%,持5日 | 19,337 | +0.15% | 62.0% | 19,609 | +0.43% | 69.7% | 7 |
| 10 | 10日跌超20%,持10日 | 19,337 | +0.13% | 52.7% | 19,609 | +0.22% | 70.9% | 23 |
胜率指持有期收益大于 0 的比例。
样本内的第 1、2 名,到了样本外是倒数第 1、2 名。 样本内排第 6 的也掉到了第 73 名。
如果你在 2020 年底做了这次参数优化,选了「3 日跌超 25%,持 1 日」——样本内每天 +1.30% 超额、胜率 63%——接下来 5 年会稳定亏钱。
规律一:样本越小,排名越不可信
把 75 组参数按样本内信号数分成两类,看样本内和样本外排名的相关系数:
| 分组 | 组合数 | 样本内外排名相关系数 |
|---|---|---|
| 样本内信号 ≥ 3,000 | 60 | +0.69 |
| 样本内信号 < 1,500 | 15 | −0.77 |
信号多的参数组合,样本内好的样本外大概率也好;信号少的组合,排名几乎完全反过来。
样本内第 1 名只有 140 个信号,5 年里平均每年 28 次。这么少的样本,几次运气好的大涨就能把平均数拉得很高。
规律二:「挑出来的最优」不如「随便选」
| 选法 | 样本外日均超额 |
|---|---|
| 样本内前10名的平均 | −0.20% |
| 全部75组的平均 | +0.07% |
按样本内表现精挑细选出来的前 10 名,样本外平均反而不如 75 组随便选。原因就是前 10 名里混进了样本少、靠运气排上来的组合。
需要说明的是,2021–2025 年整体对这类超跌反弹策略比较友好,75 组里有 66 组样本外为正。在更差的市场环境里,过拟合的代价会更大。
规律三:持有期太短,噪声最大
| 持有天数 | 样本内日均超额 | 样本外日均超额 |
|---|---|---|
| 1 日 | +0.18% | −0.41% |
| 3 日 | +0.04% | +0.23% |
| 5 日 | +0.05% | +0.26% |
| 10 日 | +0.05% | +0.15% |
| 20 日 | +0.05% | +0.14% |
持有 1 天的组合在样本内看起来最好,样本外却是唯一整体为负的。持有 1 天的收益其实是「次日开盘到收盘」的日内波动,噪声极大;而且实盘里每天换仓的手续费会进一步吃掉收益。
真实案例:样本外的「第三段」
即使通过了样本外检验,也不代表永远有效。
我们的经典策略观察池里有「5 日跌超 20% 且收阳,持有 5 日」。2016–2025 年平均 5 日超额 +1.66%,10 年里 7 年跑赢,看起来很稳健。但 2026 年前 9 个月,这个信号的 5 日超额是 −3.54%,胜率只有 31%。
市场环境会变,策略会失效。回测通过只是起点,上线后还要持续跟踪。
3个识别过拟合的方法
1. 先看样本量
信号数少于 1,000 的回测结果,收益数字基本不可信。还要看信号是不是集中在某一两年:如果大部分收益来自 2015 年或 2024 年,那它测的其实是那一年的行情。
2. 留一段样本外
把数据分成两段:前一段用来挑参数,后一段只用来验证,而且只验证一次。如果看了样本外结果再回去改参数,样本外也就变成了样本内。
3. 看参数的「邻居」
好参数周围的参数也应该不错。上面的例子里,「10 日跌超 20%/25%,持 3–5 日」是一片表现都不错的区域,像一块高原;而「3 日跌超 25%,持 1 日」是孤零零的一个尖峰,旁边的参数表现都很一般。选高原,不选尖峰。
另外,一定要扣除交易成本再看结果。A 股双边成本大约在 0.1%–0.2%,持有期越短,成本的影响越大。
在青柠量化里怎么做
青柠量化的回测报告自带过拟合检测(Reality Check 评级),会对策略在全市场做截面检验。做参数优化时,建议先在较早的年份里调参,再用最近一两年单独回测一次,看结果是否一致。
口径说明
信号数为触发次数,同一只股票可多次计入。次日一字涨停买不进的信号剔除。收益未计交易成本。历史统计不代表未来表现,不构成投资建议。
读到这里,不如自己验证一次
文章里的逻辑,你可以在青柠量化里用真实数据重新跑一遍。免费,零代码。