《量化交易入门》第 11 章:机器学习入门——过拟合与模型陷阱
11.1 机器学习到底在”学”什么
前面十章,规则都是我们拍脑袋定的:均线金叉买入、跌破 20 日线止损。机器学习想干的事更进一步——规则也让机器自己从数据里总结。
听起来很魔幻,拆开看其实只有三件事:
- 给它一堆带答案的例子(比如”这一天的涨跌幅、成交量、换手率 → 次日是涨是跌”);
- 选一个可调参数的模型(小到一条直线的两个系数,大到神经网络的几百万个参数);
- 不断调整参数,让模型在这些例子上的预测误差越来越小。
调完的模型如果在没见过的新数据上仍然准,叫学到了规律;只在旧例子上准,就是这一章的主角——过拟合。
11.2 一条直线打败”背书机器”
光讲概念不直观,我们用纯 Python 做个实验,不依赖任何第三方库,复制即可运行。我们先假装有一条真实规律 y = 2x + 1,再给它撒点随机噪声,制造 40 个样本:前 28 个当”历史数据”训练模型,后 12 个当”未来”检验。
# -*- coding: utf-8 -*-import random
random.seed(42)
# 真实世界:y 基本由一条直线决定,外加噪声def true_rule(x): return 2.0 * x + 1.0
# 造 40 个样本,再按时间顺序切成:前 28 训练,后 12 测试data = []for i in range(40): x = i * 0.5 noise = random.uniform(-1.5, 1.5) data.append((x, true_rule(x) + noise))
train, test = data[:28], data[28:]
def mse(points, predict): # 均方误差:预测和真实差得越远,数值越大 return sum((y - predict(x)) ** 2 for x, y in points) / len(points)
# 模型A:背书机器——训练数据原样背下来,预测时找最近的点(1近邻)def memorize_predict(x): return min(train, key=lambda p: abs(p[0] - x))[1]
# 模型B:只学两个数——一条直线 y = a*x + b(最小二乘公式)n = len(train)mx = sum(x for x, _ in train) / nmy = sum(y for _, y in train) / na = sum((x - mx) * (y - my) for x, y in train) / sum((x - mx) ** 2 for x, _ in train)b = my - a * mxdef line_predict(x): return a * x + b
print("直线学到的参数: a = %.3f, b = %.3f(真实是 2.0 和 1.0)" % (a, b))print("背书机器 训练误差: %.3f 测试误差: %.3f" % (mse(train, memorize_predict), mse(test, memorize_predict)))print("简单直线 训练误差: %.3f 测试误差: %.3f" % (mse(train, line_predict), mse(test, line_predict)))运行结果:
直线学到的参数: a = 1.999, b = 0.716(真实是 2.0 和 1.0)背书机器 训练误差: 0.000 测试误差: 80.363简单直线 训练误差: 0.780 测试误差: 1.035结果很反直觉:训练误差为零的”满分模型”,到了新数据上一塌糊涂;训练时不完美的直线,反而是真学到了东西(a≈1.999 几乎就是真实的 2.0)。背书机器把每个历史噪声都当成了规律刻进脑子——它没有”理解”,它只是记性好。
这就是过拟合的全部本质:模型把数据里的偶然噪声,误当成了永恒规律。
11.3 回测越漂亮,未来越危险
把上面的实验翻译成交易语言,你会后背发凉:
- 训练数据 = 你的历史行情;
- 背书机器 = 参数极多、极度灵活的模型(比如把几千个技术指标组合、神经网络、决策树一路调到训练集完美);
- 训练误差为零 = 回测年化 80%、最大回撤 2%、曲线一路向北;
- 测试误差 80 = 真金白银实盘后的亏损。
金融数据的信噪比极低——一天的涨跌里,“规律”占的比例可能还没有随机噪声大。模型越努力,越容易把 2020 年疫情那几根偶然的大阳线、某天午间的乌龙指、甚至某次停牌,都当成可以预测未来的信号。
所以请记住这个反常识的排序:回测漂亮 → 警惕;回测平庸但稳健 → 反而可能有真东西。 第 5 章回测讲的”样本外检验”,在机器学习时代不是加分项,是生死线。
11.4 量化里最常见的三个模型陷阱
陷阱一:样本泄露(最隐蔽,也最致命)。训练时,模型”偷看”了未来才能知道的信息。比如用”当天收盘价”预测”当天涨跌”——收盘了你当然知道涨跌,可下单时收盘价还没出来。再比如做标准化、选因子时用了全量数据的均值和排名,等于提前知道了答案。这种模型回测个个股神,实盘集体失忆。规避方法只有一个死规矩:任何计算都只能用到当时那一刻之前的数据,严格按时间切分。
陷阱二:参数挖掘(试得够多,总会中)。如果一个策略是你试了 200 组参数里收益最高的那组,它大概率不是好策略,只是随机波动里的运气王。同样的逻辑:找 1000 只猴子掷硬币,总有一只连对十次,但那不是预言家。规避方法:试了多少组参数要记账;在没参与调参的”验证集”上独立检验;参数在邻近数值下都要稳定(5 日均线赚钱、4 日和 6 日就亏,这不是规律是彩票)。
陷阱三:标签幻觉。机器学习要先定义”预测什么”。如果标签是”明天涨不涨”,模型会发现只要每天都猜”不涨”就能对一半多,因为 A 股本来就长期平多涨少——这是正确率 60% 的废物模型。预测涨跌方向是交易里最难、最拥挤的题,新手不如从更朴素的标签入手,比如”未来五天波动率是否放大""相对沪深 300 的超额收益排序”。
11.5 小白的避坑清单
- 数据三段切:训练集调参数、验证集选模型、测试集最后只碰一次当”期末考试”。时间序列严禁随机打乱,必须按时间切;
- 样本外要留够:至少留出最近一两年,最好包含一轮完整牛熊,没见过暴跌的模型不算毕业;
- 用滚动验证(Walk-forward):模拟真实节奏,用 2018–2020 训练、交易 2021,再用 2019–2021 训练、交易 2022,逐年滚动;
- 特征宁少勿多:每加一个指标,过拟合风险就高一截。先把第 6 章的动量、波动几个经典因子用扎实,远胜于堆两百个说不清含义的特征;
- 盯样本外,不盯回测冠军:模型上线后持续跟踪实盘与回测的偏差,一旦行为系统性走样,立刻下线复查;
- 先质疑数据,再相信模型:90% 的”AI 策略翻车”,根因是数据错误和未来函数,不是算法不够高级。
11.6 这一章你该记住的
- 机器学习 = 用数据自动调参数的模型,在旧数据上准不算本事,在没见过的数据上准才算;
- 过拟合就是把历史噪声当规律——训练误差为零的”背书机器”,测试误差可以高达八十多倍;
- 金融数据噪声极大,回测越完美越要怀疑;
- 三大陷阱:样本泄露、参数挖掘、标签幻觉;
- 规避靠纪律:按时间切分、独立样本外、滚动验证、少而稳的特征。
机器学习不是圣杯,它只是把”过拟合”这件事自动化、规模化了。但只要守住样本外这条线,它依然是你工具箱里一把锋利的刀。
到这里,从规则、回测、因子、风控、成本、实盘到机器学习,技术地图已经拼完。最后一章:从零到一的行动清单——量化之路怎么走,我们不聊新概念,只解决一个问题:关掉这篇教程之后,你具体该按什么顺序动手、每个阶段花多久、怎么判断自己可以进入下一步,给你一张能贴在显示器边上的路线图。
📚 《量化交易入门》系列:零基础小白向量化交易,每章一个主题 + 可运行 Python 示例。第 11 章已读,系列最终章《从零到一的行动清单:量化之路怎么走》明天见,全系列 12 章即将完结。