PLUS会员

DeepAlpha短周期因子系列研究之:XGBoost 在量化选股中的应用

由hxgre创建,最终由qxiao 被浏览 388 用户

一、引言

DeepAlpha系列报告旨在从基础量价数据中,借鉴深度学习模型,应用于量化投资领域。学习模型包括:全连接深度网络(DNN)、卷积神经网络(CNN)、长短期记忆网络(LSTM)、对抗生成网络(GAN)、ResNet、TabNet,同时报告将引入自然语义识别NLP领域近年热门算法如BERT、Transformer、GPT、XLNet等,尝试构建各类DeepAlpha模型。

本篇文章通过借鉴传统机器学习算法——XGBoost——对相同的量价因子进行实验,方便与深度学习模型进行对比实践。

二、算法介绍

XGBoost 是在 Gradient Boosting(梯度提升)框架下实现的机器学习算法,全称为“极限梯度提升算法(eXtreme Gradient Boosting)”。

1.Boosting 算法

提升(Boosting)算法与随机森林类似,属于集成学习的一种,是一族可将弱学习器提升为强学习器的算法。先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器预测错误的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此反复,最终将T个基学习器进行加权结合。

在分类问题中,提升算法通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。提升算法的两个核心是:1.如何对前一基学习器的错误进行定义;2.如何改进本次基学习器。

提升树算法{w:90}{w:100}{w:100}{w:100}{w:100}{w:100}

2.Adaboost 算法

AdaBoost 算法是提升算法中最具代表性的一种,其核心思想就是由分类效果较差的弱分类器逐步的强化成一个分类效果较好的强分类器。强化的过程是逐步改变样本权重,即每一次迭代时,被分类错误的样本的权重在上升,分类正确的样本的权重在下降,算法伪代码如下:

Adaboost 算法伪代码{w:90}{w:100}{w:100}{w:100}{w:100}{w:100}

上述伪代码可以理解为:

  • 第1行:初始化训练数据的权值分布为等权重
  • 第2行:迭代T次,即对基学习器进行T次学习提升
  • 第3行:对当前迭代下的样本权重进行基学习器的训练
  • 第4行:估计当前迭代下的基学习器的误差率
  • 第5行:当错误率超过0.5时,跳过该基学习器
  • 第6行:根据误差率计算当前基学习器的权重
  • 第7行:更新下一次基学习器的样本分布
  • 最后:构造所有基学习器的线性组合

在计算基学习器的误差率时,可以表示为被当前基学习器错误分类样本的权重之和:

误差率计算公式{w:70}{w:100}{w:100}{w:100}{w:100}{w:100}

在得到基学习器的误差率后,我们需要计算当前学习器的权重,该权重是最小化指数损失函数(exponential loss function,exp),具体公式为:

权重更新公式{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}

最小化损失函数{w:80}{w:100}{w:100}{w:100}{w:100}{w:100}

这样,每一次迭代时可基于上一个基学习器的误差获取新的样本分布,并通过新的基学习器进行改进,最终通过权重将基学习器集合。

3.GBDT 算法

梯度提升树(Gradient Boosting Decision Tree)算法,是 Adaboost 算法的一个实例,决定了基学习器为决策树模型。

GBDT通过梯度下降来对新的学习器进行迭代,其中采用 CART 决策树。GBDT与Adaboost的最大区别在于:Adaboost强调自适应(adaptive),通过不断修改样本权重进行提升;而GBDT则是旨在不断减少基学习器的残差值(实际值 - 预测值),在残差减少(负梯度)的方向上建立一个新的模型。核心算法如下:

GBDT 算法{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}

4.XGBoost 算法

XGBoost 可以看做是在 GBDT 上的修改,其最大的不同在于“目标函数/损失函数”的选择。不同于 GBDT 只用了一阶段形式,XGBoost 是把损失函数的二阶泰勒展开的差值作为学习目标,相当于利用牛顿法进行优化,来逼近损失函数的最小值,也就是使得损失函数为0,并在目标函数之外加入了正则项对整体求最优解。

XGBoost算法{w:90}{w:100}{w:100}{w:100}{w:100}{w:100}

XGBoost 仍然是一种提升算法,每棵树也是迭代加入的,每次迭代都希望模型效果能够提升,集成的思想如下图所示:

XGBoost 集成思想{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}

模型效果的提升主要体现在“目标函数/损失函数”下降,同时,XGBoost加入了一个 L2 正则项,该值会根据叶子结点的数量增加而增加。目标函数可以表示如下:

损失函数{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}

根据上文的解释,XGBoost 算法完整的目标函数可以表示为如下公式:

XGBoost 的损失函数{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}

整体来看,XGBoost 和 GBDT 是相似的,主要区别为:

  • 性质:GBDT 是机器学习算法,XGBoost 除了算法内容还包括一些工程实现方面的优化。

  • 基于二阶导:GBDT 使用的是损失函数一阶导数,相当于函数空间中的梯度下降;而 XGBoost 还使用了损失函数二阶导数,相当于函数空间中的牛顿法。

  • 正则化:XGBoost 显式地加入了正则项来控制模型的复杂度,能有效防止过拟合。

  • 列采样:XGBoost 采用随机森林中的做法,每次节点分裂前进行列随机采样。

  • 缺失值处理:XGBoost 运用稀疏感知策略处理缺失值,而 GBDT 没有设计缺失策略。

  • 并行高效:XGBoost 的列块设计能有效支持并行运算,提高效率。

    \

三、模型参数

XGBoost 算法的 pyhton API 较多,本文主要介绍模型训练的函数:

import xgboost
  
xgboost.train(params, dtrain, num_boost_round=10, *, evals=None, obj=None, feval=None, maximize=None, early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None, custom_metric=None)

参数说明(parameters)

参数名 类型 默认值 可选性 解释
params Dict[str, Any] 基学习器的参数
dtrain DMatrix 训练数据集
num_boost_round int 提升计算迭代次数
evals
obj ndarray, DMatrix 自定义目标函数

基学习器的重要参数说明如下:

参数名 类型 默认值 可选性 解释
max_depth int 6 基学习器的最大深度
max_leaves int 0 叶节点的最大数量
learning_rate float 0.3 range: [0,1] 学习率
objective str reg:squarederror {reg:squarederror,reg:squaredlogerror,reg:logistic,binary:logistic,binary:logitraw,binary:hinge,multi:softmax} 目标函数:评估模型对于训练数据的拟合程度reg:squarederror - 平方误差reg:squaredlogerror - 均方对数reg:logistic - 逻辑回归binary:logistic - 二分类逻辑回归binary:logitraw- 二分类逻辑回归binary:hinge - 合页损失multi:softmax - 多分类
booster str {gbtree, gblinear, dart} 弱学习器gbtree:gblinear:dart:
tree_method str auto {auto,exact,approx,hist,gpu_hist} 构建树采用的算法:即结点分裂的依据算法。不同的算法对应不同数据特征,使用效果也不相同。exact: 贪心算法approx: 近似算法hist: 分布式加权直方图gpu_hist; hist的GPU实现
n_jobs int 并行数量
gamma float 0 minimum loss reduction required to make a further partition on a leaf node of the tree
min_child_weight float 1 Minimum sum of instance weight(hessian) needed in a child
max_delta_step float 0 Maximum delta step we allow each tree’s weight estimation to be
subsample float 1 训练样本的采样率
sampling_method float uniform 样本采样方法,默认为均匀采样
colsample_bytree float 1 决定构建每一棵树的时候的采样率
colsample_bylevel float 1 决定树的深度每增加一层时的采样率
colsample_bynode float 1 决定每次叶节点分裂时的采样率
reg_alpha float 0 L1 regularization term on weights (xgb’s alpha).
reg_lambda float 1 L2 regularization term on weights (xgb’s lambda).

四、实证研究

1.因子构建

本文主要以量价数据作为原始数据计算一系列因子,基础因子包括开盘价、收盘价、最高价、成交量、换算率等行情数据,通过相关系数、标准差、时序最大、时序最小、时序求和、加权平均等统计聚合方法,构建新的因子,常用的表达式如下所示:

标签

量化选股深度学习模型量化投资选股XGBoost
评论
  • 在测试集上加label标签,不是未来了???。。。。
  • 也可以不用
{link}