怎么避免过拟合:参数调得越完美,未来可能死得越惨
- 理解过拟合是什么、为什么参数越多越容易过拟合
- 学会用样本内外划分、走步检验等方法识别过拟合
- 建立「简单稳健胜过复杂完美」的策略观
你写了一个策略,跑完回测,曲线漂亮得让你心跳加速:从左下角一路平滑地涨到右上角,几乎没有回撤,年化收益高得离谱,夏普比率亮得发光。你盯着这条曲线看了半天,越看越觉得自己摸到了市场的命门。然后你把它推上实盘——一个月后,它开始亏钱,三个月后,它亏得比你的随手乱买还惨。
这不是运气差,这是量化里最常见、也最致命的一个坑:过拟合。那条完美无瑕的历史曲线,往往不是因为你发现了规律,而是因为你把历史数据里的偶然噪音,当成了规律。
过拟合是什么:背答案 vs 真会做题
先用一个上学时的场景把它说透。
班里有两种学生。一种学生认真理解了知识点,遇到新题目能推导出答案;另一种学生没真懂,但他把往年的考卷答案全背下来了。期末考如果直接出往年原题,背答案的那个能考满分,甚至比真懂的那个分还高。可一旦题目稍微变个数字、换个问法,背答案的立刻露馅,而真懂的依然能做对。
过拟合,就是你的策略变成了那个背答案的学生。 它在历史数据(往年考卷)上表现完美,因为它把历史里每一个偶然的涨跌都「背」了下来——但它并没有学到任何能推广到未来的真东西。一旦市场出新题(未来的行情),它就抓瞎。
用术语说:过拟合是指模型或参数过度贴合了历史数据中的偶然噪音,而不是底层的真实规律,导致它缺乏泛化能力——在没见过的数据上表现急剧变差。
这里的关键词是「噪音」。任何一段历史行情里,既有可重复的规律(比如某些资产长期相关、流动性枯竭时容易踩踏),也有大量不会重演的偶然(某天某只票因为一条传闻突然拉了一根大阳线)。一个好策略要抓住前者、忽略后者;一个过拟合的策略恰恰相反——它把那根偶然的大阳线也编进了规则里,于是历史曲线更漂亮了,未来却更脆弱了。
回测收益越夸张,越要警惕,而不是越高兴。 一条完美无回撤的历史曲线,更可能是过拟合的产物,而不是圣杯。真实有效的策略通常长得「不那么完美」——有回撤、有亏损月份、收益没那么离谱。当你的回测好得不真实时,第一反应应该是怀疑自己,而不是庆祝。
为什么会发生:四个常见来源
过拟合不是凭空冒出来的,它有几个非常具体的产生途径。认清它们,是避免它的第一步。
第一,参数太多。 这是最直接的来源。你的策略里每多一个可调参数(均线周期、止盈止损阈值、过滤条件、仓位系数……),就多了一个「拟合历史」的自由度。参数少的时候,策略只能粗线条地刻画规律;参数多到一定程度,它就能把历史曲线的每一个拐弯都精确地描出来——但描的越精确,越是在描噪音。一个有十几个参数的策略,几乎一定在某种程度上过拟合了,因为总有一组参数组合能让历史数据看起来完美。
第二,反复优化(参数寻优)。 你跑了一遍回测,效果一般。于是你把均线从 20 天调到 22 天,好了一点;再调到 23 天,又好了一点;止损从 5% 调到 4.7%,再好一点……你在同一段历史数据上反复试错、挑出最好看的那组参数。问题是,你挑出来的,恰恰是最贴合这段历史噪音的那组——你不是在优化策略,你是在优化对历史的记忆。
第三,样本太少。 你只拿了两三年、甚至一段牛市的数据来开发策略。数据越少,里面的偶然成分占比越高,规律和噪音越难区分。一个只在 2020-2021 年验证过的策略,很可能只是学会了那两年的特定风格,换个市场环境就废。
第四,数据窥探(data snooping)。 这个最隐蔽。你在动手写策略之前,其实已经「知道」了这段历史里发生过什么——你记得哪年有大跌、哪个板块涨得猛。这些记忆会不知不觉渗进你的设计里:你会下意识地加一条「在某种情况下空仓」的规则,而这条规则的灵感,正来自你已经知道的那次大跌。于是回测当然躲过了那次大跌,但这不是策略的本事,是你「开了天眼」。
坑:在同一段数据上反复调参,直到曲线满意为止。 为什么是坑——你调的次数越多,挑中的越是「碰巧贴合这段历史」的参数,而不是真正稳健的参数。这在统计上叫多重检验:试一百组参数,总有几组光靠运气就很好看。怎么避——严格限制你在同一段数据上的尝试次数;真正的检验要放到一段你从没碰过的数据上做(下文详述)。
怎么降低过拟合:一份方法清单
过拟合无法被彻底消灭——只要你用历史数据开发策略,就一定会沾上一点。但下面这些方法能系统性地把它压到可控范围。
一、样本内 / 样本外划分(in-sample / out-of-sample)
最基础也最重要的一招。把你的历史数据切成两段:
- 样本内(in-sample):用来开发、调参、寻优。你可以在这段里随便折腾。
- 样本外(out-of-sample):在你开发阶段完全不碰它,藏起来。等策略定型后,拿它跑一次,看表现。
逻辑很简单:样本内表现好不算本事(背答案谁都行),样本外还能保持表现,才说明策略可能学到了真东西。如果一个策略样本内年化 30%、样本外直接亏损,那这 30% 基本就是过拟合出来的幻觉。
通常的切法是按时间先后划分,比如前 70% 做样本内、后 30% 做样本外,而不是随机打乱——因为金融数据有时间结构,随机打乱会让未来信息泄漏到过去。
二、走步前进检验(walk-forward)
样本内外划分只检验一次,而 walk-forward 把这个过程滚动起来,更接近真实交易:
- 用第 1-2 年数据优化参数,
- 用优化好的参数在第 3 年(这一年优化时没看过)上跑,记录表现,
- 窗口往前滚一年:用第 2-3 年优化,在第 4 年上跑,
- ……如此一段段往前推,把每一段「样本外」的表现拼起来。
这样得到的曲线,模拟的是「你当年只用得到当时的数据、定期重新优化、然后实盘交易」的真实情形。如果一个策略在 walk-forward 下依然稳健,它的可信度比单次回测高得多。
三、参数越少越稳健
回到那个「参数即自由度」的逻辑:能用三个参数说清楚的策略,就别用八个。每砍掉一个参数,你就少给过拟合一个藏身之处。一个朴素、参数少、逻辑直白的策略,哪怕历史曲线没那么炫,往往比一个参数堆砌、曲线完美的策略,在未来更靠得住。这就是量化里反复被验证的一条经验:简单稳健,胜过复杂完美。
四、参数高原 vs 参数孤峰
这是判断过拟合的一个特别好用的直觉工具。当你优化某个参数时,别只看最优那一点,要看它周围一片的表现。
- 参数孤峰:均线取 23 天时收益爆表,但取 22 天或 24 天就大幅变差,像一根孤零零的尖峰。这说明你这个「最优值」非常脆弱——市场只要稍微变一点,它就塌了。23 这个数字大概率是碰运气碰出来的噪音。
- 参数高原:均线取 18 到 28 天之间,收益都还不错、变化平缓,像一片平坦的高地。这说明策略对参数不敏感、稳健——你取范围里随便一个值都行,未来跑偏的风险小得多。
永远优先选高原中央的参数,而不是孤峰的尖顶。 一个对参数微小扰动就崩溃的策略,几乎可以断定是过拟合的。
五、逻辑先行:先有道理,再去回测
这是从根上对抗数据窥探的办法。先想清楚一个策略「为什么应该有效」——它背后有没有经济学逻辑、行为金融逻辑、或者结构性原因——然后再去回测验证。
比如你认为「市场在恐慌时容易超跌、随后修复」,这背后有清晰的行为逻辑(人在恐惧下会非理性抛售),那你再去回测这个想法,就比较踏实。反过来,如果你是先在数据里瞎试,碰巧发现「每月第 13 个交易日买入收益最高」,却说不出任何道理——那它几乎肯定是噪音,回测再漂亮也不能信。
一句话:回测是用来证伪一个有道理的想法,不是用来从数据里挖出没道理的想法。 顺序反了,过拟合就找上门了。
六、留一段从未看过的数据,最后才检验
把样本外做到极致:在整个开发过程中,真正锁死一段数据——不只是「不调参」,而是连看都不看一眼。等策略彻底定型、你自认为完工了,再拿这段「圣域数据」跑唯一的一次。
为什么要这么狠——因为人是会作弊的,哪怕无意。只要你看过那段数据、知道里面发生过什么,它就会污染你的判断。只有完全没接触过的数据,才能给你一个相对干净的答案。注意:这段数据只能用一次。一旦你用它做完检验、又回头去改策略,它就「被污染」了,不再是干净的样本外了。
坑:样本外检验不达标,就回头改策略,再用同一段样本外重测。 为什么是坑——你这么干几轮之后,所谓的「样本外」早就变成了「第二个样本内」,因为你已经在用它的反馈来调策略了。怎么避——样本外数据是一次性的弹药,打完就没了;如果非要继续迭代,要么换一段全新数据,要么诚实地承认这个策略需要从更扎实的逻辑重新来过。
一个对比:稳健策略 vs 过拟合策略长什么样
把两类策略的特征摆在一起,方便你照镜子:
| 维度 | 稳健的策略 | 过拟合的策略 |
|---|---|---|
| 历史曲线 | 有回撤、有亏损月份,收益合理 | 平滑漂亮、近乎无回撤、收益夸张 |
| 参数数量 | 少(通常个位数) | 多,且各有精确的「最优值」 |
| 对参数扰动 | 不敏感(参数高原) | 极敏感(参数孤峰) |
| 样本外表现 | 与样本内接近 | 急剧变差甚至亏损 |
| 背后逻辑 | 说得清为什么有效 | 说不清,纯靠数据挖出来 |
| 开发过程 | 逻辑先行、有限次调参 | 反复寻优、对着曲线调到满意 |
如果你的策略落在右边那列,别急着上实盘,先回头查它过拟合在哪。
即便通过了上面所有检验,也不能保证策略未来有效。 样本外检验、walk-forward、参数高原——这些方法只能降低过拟合的概率,不能消除它,更不能预测未来。市场结构会变,过去稳健的逻辑可能在新环境下失效。任何策略上实盘后都必须配套止损、仓位控制和持续监控,把「策略会失效」当成默认前提,而不是意外。量化不是找到永远有效的圣杯,而是在承认不确定的前提下管理风险。本文只讲方法原理,不构成任何投资建议,见 免责声明。
自检清单:上实盘前问自己
- 我是不是在同一段数据上反复调参,直到曲线满意为止?
- 我有没有留出一段开发时完全没碰过的数据,做最后的样本外检验?
- 我的策略参数,是不是落在「参数高原」而不是「孤峰」上?
- 我能不能用一两句话说清这个策略「为什么应该有效」,而不是「数据显示它有效」?
- 我的参数是不是多到可疑?能不能砍掉几个?
- 我是不是把这个策略将来会失效当成了默认前提,配好了止损和风控?
这几条里只要有一条答不上来,就说明过拟合的风险还没排除干净。
小结
- 过拟合是量化第一杀手:策略把历史里的偶然噪音当成规律「背」了下来,历史完美、未来崩溃。
- 它的常见来源是参数太多、反复寻优、样本太少、数据窥探——本质都是给策略太多贴合历史的自由度。
- 对抗它的方法是一套组合拳:样本内外划分、走步检验、少用参数、选参数高原、逻辑先行、锁死一段数据最后检验。
- 核心心法是简单稳健胜过复杂完美:一条不那么漂亮但讲得清道理的曲线,比一条完美但说不清为什么的曲线,靠谱得多。
- 最后记牢:所有这些只能降低过拟合,不能保证未来有效——把策略会失效当默认前提,风控永远不能省。
继续往下走,可以去 L5 阶梯 看量化主线其他环节怎么搭;策略背后的数学直觉(为什么参数越多越容易拟合噪音)在 原理库 里有更系统的拆解;而「策略一定会失效、所以风控不能省」这条命门,专门在 风险管理卷R 里讲透。投资有风险,本文仅为方法原理科普,不构成任何建议,详见 免责声明。