← 返回目录
p7.3动手⏱ 约 17 分钟

用 sklearn 预测涨跌:9 个模型里 6 个跑不过基线

准确率 53.79% 听起来不错——而"永远猜多数类"是 53.62%;AUC 最高 0.5307,最低 0.4906

🔎 最后验证 2026-07📚 来源:3 个标的 × 3 个模型的时序切分实测与含成本回测,2026-07-31 于 ECS 实测,输出见 code/outputs/stdout.txt🧰 scikit-learn 1.9.0、pandas 3.0.5、Python 3.12.13
为什么学这个

用机器学习预测次日涨跌,是几乎所有量化教程都会做的事。区别在于怎么报结果。

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.0551.14-0.080.5214
sh.000300随机森林52.9051.14+1.770.5307
sh.000300梯度提升51.6451.14+0.500.5232
sh.600000逻辑回归53.4553.62-0.170.5282
sh.600000随机森林53.7953.62+0.170.5210
sh.600000梯度提升52.1753.62-1.450.5054
sh.600019逻辑回归52.0353.24-1.210.4931
sh.600019随机森林53.0653.24-0.170.4954
sh.600019梯度提升50.7353.24-2.500.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.36281
sh.000300随机森林2.82-0.95+3.78401
sh.000300梯度提升-1.03-0.95-0.08428
sh.600000逻辑回归-4.625.03-9.65214
sh.600000随机森林0.665.03-4.37118
sh.600000梯度提升-5.045.03-10.07390
sh.600019逻辑回归-7.71-0.43-7.2858
sh.600019随机森林-3.76-0.43-3.33130
sh.600019梯度提升-11.84-0.43-11.41384

9 个组合里只有 1 个跑赢买入持有(sh.000300 随机森林,+3.78 pp)。

而它恰好也是分类指标最好的那个(相对基线 +1.77 pp、AUC 0.5307)——但这种一致性在其余 8 个里并不成立

四、换手是这类模型的天敌

标的模型零成本%10bp%20bp%零→20bp 衰减
sh.000300随机森林11.952.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 是零成本算的吗?

五、怎么读这类结果(四条)

  1. 准确率必须减去基线。测试集上涨占比往往不是 50%,"永远猜多数类"就能拿到基线准确率
  2. AUC 比准确率更有信息量——不受阈值与类别比例影响
  3. 分类指标和策略收益之间没有简单映射:准确率高一点可能全被换手成本吃掉;准确率略低但押对了大波动反而赚钱
  4. 正确的报法是四个一起给:准确率 + 基线 + AUC + 接回测后的含成本收益

只报准确率的,基本可以直接跳过。

六、那这件事还值不值得做

值得——但要换一个目的。

错误的目的正确的目的
找到一个能预测涨跌的模型量化"可预测性"到底有多少(答案:AUC 约 0.5)
用 ML 替代策略研究用 ML 做特征筛选与非线性关系探索
提高准确率搞清楚提高准确率能不能变成钱(本节:多数不能)

本节最有价值的产出不是模型,是那张"9 个里 6 个跑不过基线"的表。

它给了你一个基准感:下次看到"AI 预测准确率 65%",你会立刻问——基线是多少?AUC 是多少?扣成本之后呢?

❓ 测验
一份材料说「我们的 AI 模型预测次日涨跌准确率达到 58%,显著优于随机的 50%」。最该先问什么?
✏️ 填空
二分类预测涨跌的正确基线不是 50%,而是「永远猜 ___ 类」的准确率。

📌 免责:本课为技术教学,模型与特征均为演示口径,标的按代码取样(非精选),不构成任何交易信号或投资建议

✅ 小结

四件事:

  1. 9 个模型里 6 个跑不过基线,超过的 3 个最多也只高 1.77 pp;sh.600019 上三个模型全部低于基线,梯度提升低 2.50 ppAUC 最高 0.5307、最低 0.4906(比抛硬币还差)
  2. "准确率 53.79%"单独拿出来没有意义——测试集上涨占比 46.38%,"永远猜跌"就有 53.62%。正确基线是"永远猜多数类",不是 50%
  3. 分类指标好 ≠ 策略赚钱:9 个组合里只有 1 个跑赢买入持有(+3.78 pp);而零成本 11.95% 的那个,20bp 下是 -5.57%,衰减 17.52 pp
  4. 正确的报法是四个一起给:准确率 + 基线 + AUC + 含成本回测。只报准确率的,基本可以直接跳过

这件事仍然值得做,但目的要换:不是"找到能预测涨跌的模型",而是"量化可预测性到底有多少"——本节给出的答案是 AUC 约 0.5

本节最有价值的产出不是模型,是那张"9 个里 6 个跑不过基线"的表。

下一节回答一个前置问题:为什么本节要用时序切分、为什么标准化只用训练集?——如果不这么做,同样这批数据能跑出多好看的结果。

下一节 → 时序 CV 与特征泄漏:金融 ML 的两个致命错
🔎 来源与核验· 3 条,点开核对
本节每个关键论断都对应一个可追溯的来源 —— 这是本课程"靠谱、不过时"的底线。
「分类结果(前 70% 训练/后 30% 测试):sh.000300 逻辑回归 51.05%/基线 51.14%/AUC 0.5214、随机森林 52.90%/+1.77pp/0.5307、梯度提升 51.64%/+0.50pp/0.5232;sh.600000 基线 53.62%,三模型 53.45/53.79/52.17%,AUC 0.5282/0.5210/0.5054;sh.600019 基线 53.24%,三模型 52.03/53.06/50.73%,AUC 0.4931/0.4954/0.4906」
📚 本节 code/ml_predict.py,2026-07-31 于 ECS 实测,输出见 code/outputs/stdout.txt✓ 已核验 2026-07
「接入最朴素策略(预测涨则次日满仓、否则空仓,双边成本 10bp)后:9 个组合中仅 sh.000300 随机森林跑赢买入持有(2.82% vs -0.95%,+3.78 pp);其余 8 个超额为负,最差 -11.41 pp」
📚 同上实测✓ 已核验 2026-07
「成本敏感性:sh.000300 随机森林 零成本 11.95% → 10bp 2.82% → 20bp -5.57%(衰减 17.52 pp);梯度提升衰减 17.96 pp」
📚 同上实测✓ 已核验 2026-07
特征 10 个,全部仅用截止当日信息;标准化只用训练集统计量;测试集为时序上最后 30%。结论仅针对本样本、本特征集与日频次日涨跌标签,不外推。
智图软件的赞赏码
都看到这了,打个赏呗!
接下来 · p7.4
时序 CV 与特征泄漏:泄漏有多严重,取决于标签重不重叠
继续读下一节 →