精华帖子

策略分享-基于XGBoost模型和滚动训练的预测策略

由bq0m8rec创建,最终由bq0m8rec 被浏览 33 用户

0. 策略名词解释

(1)XGBoost模型

XGBoost 是一种基于梯度提升树(Gradient Boosted Trees)的高效机器学习算法,常用于排序、分类、回归等任务,在bigquant平台上只用于排序任务,主要有三种:排序学习(NDCG); 排序学习(Ranknet) ; 排序学习( MAP )。 本策略中,我们使用的是排序学习(NDCG)。


说明:之前已经在”基于LightGBM模型和超参优化的收益率预测策略“以及”基于StockRanker模型和排序学习的选股策略“中详细介绍了 bigquant平台支持的可视化模块手动设置参数的部分,XGBoost里面是类似的,我们这里不再讲 但是这个部分 在实际操作时是最重要的, 因为最后使用时,只需要调试这个部分,XGBoost模型是我们已经封装好训练的部分(1.2-1.7);但是如果你想读取每个部分的具体内容是完全可以的, 但是需要你自己手写代码, 在你回测完成后运行就可以出现模型实现的 每个部分 你想要读取的信息。这下面的每张图都是通过这种方法来读取的。

(2)滚动训练

滚动训练(Rolling Training) 是一种机器学习训练策略,指的是随着时间的推移,不断更新训练数据集(通常是时间序列数据),使用最近一段时间的数据来重新训练模型,并逐步前移训练窗口,以适应最新的数据分布,例如滑动窗口法(sliding window)或扩展窗口法(expanding window),本策略中使用的是滑动窗口法。

\

1. XGBoost模型实现

1.1 数据准备(Data Preparation)

先看上面两张图:训练集时间范围小,是“特征计算历史窗口 + 缺失值剔除 + 滚动训练窗口切分 + 数据过滤”综合作用的结果。这种设计是为了保证训练数据的质量和稳定性,而不是简单用全时间段原始数据。


再看左下角的图:判断训练集和测试集的标签分布是否一致主要看的是标签的分布情况,而不是特征的比值


再看右下角的图:展示了训练集与测试集在时间上的划分比例,训练数据占大约75%至80%,测试数据占约20%至25%。这一比例并非偶然,而是根据我们项目中滚动训练模块的参数手动设置的。

具体来说,我们在滚动训练代码中设定了:

  • 最小训练数据天数(train_data_min_days)为750天,确保每次训练至少包含这段时间的数据;
  • 训练数据最大天数(train_data_max_days)为1000天,避免训练数据范围无限扩大;
  • 训练更新周期(train_update_days)为250天,也即每次滚动时,训练集后面紧跟着约250天作为测试集

--比例大约为 75% : 25% 或 80% : 20%之间--

\

1.2 预测函数(Prediction Function)

XGBoost 使用加法模型,每次迭代新增一棵树来不断修正预测。

在排序任务中,我们不关心预测值的绝对大小,而是样本之间得分的相对顺序。

下面就是yi预测值的分布,这说明模型预测分数整体分布较为平滑且集中,表明模型没有极端偏向某一类。

\

1.3 损失函数(Loss function)

surrogate 损失函数:

注意:虽然我们优化的是 NDCG,但该函数只是其一个可微近似,XGBoost 并未显式乘以 ΔNDCG 权重(不像 LightGBM Ranker)

\

1.4 正则化 (Regularization)

XGBoost引入了结构正则项来控制模型复杂度,防止过拟合

\

1.5 目标函数(Objective function)

目标函数(Obj function) = 损失函数(Loss function )+ 正则化 (Regularization)

目标函数式为了优化过程准备的--

\

1.6 优化过程(Boosting Optimization)

优化过程优化目标函数--

采用 前向分步优化(Greedy Additive Training) 的 Boosting 策略:

  • 初始模型预测为常数或全零

  • 每轮迭代构建一棵新树 ft,拟合当前预测误差

  • 利用当前损失对所有样本计算一阶导 gi 和二阶导 hi

  • 对目标函数进行泰勒展开:

  • 构造新树 ft,将其加入已有模型中

  • 迭代执行,逐步提升排序性能


    \

1.7 训练过程(Training Process)

训练步骤如下:

  1. 初始化预测值(如常数值)

  2. 迭代以下步骤直到达到指定树数或提前停止:

    计算梯度 gi 和 Hessian hi; 构建一棵新树,拟合 gi 和 hi; 通过贪心法选择最优分裂点(基于信息增益);加入模型,更新预测值

最终模型是所有树的加和

\

1.8 模型检验(Model Evaluation)

信息系数(IC)衡量模型预测分数与实际收益的相关性,是排序模型常用的评估指标。IC值范围为[-1,1],值越大表示预测效果越好。图中展示了模型在多个交易日的IC变化及其平均值,反映模型预测的稳定性和有效性。较高且稳定的IC说明模型具备较强的排序能力,适合用于量化选股策略。

  • 正值 表示预测分数和实际收益是正相关,模型预测方向正确。
  • 负值 表示预测分数和实际收益是负相关,模型预测方向相反,说明模型效果不好。


红线是 平均IC; 注意看IC为 0的下方负值部分明显没有正值部分多,所以我们还是基本认可此次这个策略中 XGBoost模型的预测能力的

\

2 滚动训练

2.1 本次策略中主要调试的参数

  • train_data_min_days: 第一个训练窗口的最小长度(如750天)。

  • train_data_max_days: 最大训练长度(如1000天),限制窗口不能太长。

  • train_update_days: 每滚动一次向前推进多少天(如250天)。

  • rolling_count_for_live: 在模拟实盘中最多保留多少次滚动(一般取最后N次)。

    \

这个是一个滑动窗口法:每次窗口前移250天,窗口长度最多1000天,最少750天。

\

2.2 说明

特别要说明的是,根据滚动训练模板,我们还增加了 m11 ; m19模块

添加m19模块是为了方便 predict_mid只保留所需列

    # 只保留所需列
    output_df = df[['date', 'instrument', 'score', 'position']]

\

3 历史数据回测

4 交易成本和滑点

\

5 总结

5.1 策略优势

XGBoost+滚动训练

5.2 可优化方向

  • 引入超参数优化模块(HPO)
  • 模型集成或对比模型
  • 标签质量优化


\

标签

XGBoost
{link}