用 sklearn 预测涨跌:9 个模型里 6 个跑不过基线
准确率 53.79% 听起来不错——而"永远猜多数类"是 53.62%;AUC 最高 0.5307,最低 0.4906
用机器学习预测次日涨跌,是几乎所有量化教程都会做的事。区别在于怎么报结果。
10 个特征、3 个模型、3 个标的、严格时序切分,实测:
标的 模型 准确率% 基线% 相对基线 AUC
sh.600000 随机森林 53.79 53.62 +0.17 0.5210
sh.600000 逻辑回归 53.45 53.62 -0.17 0.5282
sh.600019 梯度提升 50.73 53.24 -2.50 0.4906
9 个模型里,只有 3 个超过"永远猜多数类"这个基线,最多也只高出 1.77 个百分点。
AUC 最高 0.5307,最低 0.4906——有的模型比抛硬币还差。
接到最朴素的策略上、扣 10bp 成本之后,9 个组合里只有 1 个跑赢买入持有。
一个天气预报说"明天不下雨",准确率 70%。
听起来不错——直到你发现:这个地方本来就有 70% 的日子不下雨。
"永远说不下雨"也能拿 70%。
准确率必须减去基线,剩下的才是信息。
一、口径(这一节的价值一半在这里)
| 做法 | 为什么 | |
|---|---|---|
| 切分 | 前 70% 训练、后 30% 测试,训练永远在测试之前 | 不用随机 K 折——为什么见 p7.4 |
| 标准化 | 均值方差只用训练集算 | 用全样本会泄漏——为什么见 p7.4 |
| 标签 | 次日收盘 > 今日收盘 | 严格 shift(-1) |
| 特征 | 10 个,全部只用截止当日的信息 | 收益、均线偏离、波动、量比、RSI、区间位置 |
| 基线 | "永远猜多数类"的准确率 | 和 50% 比是没有意义的 |
二、分类指标:9 个里 6 个跑不过基线
| 标的 | 模型 | 准确率% | 基线% | 相对基线 | AUC |
|---|---|---|---|---|---|
| sh.000300 | 逻辑回归 | 51.05 | 51.14 | -0.08 | 0.5214 |
| sh.000300 | 随机森林 | 52.90 | 51.14 | +1.77 | 0.5307 |
| sh.000300 | 梯度提升 | 51.64 | 51.14 | +0.50 | 0.5232 |
| sh.600000 | 逻辑回归 | 53.45 | 53.62 | -0.17 | 0.5282 |
| sh.600000 | 随机森林 | 53.79 | 53.62 | +0.17 | 0.5210 |
| sh.600000 | 梯度提升 | 52.17 | 53.62 | -1.45 | 0.5054 |
| sh.600019 | 逻辑回归 | 52.03 | 53.24 | -1.21 | 0.4931 |
| sh.600019 | 随机森林 | 53.06 | 53.24 | -0.17 | 0.4954 |
| sh.600019 | 梯度提升 | 50.73 | 53.24 | -2.50 | 0.4906 |
"准确率 53.79%"这个数,单独拿出来没有任何意义。
因为测试集的上涨占比是 46.38%——也就是说下跌天数更多,"永远猜跌"就能拿到 53.62%。
这个模型比"永远猜跌"只高 0.17 个百分点。
而 sh.600019 上的三个模型,没有一个超过基线,梯度提升还低了 2.50 个百分点。
AUC 比准确率更有信息量:它不受阈值与类别比例影响。
- AUC = 0.50 → 完全没有区分度
- 本节最高 0.5307,最低 0.4906(比抛硬币还差)
- 0.52~0.55 在日频股票预测上,已经属于常见上限
🔧 动手做:让 ML 预测涨跌,看它比"永远猜涨"强多少(6 分钟)
跑 python ml_predict.py。它用一堆特征、逻辑回归和随机森林预测第二天涨跌。
你会看到(实测):准确率 53.79% 听着不错——但 "永远猜多数类"的基线就是 53.62%。9 个模型里只有 1 个真正超过基线,AUC 最高才 0.5307、最低 0.4906(还不如瞎猜)。
想明白:准确率这个数会骗人——涨的日子本来就比跌的多,你无脑猜"涨"就有 53.62%。真正的对照不是 50%,是多数类基线。而且就算 AUC 略高于 0.5,分类指标好 ≠ 策略赚钱(方向对但赢小输大照样亏)。"用 AI 预测股市"这件事,先问:它比无脑猜多数类强了几个 bp?
三、分类指标好 ≠ 策略赚钱
最朴素的接法:预测涨 → 次日满仓;预测跌 → 空仓。双边成本 10bp。
| 标的 | 模型 | 策略年化% | 买入持有% | 超额 | 换手次数 |
|---|---|---|---|---|---|
| sh.000300 | 逻辑回归 | -3.31 | -0.95 | -2.36 | 281 |
| sh.000300 | 随机森林 | 2.82 | -0.95 | +3.78 | 401 |
| sh.000300 | 梯度提升 | -1.03 | -0.95 | -0.08 | 428 |
| sh.600000 | 逻辑回归 | -4.62 | 5.03 | -9.65 | 214 |
| sh.600000 | 随机森林 | 0.66 | 5.03 | -4.37 | 118 |
| sh.600000 | 梯度提升 | -5.04 | 5.03 | -10.07 | 390 |
| sh.600019 | 逻辑回归 | -7.71 | -0.43 | -7.28 | 58 |
| sh.600019 | 随机森林 | -3.76 | -0.43 | -3.33 | 130 |
| sh.600019 | 梯度提升 | -11.84 | -0.43 | -11.41 | 384 |
9 个组合里只有 1 个跑赢买入持有(sh.000300 随机森林,+3.78 pp)。
而它恰好也是分类指标最好的那个(相对基线 +1.77 pp、AUC 0.5307)——但这种一致性在其余 8 个里并不成立。
四、换手是这类模型的天敌
| 标的 | 模型 | 零成本% | 10bp% | 20bp% | 零→20bp 衰减 |
|---|---|---|---|---|---|
| sh.000300 | 随机森林 | 11.95 | 2.82 | -5.57 | -17.52 |
| sh.000300 | 梯度提升 | 8.35 | -1.03 | -9.61 | -17.96 |
| sh.600000 | 梯度提升 | 3.25 | -5.04 | -12.67 | -15.92 |
| sh.600019 | 梯度提升 | -4.16 | -11.84 | -18.91 | -14.75 |
零成本下 11.95% 的那个,20bp 成本下是 -5.57%。
这就是 p4.2 与 p5.7 的老问题在 ML 上的重现:日频信号天然高换手,而高换手对成本极度敏感。
任何"AI 预测涨跌年化 X%"的说法,先问:那个 X 是零成本算的吗?
五、怎么读这类结果(四条)
- 准确率必须减去基线。测试集上涨占比往往不是 50%,"永远猜多数类"就能拿到基线准确率
- AUC 比准确率更有信息量——不受阈值与类别比例影响
- 分类指标和策略收益之间没有简单映射:准确率高一点可能全被换手成本吃掉;准确率略低但押对了大波动反而赚钱
- 正确的报法是四个一起给:准确率 + 基线 + AUC + 接回测后的含成本收益
只报准确率的,基本可以直接跳过。
六、那这件事还值不值得做
值得——但要换一个目的。
| 错误的目的 | 正确的目的 |
|---|---|
| 找到一个能预测涨跌的模型 | 量化"可预测性"到底有多少(答案:AUC 约 0.5) |
| 用 ML 替代策略研究 | 用 ML 做特征筛选与非线性关系探索 |
| 提高准确率 | 搞清楚提高准确率能不能变成钱(本节:多数不能) |
本节最有价值的产出不是模型,是那张"9 个里 6 个跑不过基线"的表。
它给了你一个基准感:下次看到"AI 预测准确率 65%",你会立刻问——基线是多少?AUC 是多少?扣成本之后呢?
📌 免责:本课为技术教学,模型与特征均为演示口径,标的按代码取样(非精选),不构成任何交易信号或投资建议。
四件事:
- 9 个模型里 6 个跑不过基线,超过的 3 个最多也只高 1.77 pp;sh.600019 上三个模型全部低于基线,梯度提升低 2.50 pp。AUC 最高 0.5307、最低 0.4906(比抛硬币还差)
- "准确率 53.79%"单独拿出来没有意义——测试集上涨占比 46.38%,"永远猜跌"就有 53.62%。正确基线是"永远猜多数类",不是 50%
- 分类指标好 ≠ 策略赚钱:9 个组合里只有 1 个跑赢买入持有(+3.78 pp);而零成本 11.95% 的那个,20bp 下是 -5.57%,衰减 17.52 pp
- 正确的报法是四个一起给:准确率 + 基线 + AUC + 含成本回测。只报准确率的,基本可以直接跳过
这件事仍然值得做,但目的要换:不是"找到能预测涨跌的模型",而是"量化可预测性到底有多少"——本节给出的答案是 AUC 约 0.5。
本节最有价值的产出不是模型,是那张"9 个里 6 个跑不过基线"的表。
下一节回答一个前置问题:为什么本节要用时序切分、为什么标准化只用训练集?——如果不这么做,同样这批数据能跑出多好看的结果。
🔎 来源与核验· 3 条,点开核对
