提升您的交易策略
本章探讨提升(boosting),这是另一种基于决策树的集成学习算法,通常可以产生比随机森林更好的结果。
关键区别在于,原始AdaBoost版本的提升根据模型先前累积的错误来修改每棵树的训练数据。相比之下,随机森林使用bagging独立训练许多树,使用训练集的随机版本。随机森林可以并行训练,而提升则是以顺序方式使用重加权的数据进行。最先进的提升实现也采用了随机森林的随机化策略。
在本章中,我们将看到提升是如何在过去三十年中发展成为最成功的机器学习算法之一。在撰写本文时,它已主导了结构化数据(与高维图像或语音不同,后者输入和输出之间的关系更加复杂,深度学习在此领域更为出色)的机器学习竞赛。更具体地说,本章将涵盖以下主题:
内容
- 入门:自适应提升
- 梯度提升 - 大多数任务的集成
- 使用XGBoost、LightGBM和CatBoost
- 代码示例:使用梯度提升的多头空头交易策略
- 窥探黑箱:如何解释GBM结果
- 使用Algoseek和LightGBM的日内策略
- 资源
入门:自适应提升
与bagging类似,提升结合基础学习器构建集成。提升最初是为分类问题开发的,但也可用于回归,被称为过去20年引入的最有力的学习思想之一(正如Trevor Hastie等人在统计学习要素中所述)。与bagging一样,它是一种通用的方法或元方法,可应用于许多统计学习模型。
以下部分简要介绍了AdaBoost,然后重点介绍梯度提升模型以及该算法的几种最新实现。
AdaBoost算法
AdaBoost与bagging有很大不同,后者构建在非常深的树上,以减少偏差。相反,AdaBoost生成浅层树作为弱学习器,通常使用单一拆分形成的树桩(stumps)就能获得更高的准确性。该算法从一个等权重的训练集开始,然后连续地改变样本分布。在每次迭代后,AdaBoost增加错误分类观测值的权重,并降低正确预测样本的权重,以便后续的弱学习器更多地关注特别困难的情况。一旦训练完成,新的决策树就被纳入到集成中,权重反映了它减少训练误差的贡献。
- A Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting, Y. Freund, R. Schapire, 1997.
代码示例:使用sklearn的AdaBoost
作为其集成模块的一部分,sklearn提供了一个支持两个或更多类的AdaBoostClassifier实现。
本节的代码示例位于笔记本gbm_baseline,它比较了各种算法与始终预测最频繁类的虚拟分类器的性能。
本章中的算法使用了第4章 Alpha因子研究中的feature-engineering笔记本生成的数据集,需要先执行该笔记本。
sklearn
AdaBoost 文档
梯度提升 - 大多数任务的集成
梯度提升机(GBM)算法背后的主要思想是训练基础学习器,学习当前集成损失函数的负梯度。因此,集成的每个新成员都直接有助于降低先前成员犯错所造成的总体训练误差。由于每个新成员都代表数据的一个新函数,梯度提升也被认为以加法方式优化函数hm。
- 贪婪函数近似:梯度提升机, Jerome H. Friedman, 1999
如何训练和调整GBM模型
梯度提升性能的两个关键驱动因素是集成的规模和其组成决策树的复杂性。限制决策树复杂性的目标是避免学习高度特定的规则,这通常意味着叶节点中只有很少的样本数。我们在第4章 决策树和随机森林中介绍了用于限制决策树过拟合训练数据能力的最有效约束。
除了直接控制集成的大小,还有各种正则化技术,如我们在第7章 线性模型 - 回归和分类中遇到的Ridge和Lasso线性回归模型中的收缩。此外,随机森林中使用的随机化技术也常应用于梯度提升机。
代码示例:使用scikit-learn的梯度提升
sklearn的集成模块包含了用于回归和分类(二分类和多分类)的梯度提升树的实现。
笔记本boosting_baseline演示了如何为GradientBoostingClassifier运行交叉验证。
笔记本sklearn_gbm_tuning展示了如何使用GridSearchCV搜索最佳参数集。这可能需要非常长的时间运行。
笔记本sklearn_gbm_tuning_results显示了可以获得的一些结果。
scikit-learn
梯度提升 文档
使用XGBoost、LightGBM和CatBoost
在过去几年里,几种新的梯度提升实现使用了各种创新来加速训练、提高资源效率,并允许该算法扩展到非常大的数据集。这些新实现及其来源如下:
本书回顾了随时间推移而出现并随后趋同的众多算法创新(因此大多数功能在所有实现中都可用),然后说明了它们的实现。
代码示例:使用梯度提升的多头空头交易策略
在这一部分,我们将设计、实现和评估一个以梯度提升模型生成的日度收益率预测为驱动的美国股票交易策略。
与之前的示例一样,我们将建立一个框架并构建一个特定的示例,您可以对此进行调整以运行自己的实验。您可以改变的众多方面包括资产类别和投资领域,以及更细粒度的方面,如特征、持有期或交易规则。例如,请参见附录中的Alpha因子库以获取更多特征。
准备数据
我们使用Quandl Wiki数据来工程化几个简单的特征(详见笔记本preparing_the_model_data),并选择一个模型,将2015/16年作为验证期,并对2017年进行样外测试。
如何使用LightGBM和CatBoost模型生成信号
我们将保持交易策略简单,只使用一个机器学习(ML)信号;实际应用中,可能会使用来自不同来源的多个信号,如在不同数据集或不同前瞻期/回看期上训练的补充ML模型。它还会使用从简单止损到价值风险分析的复杂风险管理。
XGBoost、LightGBM和CatBoost为多种语言提供了接口,包括Python,它们都有一个与其他sklearn特性(如GridSearchCV)兼容的sklearn接口,以及自己的训练和预测梯度提升模型的方法。笔记本gbm_baseline说明了每种实现的sklearn接口的使用。库方法通常记录得更好,也很容易使用,所以我们将使用它们来说明这些模型的使用。
该过程包括创建特定于库的数据格式、调整各种超参数以及评估结果,我们将在以下部分描述。
- 笔记本trading_signals_with_lightgbm_and_catboost交叉验证了一系列超参数选项,以优化模型的预测性能。
评估交易信号
笔记本evaluate_trading_signals演示了如何评估交易信号。
创建样外预测
笔记本making_out_of_sample_predictions展示了如何为最佳执行模型创建预测。
定义和回测多头空头策略
笔记本backtesting_with_zipline基于模型预测创建了一个策略,使用Zipline模拟其历史表现,并使用Pyfolio评估结果。
窥探黑箱:如何解释GBM结果
了解模型为什么会做出某种预测非常重要,原因包括信任、可操作性、问责制和调试。当目标是了解所研究现象的潜在驱动因素时,模型发现的特征与结果之间的非线性关系以及特征之间的交互作用也很有价值。
代码示例:使用LightGBM归属特征重要性
笔记本model_interpretation说明了以下方法。
特征重要性
有三种主要方法来计算全局特征重要性值:
- 增益:这种由Leo Breiman在1984年引入的经典方法使用给定特征所有拆分贡献的损失或纯度总减少。动机主要是启发式的,但它是一种常用的特征选择方法。
- 拆分计数:这是一种替代方法,它计算一个特征被用于做出拆分决策的次数,基于基于信息增益的特征选择。
- 置换:这种方法随机置换测试集中的特征值,并测量模型误差的变化,假设重要特征应该导致预测误差显著增加。不同的置换选择会导致该基本方法的替代实现。
部分依赖图
好的,我继续翻译剩余部分:
部分依赖图
除了个别特征对模型预测的总体贡献,部分依赖图还可视化目标变量与一组特征之间的关系。梯度提升树的非线性性质导致这种关系取决于所有其他特征的值。
SHapley Additive exPlanations (SHAP值)
在2017年NIPS会议上,华盛顿大学的Scott Lundberg和Su-In Lee提出了一种新的更准确的方法,称为SHapley Additive exPlanations(SHAP值),用于解释树集成模型输出中个别特征的贡献。
这种新算法源于这样一个观察:树集成的特征归属方法(如我们之前看到的)是不一致的 - 也就是说,增加模型对输出的特征影响的变化可以降低该特征的重要性值。
SHAP值结合了合作博弈论和局部解释的思想,被证明是理论上最优、一致和局部准确的。最重要的是,Lundberg和Lee开发了一种算法,将这种与模型无关的加性特征归属方法的复杂度从O(TLDM)降低到O(TLD2),其中T和M分别是树的数量和特征数量,D和L分别是树的最大深度和叶子数。
这一重要创新允许在几分之一秒内解释具有数千棵树和特征的之前难以处理的模型的预测。开源实现于2017年年底推出,与XGBoost、LightGBM、CatBoost和sklearn树模型兼容。
Shapley值起源于博弈论,是一种用于分配协作游戏中每个参与者的价值的技术,反映了他们对团队成功的贡献。SHAP值是将博弈论概念适用于基于树的模型,并针对每个特征和每个样本计算。它们衡量一个特征如何为给定观测的模型输出做出贡献。因此,SHAP值提供了差异化的见解,说明特征在样本间的影响如何变化,这很重要,因为这些非线性模型中存在交互效应。
SHAP值提供了针对每个单独预测的细粒度特征归属,并通过(交互式)可视化实现了对复杂模型的更丰富的检查。本节开头显示的SHAP汇总散点图提供了比全局特征重要性条形图更细致的洞见。个别聚类预测的力图允许更详细的分析,而SHAP依赖图捕获交互效应,因此提供了比部分依赖图更准确和详细的结果。
使用Algoseek和LightGBM的日内策略
本节和笔记本将在Algoseek提供示例数据后更新。
代码示例:工程化日内特征
笔记本intraday_features从分钟线交易和报价数据创建特征。
代码示例:调优LightGBM模型并评估预测
笔记本intraday_model优化了一个LightGBM提升模型,生成了样外预测,并评估了结果。
资源
- xgboost - LightGBM参数比较
- xgboost vs LightGBM基准测试
- 基于深度vs基于叶子的生长
- Rashmi Korlakai Vinayak, Ran Gilad-Bachrach. “DART: Dropouts meet Multiple Additive Regression Trees.”
XGBoost
- GitHub仓库
- 文档
- 参数
- XGBoost: A Scalable Tree Boosting System
- 使用GPU计算加速XGBoost算法. Mitchell R, Frank E., 2017, PeerJ Computer Science 3:e127
- XGBoost: Scalable GPU Accelerated Learning, Rory Mitchell, Andrey Adinets, Thejaswi Rao, 2018
- Nvidia Parallel Forall: Gradient Boosting, Decision Trees and XGBoost with CUDA, Rory Mitchell, 2017
- Awesome XGBoost
LightGBM
- GitHub仓库
- 文档
- 参数
- Python API
- LightGBM: A Highly Efficient Gradient Boosting Decision Tree
- On Grouping for Maximum Homogeneity