定义#
过拟合指模型学到了数据里的噪声而不是真实规律。表现是训练数据上表现极好、换到新数据上大幅退化——因为模型把只属于这一段历史的偶然波动也当成了规律。
任何观测值都可以写成「真实规律 + 噪声」两部分。模型太简单会连规律都抓不住(欠拟合),太复杂则会连噪声一起拟合。典型信号有三个:模型复杂度与数据量失衡(样本量小于特征数),训练集误差显著低于测试集,以及参数对数据的微小变动极度敏感。
公式#
观测值的分解:
其中 是噪声。过拟合的模型拟合的是这个复合结构,而不是 。
抑制复杂度的常用手段是正则化,在损失函数上加一个对参数大小的惩罚项:
越大惩罚越强。另一条路是用信息准则在拟合优度和参数个数之间权衡:,,其中 是参数个数、 是似然值、 是样本量。
算一笔账#
先看复杂度和数据量的关系。用 20 个观测拟合一条 10 阶多项式,待估参数有 11 个,剩余自由度只有 ;如果拟合到 19 阶,参数正好 20 个,曲线能穿过每一个点,训练残差平方和为 0、——但这条曲线在数据点之间剧烈摆动,对新数据毫无预测力。
再用 AIC 比一比两个模型。模型 A 有 2 个参数,对数似然 ,。模型 B 有 12 个参数,拟合更好,,。
模型 B 的似然确实更高,但多花的 10 个参数只换来 5 点对数似然,AIC 反而更差。按奥卡姆剃刀,该选 A。
常见问题#
用交叉验证不就能发现过拟合了吗?#
要看怎么切。随机拆分和普通 K-Fold 会让模型在未来的样本上训练、再回到过去评估,等于泄漏信息。金融数据必须按时间切:用按时间的留出验证,或 TimeSeriesSplit 这类时间序列交叉验证,并留出 gap;如果标签用的是未来多日收益、前后有重叠,gap 还要按标签跨度加大。
回测收益很高,就说明策略好吗?#
不能这么推。回测跑在历史数据上,本身就是训练集。参数不断优化去贴合最新行情、只用今天还活着的股票构建历史组合(幸存者偏差),都会让回测曲线漂亮得失真。真正的检验是冻结的样本外数据和真实交易。
变量显著就该放进模型吗?#
不该只看统计显著性。在大量候选变量里挑,总有一些能偶然通过检验;把它们塞进模型,样本内 R² 会上升,样本外表现却可能崩掉。加变量前先问它有没有经济逻辑,再看加了之后样本外是不是真的变好。