4. XGBoost核心原理
在量化选股任务中,我们面对的是高噪声、低信噪比、非线性且存在大量缺失值的截面数据。XGBoost之所以成为这类任务的常用基线模型,核心在于它把“加法模型 + 二阶优化 + 显式正则化”组合成了一套可工程化落地的框架。理解这套框架,比记住参数更重要。
一、目标函数:从损失到结构风险
XGBoost是一个加法模型。设第 t 轮新增一棵树 ft,则预测值为:
ŷ_i^(t) = ŷ_i^(t-1) + f_t(x_i)
其目标函数由两部分构成:训练损失与正则化项。
Obj = Σ_i l(y_i, ŷ_i) + Σ_k Ω(f_k)
Ω(f) = γT + ½λ‖w‖²
其中 T 为叶子节点数,w 为叶子权重。第一项衡量拟合能力,第二项控制模型复杂度。对量化选股而言,正则化直接对应“避免记住历史噪声”的需求:γ 惩罚叶子数量,λ 惩罚叶子权重幅度,二者共同抑制过拟合。
二、二阶泰勒展开:为什么用二阶信息
直接优化上述目标函数很困难,因为损失函数形式多样。XGBoost的做法是在当前预测值处做二阶泰勒展开:
Obj^(t) ≈ Σ_i [ g_i f_t(x_i) + ½ h_i f_t²(x_i) ] + Ω(f_t)
g_i = ∂l(y_i, ŷ_i^(t-1)) / ∂ŷ_i^(t-1)
h_i = ∂²l(y_i, ŷ_i^(t-1)) / ∂(ŷ_i^(t-1))²
这里 gi 是一阶梯度,hi 是二阶梯度。相比只使用一阶信息的GBDT,二阶展开让每轮拟合更接近牛顿法,收敛更快,且对损失函数的选择更灵活。对于量化中常用的均方误差、Logistic损失、Huber损失,都能统一处理。
把样本按叶子节点归组后,目标函数可改写为关于叶子权重 wj 的二次函数,最优权重和对应最优值有解析解:
w_j* = -G_j / (H_j + λ)
Obj* = -½ Σ_j G_j² / (H_j + λ) + γT
G_j = Σ_{i∈I_j} g_i , H_j = Σ_{i∈I_j} h_i
三、分裂增益计算:树是怎么长出来的
有了上面的解析解,就可以定义一次分裂的增益。设父节点样本集为 I,分裂后左右子节点为 IL、IR,则:
Gain = ½ [ G_L²/(H_L+λ) + G_R²/(H_R+λ) - G²/(H+λ) ] - γ
这个公式是XGBoost分裂决策的核心。它同时考虑了三件事:左右子节点各自带来的收益、父节点原本的收益、以及新增一个叶子带来的复杂度代价 γ。只有当增益为正时,分裂才值得进行。这解释了为什么 γ 越大,树越保守。
| 符号 | 含义 | 量化选股中的直觉 |
|---|---|---|
| g_i | 一阶梯度 | 当前预测与真实收益的偏差方向 |
| h_i | 二阶梯度 | 偏差变化的敏感度,影响权重缩放 |
| λ | L2正则 | 抑制单叶子权重过大,降低过拟合 |
| γ | 叶子数惩罚 | 控制树复杂度,类似预剪枝 |
| Gain | 分裂增益 | 决定是否按某因子阈值切分样本 |
四、缺失值处理与并行学习
量化数据中缺失值非常普遍:财务因子滞后、停牌、新股上市不足、行业分类缺失等。XGBoost没有要求先填充,而是为每个分裂节点学习一个“默认方向”:在训练时分别尝试把缺失样本分到左、右子节点,选择增益更大的方向作为默认分支。预测时,缺失样本自动走默认方向。这使缺失值本身成为一种可被模型利用的信息。
分裂候选:
将缺失样本划入左子节点 → 计算 Gain_left
将缺失样本划入右子节点 → 计算 Gain_right
取 max(Gain_left, Gain_right) 作为该分裂的增益
并记录缺失样本的默认方向
并行学习则体现在特征粒度上。XGBoost在训练前将特征按取值预排序并存储为块结构,分裂寻找最佳切分点时可以并行扫描各特征的候选分割点。注意:这里的并行是“特征并行”和“分裂点并行”,并不是把一棵树的不同层同时建出来。对量化场景而言,这意味着在数百个因子上做分裂搜索时,训练时间可以显著下降。
五、量化选股中的典型场景与误区
假设我们用XGBoost做月度截面收益预测,输入包括估值、成长、质量、动量、波动率等因子。一个常见误区是:把 γ 和 λ 都设得很小,追求训练集上的高IC,结果样本外IC衰减严重。正确做法是先用交叉验证确定 λ、γ、max_depth 的组合,再观察特征重要性和分裂增益分布,确认模型没有过度依赖少数噪声因子。
复盘时建议重点检查三件事:一是分裂增益的分布是否集中在少数特征上;二是缺失值默认方向是否在训练与验证集上表现一致;三是正则化参数是否随市场状态变化而需要重新校准。把这三件事做成例行检查清单,比反复调参更能提升模型的稳健性。
# 量化选股中常用的XGBoost核心参数示例
params = {
"objective": "reg:squarederror",
"eta": 0.05,
"max_depth": 5,
"lambda": 2.0, # L2正则,抑制叶子权重
"gamma": 0.1, # 分裂最小增益,控制树复杂度
"subsample": 0.8,
"colsample_bytree": 0.7,
"missing": np.nan # 显式声明缺失值
}
理解目标函数、二阶展开、分裂增益、缺失值处理和并行学习这五个环节,就掌握了XGBoost在量化选股中“为什么有效”和“什么时候会失效”的判断依据。后续调参和特征工程,都应围绕这五个环节展开,而不是盲目试参。