调完参数、收益曲线漂亮,上了实盘就亏钱——这是量化交易最常见的坑,根本原因是过拟合(Overfitting)。参数记住了历史噪声,没有找到真正的规律。
光讲概念没用,直接上实验。
实验设计
策略: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名,样本外表现如何
| 样本内排名 | 参数(N日/跌X%/持H日) | 样本内信号数 | 样本内日均超额 | 样本内胜率 | 样本外信号数 | 样本外日均超额 | 样本外胜率 | 样本外排名 |
|---|---|---|---|---|---|---|---|---|
| 1 | 3日跌超25%,持1日 | 140 | +1.29% | 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 |
样本内第1、2名,在样本外分别排倒数第1、2名。 如果你在2020年底用这套参数优化选了「3日跌超25%,持1日」——样本内每天 +1.29%、胜率63%——接下来5年会稳定亏钱。
规律一:样本越小,排名越不可信
把75组参数按样本内信号数分成两类:
| 分组 | 组合数 | 样本内外排名相关系数 |
|---|---|---|
| 样本内信号 ≥ 3,000 | 60 | +0.69 |
| 样本内信号 < 1,500 | 15 | −0.77 |
信号多的组合,样本内好的样本外也大概率好(相关系数+0.69);信号少的组合,排名几乎完全反过来(−0.77)。
样本内第1名只有 140 个信号,5年平均每年28次。这么少的样本,几次运气好的大涨就能把平均数拉得很高,但它代表的不是规律,是噪声。
规律二:"挑出来的最优"不如"随便选"
| 选法 | 样本外日均超额 |
|---|---|
| 样本内前10名的平均 | −0.20% |
| 全部75组的平均 | +0.07% |
按样本内表现精挑细选出来的前10名,样本外平均反而不如75组随机选。原因是前10名里混进了样本少、靠运气排上去的参数组合。
规律三:持有期太短,噪声最大
| 持有天数 | 样本内日均超额 | 样本外日均超额 |
|---|---|---|
| 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天的组合样本内看起来最好,样本外是唯一整体为负的持有期。「次日开盘到收盘」的日内波动噪声极大,加上实盘里每天换仓的手续费,这类参数很难真正盈利。
3个识别过拟合的方法
1. 先看样本量
信号数少于 1,000 的回测结果,收益数字基本不可信。还要看信号是不是集中在某一两年:如果大部分收益来自2015年或2024年,那它测的其实是那一年的行情。
2. 留一段样本外
把数据分成两段:前一段用来挑参数,后一段只用来验证,而且只验证一次。如果看了样本外结果再回去改参数,样本外也就变成了样本内了。这是最容易犯、也最难察觉的错误。
3. 看参数的"邻居"
好参数周围的参数也应该不错。「3日跌超25%,持1日」在样本内排第1,但它的邻居「3日跌超20%,持1日」排第2,样本外也是倒数。而「10日跌超20%,持5日」的邻居(10日跌超25%持5日、10日跌超15%持5日)在样本内和样本外都表现稳定。详见第57课的参数实验室。
常见误区
误区一:样本外只是用来"确认"的
错。样本外是用来证伪的,不是用来确认的。如果看到样本外结果不好就继续调,再拿新样本外看,循环三五次,那每段"样本外"都已经变成了样本内。
误区二:参数优化一定是有益的
不是。参数优化在信号量足够大的情况下有意义;信号量太小时,优化只是在挑一个运气好的参数。
误区三:总收益高就是好策略
不是。参考第58课批量回测——一个策略需要在分年、分牛熊中都表现稳定,才算经过了系统性检验。
在青柠中实操
青柠量化的回测报告提供分年超额统计,可以直接看策略在每一年的表现(见第58课)。做参数优化时,建议:
- 1. 选一段较早的年份(如2016–2022)作为样本内,在青柠参数实验室里跑参数网格
- 2. 记录最优参数后,用最近1–2年(2023至今)单独回测一次,不再调整
- 3. 如果样本外表现与样本内接近(WFE > 0.5),说明策略有一定稳健性;见第59课样本外检验
- 4. 如果样本外崩溃,说明参数是过拟合的,重新设计策略逻辑而不是继续调参
常见问题
Q:过拟合能完全避免吗?
不能完全避免,但可以控制。方法是:足够大的样本量(信号数 ≥ 1000)、严格的样本外测试(只看一次)、选参数平原而不是单一最优点、扣除交易成本后再评估。
Q:用机器学习做选股会不会更容易过拟合?
会。特征越多、模型越复杂,过拟合风险越高。机器学习在量化中需要额外的防过拟合措施(如 Purged Cross-Validation),普通的 k 折交叉验证不适用于时间序列数据。
Q:青柠的 Reality Check 评级是怎么算的?
青柠在全市场截面上验证策略信号的统计显著性,对信号量少的策略会给出风险提示。具体方法见青柠回测报告页面的说明。
口径说明
信号数为触发次数,同一只股票可多次计入。超额收益相对同日全部股票(非ST、排除北交所、价格 ≥3 元)的同口径均值。次日一字涨停买不进的信号剔除(记 NULL)。收益未计交易成本。历史统计不代表未来表现,不构成投资建议。
读到这里,不如自己验证一次
文章里的逻辑,你可以在青柠量化里用真实数据重新跑一遍。免费,零代码。
[…] 挑参数不难,难的是挑出来的参数在样本外也好用。上一课(第56课过拟合)已经验证:样本内排名第1的参数,样本外可以排倒数第1。这一课讲具体的选法:找参数平原,不找单一最优点。 […]