量化概念 27:过拟合(回测里的好成绩可能是假象)

7 阅读 1549 字 · 约 6 分钟

回测年化 40%,夏普 2.5,最大回撤 12%。参数微调一下,年化 45%。再调,50%。每调一次都更好。这不对劲。

策略在回测里越调越好,实盘却跑不出来。大概率是过拟合了。

什么是过拟合

模型把历史数据里的噪声当成了规律。回测表现好,是模型把过去的随机波动拟合得太精确了。

考试前把历年真题全背了,每道题的答案都记得。考试换了题,傻了。背得越熟,对新题越没用。策略参数调得越精细,对这段历史越"熟",对未来的泛化能力越差。

参数越多,自由度越高,过拟合的风险越大。一个均线交叉策略,调一个周期参数,还好。调快线、慢线、止损线、止盈线、仓位比例五个参数,全网格搜索最优组合,几乎一定能找到一组在历史里表现极好的参数。但那组参数只是恰好匹配了这段历史的噪声形状。

样本内和样本外

判断过拟合最基本的方法:把数据分成两段。

样本内(In-Sample)用这段数据调参数、选策略。样本外(Out-of-Sample)这段数据不参与任何调参,只用来验证。

策略在样本内年化 30%,样本外也有 20%,可能没过拟合。样本内 30%、样本外 5%,过拟合了。

问题在于,看过样本外的结果觉得不满意,回去调参数再跑一次,样本外就不再是"样本外"了。用它做了决策,它就变成了样本内的一部分。

这叫数据窥探(Data Snooping)。你每看一次样本外的结果,它就被污染一次。你可能没意识到:跑了 50 组参数,挑出样本外表现最好的那组,以为这就是验证结果。其实是在 50 个随机变量里挑最大的,挑到的不代表未来会好。

走步测试

走步测试(Walk-Forward Analysis)是对样本内/样本外方法的改进。

把时间线切成多段。第一段调参,第二段验证。然后滑动窗口:第二段调参,第三段验证。依次类推。

每一步都是"用过去的数据调参,用未来的数据验证",模拟了策略在真实时间线上的使用方式。

走步测试如果各段验证表现稳定,策略的泛化能力可能不错。如果各段差异大,某一段年化 30%、另一段亏 10%,策略可能在拟合特定行情,换一段就不好使。

过拟合的信号

几个信号值得警惕。

参数敏感。 参数从 20 天调到 21 天,收益从 30% 变 5%。从 20 天调到 19 天,收益变 40%。真实规律不会因为一天之差就天翻地覆。参数极其敏感,说明策略拟合的是特定噪声,不是底层结构。

参数越多越危险。 两个参数的策略,过拟合空间有限。十个参数的策略,几乎一定能拼出一组历史最优。但那组参数是数据噪声的形状,不是市场规律。

规则太细。 "周一到周三满仓,周四周五空仓;遇节假日提前一天减仓;某月不交易;涨跌幅超 X% 反向操作。"每加一条规则,都是在拟合历史里的一次特例。特例记多了,对新行情没有指导意义。

回测时间太短。 只用一年数据调参,那一年里的行情特征可能恰好和策略匹配。换一年就不好用了。A 股风格轮换周期通常两到三年,样本期至少跨一轮风格切换,才能检验策略的稳健性。

反面案例:一个"完美"策略

2023 年我跑过一个因子策略。2018 到 2022 年,年化 35%,最大回撤 8%,夏普 2.8。只调了两个参数,样本内/样本外按 7:3 分,样本外年化 28%。

数字漂亮,差点上线。多做了一步走步测试,切成五段逐年跑。前四段都好,第五段(2022 下半年到 2023 年初)突然亏 15%。

回去查原因。策略选的因子在小盘股上表现好,2018 到 2021 年小盘风格占优,策略吃到红利。2022 年底小盘股流动性收紧,因子直接失效。回测整体好看,是因为前面几年的收益把最后一段的亏损盖住了。

如果只看整体样本外年化 28%,不看分段表现,上线后大概率正好赶上最后那段亏损。

小结

过拟合是量化里最容易掉进去的坑,因为回测表现好这件事太有迷惑性。把数据分样本内和样本外,做走步测试,看参数敏感性。回测好不等于策略好,回测在没见过的数据上也好,才算过了第一关。