第 4 章 · 04 Boosting 与实战


文档摘要

第 4 章 · 04 Boosting 与实战 本节摘要:这是本章的收尾与高潮——Boosting 是当前机器学习选股的主力模型。与上节随机森林的 bagging(并行、降方差)不同,Boosting 是串行的——每棵新树专门拟合之前树的残差(预测错的部分),「逐步纠错」地把弱学习器组合成强学习器。本节讲清 Boosting 家族的演进:AdaBoost(样本加权)→ GBDT(梯度提升,拟合负梯度)→ XGBoost/LightGBM(工业级工程优化),以及关键的梯度提升原理与时序交叉验证防过拟合。华泰人工智能系列第 6 篇(Boosting)、第 7 篇(Python 实战)、第 14/16 篇(时序交叉验证)正是这套体系。

第 4 章 · 04 Boosting 与实战

本节摘要:这是本章的收尾与高潮——Boosting 是当前机器学习选股的主力模型。与上节随机森林的 bagging(并行、降方差)不同,Boosting 是串行的——每棵新树专门拟合之前树的残差(预测错的部分),「逐步纠错」地把弱学习器组合成强学习器。本节讲清 Boosting 家族的演进:AdaBoost(样本加权)→ GBDT(梯度提升,拟合负梯度)→ XGBoost/LightGBM(工业级工程优化),以及关键的梯度提升原理时序交叉验证防过拟合。华泰人工智能系列第 6 篇(Boosting)、第 7 篇(Python 实战)、第 14/16 篇(时序交叉验证)正是这套体系。读完本节,你掌握机器学习选股的现代主力模型,以及 AI 选股最容易踩的坑——时序数据绝不能用随机交叉验证

内容来源:仓库研报 华泰人工智能系列第 6 篇(Boosting)+ 第 7 篇(Python 实战)+ 第 14/16 篇(时序交叉验证),知识结构化整理。

⚠️ 学习提示:Boosting(尤其 XGBoost/LightGBM)是 2015-2020 年 Kaggle 量化比赛的王者,也是众多机构 AI 选股的基线。但它的过拟合风险比随机森林高得多,调参与时序 CV 是实战关键。

学习目标

阅读完本节,你应当能够:

  1. 区分 bagging(随机森林)与 boosting(GBDT)的核心思想。
  2. 说清 AdaBoost → GBDT → XGBoost/LightGBM 的演进与各自改进点。
  3. 解释梯度提升为什么是「拟合负梯度」。
  4. 掌握 Boosting 的关键超参(学习率、树数、深度)与调参逻辑。
  5. 理解为什么 AI 选股必须用时序交叉验证,而非随机 k 折。

一、Boosting vs Bagging:两种集成思路

上节讲随机森林是 bagging——多棵树并行训练,各自独立,最后投票/平均,核心是降低方差

Boosting 完全不同——多棵树串行训练,每棵新树专门纠前一棵的错,核心是降低偏差

维度 Bagging(随机森林) Boosting(GBDT)
训练方式 并行 串行
每棵树目标 独立拟合 Y 拟合之前树的残差
核心作用 降低方差 降低偏差
过拟合风险 较低 较高
超参敏感
典型精度

二、AdaBoost:样本加权的鼻祖

AdaBoost(Adaptive Boosting)是 Boosting 的最早形式(1995),思想简单:

  1. 训练第一棵树,所有样本权重相等。
  2. 计算每棵树的误差,增加误分类样本的权重(让下一棵树更关注错分的样本)。
  3. 训练下一棵树(基于新权重),重复 T 轮。
  4. 最终预测:每棵树按其准确度加权投票。
每轮:增加错分样本权重 → 下一棵树聚焦于「之前分错的难样本」 最终:T 棵树加权组合

AdaBoost 简单有效,但有几个局限:

  • 只能做分类(原版)。
  • 对噪声敏感(噪声样本被反复加权,放大噪声影响)。
  • 损失函数固定(指数损失),不够灵活。

这些局限推动了 GBDT 的出现。

三、GBDT:梯度提升,拟合负梯度

GBDT(Gradient Boosting Decision Tree)把 Boosting 推广为「拟合损失函数的负梯度」——这统一了回归与分类,且允许任意可微损失函数。

核心算法:

  1. 初始化预测 F_0 = 常数(如训练集均值)。
  2. 对每轮 t = 1, 2, ..., T:
    • 计算负梯度 r_i = -∂L(y_i, F(x_i)) / ∂F(x_i)(负梯度又称「伪残差」)。
    • 训练一棵树拟合 r_i(注意:拟合负梯度,不是拟合 Y)。
    • 更新 F_t = F_(t-1) + ν · h_t(x),其中 ν 是学习率。
负梯度 = 损失函数下降最快的方向 → 每棵树沿负梯度方向修正预测

为什么叫「梯度提升」:每棵新树本质是在做梯度下降——只是梯度下降是在函数空间(每步加一棵树),而非参数空间(每步改参数)。

损失函数 任务 负梯度
平方误差 回归 残差 y - ŷ
对数损失 二分类 y - p(预测概率的误差)
Huber 稳健回归 截断的残差(抗极值)

💡 核心心法:GBDT 的精髓在于「拟合负梯度而非 Y 本身」。这让 Boosting 能用任意可微损失函数——回归、分类、稳健回归、分位数回归都可以。这种灵活性是 AdaBoost 不具备的。

四、XGBoost 与 LightGBM:工业级工程优化

GBDT 思想虽好,但训练慢(每棵树要遍历所有特征的所有切分点)。XGBoost(2014)与 LightGBM(2017)在工程上大幅优化,使 GBDT 能处理千万级样本:

XGBoost 的关键改进

  • 正则化目标:目标函数加入树的复杂度惩罚(叶节点数 + 叶值 L2),防止过拟合。
  • 二阶导数:用损失函数的一阶 + 二阶导数(梯度 + 海森)做近似切分,收敛更快。
  • 列抽样:借鉴随机森林,每次切分随机选部分特征,降方差 + 加速。
  • 缺失值处理:自动学习缺失值的默认分裂方向,无需填充。
  • 并行化:特征级别并行(预排序),训练大幅加速。

LightGBM 的进一步优化

  • Leaf-wise 生长:不同于 XGBoost 的 level-wise(逐层生长),LightGBM 选当前增益最大的叶节点继续分裂,同样树数下精度更高(但容易过拟合,需限深度)。
  • 直方图算法:把连续特征分桶成直方图,切分点搜索从 O(样本数) 降到 O(桶数),大幅加速。
  • GOSS(基于梯度的单边采样):保留梯度大的样本(难分的),随机采样梯度小的(易分的),进一步加速。
  • EFB(互斥特征捆绑):把稀疏互斥的特征捆绑成一个,降维加速。
模型 训练速度 内存 精度 适用
GBDT(原版) 教学
XGBoost 通用、稳定
LightGBM 高(略过拟合风险) 大数据、低延迟

💡 关键观察:在 A 股选股(几千只股票、十几年数据、几百特征),LightGBM 是默认推荐——训练快、内存友好、精度与 XGBoost 持平。XGBoost 在数据量中等、追求稳定性时仍是好选择。

五、Boosting 的关键超参

Boosting 的超参比随机森林敏感得多,主要分三组:

学习率(learning_rate / eta)

F_t = F_(t-1) + learning_rate · h_t(x)
  • 学习率小(如 0.01):每棵树贡献小,需要更多树,但泛化好。
  • 学习率大(如 0.3):每棵树贡献大,树数少,但容易过拟合。

经验:小学习率 + 多树 > 大学习率 + 少树。典型组合 learning_rate=0.05, n_estimators=500

树数(n_estimators)

树数越多,训练集拟合越好,但太多会过拟合。配合早停(early stopping):在验证集表现不再提升时停止训练。

树的复杂度

  • max_depth:每棵树深度,3-8 常用。Boosting 用弱学习器,树通常比随机森林浅。
  • min_samples_leaf / min_child_weight:叶节点最小样本数,设大一点防过拟合。
  • subsample:每棵树用的样本比例(行采样),0.7-0.9 常用。
  • colsample_bytree:每棵树用的特征比例(列采样),0.7-0.9 常用。

六、时序交叉验证:AI 选股的命脉

这是本节最关键、最容易被忽视的部分。机器学习标准库(sklearn)默认用随机 k 折交叉验证,但在选股数据上绝对不能这么用——它会引入未来函数。

为什么随机 CV 会引入未来函数

随机 k 折把所有样本打乱后均分,训练集与验证集时点混杂——训练集里可能包含 2020 年的数据,验证集里是 2019 年的数据。模型在「未来」训练,在「过去」验证,这不是真实的样本外

错误做法 随机k折: 训练集:2015, 2017, 2019, 2021 ← 训练时看到了 2021 验证集:2016, 2018, 2020 ← 验证的却是 2020 正确做法 时序CV: 训练集:2010-2014 验证集:2015 下一折: 训练集:2010-2015 验证集:2016 ... 滚动向前

时序 CV 的正确做法

时序交叉验证(Time Series CV / Walk-Forward Validation):

  1. 按时间排序所有样本。
  2. 第一折:训练用前 T1 期,验证用 T1+1 期。
  3. 第二折:训练用前 T2 期(T2 > T1),验证用 T2+1 期。
  4. 逐折向前滚动,直到覆盖全部数据。

sklearn 提供 TimeSeriesSplit,实战直接用:

from sklearn.model_selection import TimeSeriesSplit tscv = TimeSeriesSplit(n_splits=5) for train_idx, val_idx in tscv.split(X): X_train, X_val = X[train_idx], X[val_idx] # 训练 + 评估

华泰 AI 14/16 的核心思想

华泰人工智能系列第 14、16 篇专门强调时序 CV 在 AI 选股中的重要性:

  • 金融数据是时序依赖的:同一只股票相邻日期的收益高度相关,随机 CV 会让训练集与验证集信息泄漏。
  • 市场结构会变:不同时期的市场规律不同,时序 CV 模拟「用过去训练、预测未来」的真实场景。
  • 样本外才有意义:任何回测的 IC/IR/夏普都必须基于时序 CV 的样本外预测,不能用训练集表现

⚠️ 学习提示:这是 AI 选股最容易踩的坑,也是新手与专家的核心区别。任何机器学习选股代码,如果用了随机 k 折 CV,结果都不可信——它的「样本外」表现其实包含了未来信息,真实部署时会大幅缩水。务必审查每份 AI 选股代码的 CV 策略。

七、Python 实战:LightGBM 选股模板

下面是一个机器学习选股的最小实战模板,体现本章所有要点:

import lightgbm as lgb import pandas as pd from sklearn.model_selection import TimeSeriesSplit # 1. 准备特征与标签(回归任务:预测未来20日收益) # X: 因子矩阵(每行一只股票某日,每列一个因子) # Y: 未来20日涨跌幅(用 shift(-20) 算,注意未来函数) # date: 日期列,用于时序切分 # 2. 时序交叉验证 tscv = TimeSeriesSplit(n_splits=5) all_predictions = [] for train_idx, val_idx in tscv.split(X): X_train, Y_train = X.iloc[train_idx], Y.iloc[train_idx] X_val, Y_val = X.iloc[val_idx], Y.iloc[val_idx] # 3. 训练 LightGBM model = lgb.LGBMRegressor( n_estimators=500, learning_rate=0.05, max_depth=6, num_leaves=31, subsample=0.8, colsample_bytree=0.8, random_state=42 ) model.fit( X_train, Y_train, eval_set=[(X_val, Y_val)], callbacks=[lgb.early_stopping(50)] # 早停 ) # 4. 预测验证集 pred = model.predict(X_val) all_predictions.append(pd.DataFrame({ 'date': date.iloc[val_idx], 'stock': stock.iloc[val_idx], 'pred': pred, 'actual': Y_val })) # 5. 合并所有验证集预测,计算 IC/分层回测 results = pd.concat(all_predictions) # 按 date 分组算 IC,按 pred 排序分层算多空收益

几个关键工程要点:

  • 特征工程:因子矩阵要先做去极值、标准化、行业市值中性化(第 2 章第 02 节)。
  • 早停:用验证集损失做早停,防止过拟合(树数自动停在最优处)。
  • 特征重要性:model.feature_importances_ 拿到因子重要性,用于因子筛选与失效排查。
  • 样本外评估:最终 IC/IR/夏普必须用 results(验证集预测)算,不能用训练集预测
  • 滚动训练:实战中每隔一段时间(如每月)用最新数据重训模型,适应市场结构变化。

八、Boosting 在选股里的实战经验

华泰 AI 6-7 的实证给出几个关键经验:

  1. Boosting 常胜过随机森林:在 A 股选股,GBDT/XGBoost/LightGBM 的样本外 IC 通常高于随机森林与 SVM,是机器学习选股的主力。
  2. 特征重要性是金矿:Boosting 的特征重要性常揭示出人工想不到的有效因子组合,是因子研发的重要工具。
  3. 过拟合是最大敌人:Boosting 训练集表现可以无限好,但样本外可能远不如训练集——务必用早停 + 时序 CV 严格控制。
  4. 小学习率 + 多树 + 早停:这是 Boosting 调参的黄金组合,远胜大学习率 + 少树。
  5. 不要全信回测:即使时序 CV 的样本外表现好,实盘部署前还要做模拟盘验证——回测永远乐观于实盘。

💡 核心心法:Boosting 是机器学习选股的「重武器」,精度高、灵活性强,但也最危险——过拟合风险高、调参敏感。用 Boosting 时,严防过拟合比追求精度更重要:宁可模型简单一点、IC 低一点,也要确保样本外稳健。

九、本章总结:从线性到 Boosting

回顾本章四个模型的递进:

每个模型都有它的定位:

  • 线性模型:必备基线,样本外往往不输复杂模型。
  • SVM:小样本、非线性分类利器,但训练慢。
  • 随机森林:稳健、好调参、出特征重要性、OOB 评估,工业级基线。
  • Boosting:精度之王,机器学习选股主力,但过拟合风险最高。

💡 关键观察:在 A 股选股,工业级的标准做法是同时跑线性、随机森林、Boosting 三个模型,比较样本外 IC/IR,选最稳健的。任何一个模型单独都可能在某段时期失效,多模型集成(类似第 2 章因子合成的思想)是稳健的选择。

本节要点回顾

  1. Boosting vs Bagging:Boosting 串行拟合残差降偏差,Bagging 并行投票降方差;Boosting 精度高但过拟合风险大。
  2. AdaBoost:样本加权鼻祖,简单但对噪声敏感、损失函数固定。
  3. GBDT:梯度提升,拟合损失函数的负梯度(伪残差),支持任意可微损失,统一回归与分类。
  4. XGBoost:正则化目标 + 二阶导 + 列抽样 + 缺失处理 + 并行,工业级 GBDT。
  5. LightGBM:Leaf-wise 生长 + 直方图 + GOSS + EFB,训练更快、内存更小,A 股选股默认推荐。
  6. 关键超参:小学习率(0.05)+ 多树(500)+ 浅深度(4-8)+ 行列采样(0.7-0.9)+ 早停,是 Boosting 调参的黄金组合。
  7. 时序 CV 是命脉:随机 k 折会引入未来函数,AI 选股必须用时序交叉验证;sklearn 的 TimeSeriesSplit 直接可用;华泰 AI 14/16 专门强调。
  8. 实战模板:时序 CV + LightGBM + 早停 + 特征重要性 + 样本外评估,是机器学习选股的标准骨架。
  9. 多模型集成:工业级同时跑线性/随机森林/Boosting,比较选最稳健,避免单模型失效。

下一章,我们离开传统机器学习,进入神经网络与深度学习选股——用更深的网络、更多的参数,挖掘因子间的深层非线性关系。


发布者: 作者: 灏天文库 转发
评论区 (0)
U