策略分享-基于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)
训练步骤如下:
-
初始化预测值(如常数值)
-
迭代以下步骤直到达到指定树数或提前停止:
计算梯度 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)
- 模型集成或对比模型
- 标签质量优化
\