毕设论文提交版:170611-17373259-孙烨.docx

毕设答辩ppt:9-孙烨-复杂金融投资模型的可视化分析.pptx

以下是markdown易读版毕设论文:

摘 要

随着金融市场变得愈加复杂,对金融资产的量化投资逐渐成为新的趋势与研究热点。本研究目的是采取较为复杂的数据挖掘模型,对于因子对股票收益率的贡献进行可视化分析,从而评估各种因子重要性,便于投资者进行因子选取及后续量化选股步骤。

本文首先综述了多因子量化模型的历史和背景,阐述了国内外在现今阶段主要研究的两个问题,讨论了现有研究的不足,进而提出本研究的目的和意义,即取得模型可解释性与模型误差的较优折衷。

选取中国股市全部A股在2013年的股票日交易数据和公司财务数据为原始数据,六大类共计56个因子作为解释收益的公共因子。对每个时间截面的股票日收益率和因子值构建线性多因子量化模型,将回归系数作为因子收益率,量化了因子对股票收益的影响程度。

围绕着复杂金融投资模型可解释性和准确性两个既截然对立,又互相联系的主题进行了一系列探索。在提升准确性部分,本文采用了以XGBoost为代表的复杂模型回归,随后将三级板块因子纳入多因子量化模型体系,实验证明这两种措施都能获取误差一定程度的下降。在提升可解释性部分,本文采用了一种统一模型解释方法SHAP来解释复杂模型,之后基于因子的排序重要性对因子降维,实验证明两种方案都对模型的可解释性有积极的影响。

关键词: 多因子量化模型,XGBoost模型,SHAP,排序重要性,板块因子

Abstract

As the financial market becomes more and more complex, quantitative investment in financial assets has gradually become a new trend and research hotspot. The research purpose is to adopt a more complex data mining model to visually analyze the contribution of factors to stock returns, which can help investors evaluate the importance of various factors, select factors, and make follow-up quantitative stock selection steps.

In the beginning, this paper summarizes the history and background of the multi-factor quantitative model, illustrates two main research issues. Then discusses the shortcomings of the existing research, and then puts forward the research purpose and significance, that is, to obtain a better tradeoff between model interpretability and model error.

This paper selects all shares of the Chinese stock market as stock pool and uses 56 factors as public factors to explain stock returns. Taking the daily stock trading data and corporate financial data in 2013 as the original data, this paper constructs a linear multi-factor quantitative model for the daily stock return and factor exposure data of each time section. The regression coefficient is used as the factor return to quantify the impact of factors on stock returns.

This paper makes a series of explorations around the two opposite but interrelated themes of interpretability and accuracy of the complex financial investment model. In the part of improving the accuracy, this paper adopts the complex model regression represented by XGboost and, at the same time, brings the three-level plate factor into the multi-factor quantitative model system. Experiments show that the two measures can achieve a certain degree of error reduction. In improving interpretability, the first approach is explaining the complex model by using a unified model interpretation method called SHAP. The second approach is dimension reduction based on the permutation importance of factors. Experiments prove that both schemes have a positive effect on the interpretability of the model.

Key words: Multi-factor quantitative model,XGBoost model, SHAP, Permutation Importance, Sector Factor

1 绪论

1.1 研究背景

1.1.1 传统投资

如图所示,金融市场投资策略可以分为主动投资和被动投资两部分,为了获取市场超额收益,人们往往不满足于跟随指数被动投资,而采用主动投资。传统投资和量化投资均属于主动投资的投资策略。

2

传统投资一般分为选股、择时、买入、持有、卖出5个步骤,总体来说,选股和择时属于分析过程(通过各种指标对股票进行分析和预测,从而评价每只股票投资的价值),买入、持有、卖出属于决策过程(资金管理,如何配置资金使得总体收益最大,风险最低),两个过程缺一不可。

3

绝大多数投资机构、独立投资者采用了传统投资策略,但这并不意味着量化投资要“高人一等”。因为量化模型中所有的因子都是来源于经济逻辑和市场经验(即传统投资);投资步骤、数据处理的逻辑、模型构建也必须要遵循传统投资中规则。掌握传统投资方法的资深投资者灵活性远超量化模型,他们将客观因素内化于自身,形成了强大的主观逻辑判断。而传统的分析过程主要使用了3种投资策略:

策略 概念炒作 技术分析 基本面分析
适用期限 短期:主要以概念炒作和消息面刺激为主 中期:主要受市场风格的影响 长期:业绩
描述 概念股是依靠某一种题材(比如资产重组概念,三通概念等)支撑价格。而这一内涵通常会被当作一种选股和炒作题材。 基于历史可以重演这一假设,通过图表分析或者指标分析来寻找股价历史走势的规律并以此为依据预测股价的未来走势 从经济学理论的角度,利用目前较为完善的宏观分析行业分析以及公司财报分析等方法,提取决定股价高低的有用信息来对股票市场进行分析
优点 借助股市情绪,获取巨大收益 择时:判断交易的位置 选股:判断方向
局限性 没有扎实的业绩支撑,短期股价涨得越多,风险也就越大 1. 依赖于历史的重演,由于股票市场在现实中是不断变化2. 研究的是纯的技术图表,并没有找到趋势驱动的原因 对于股票的择时问题,却没有给出明确的答案。

随着金融市场愈加复杂,传统投资策略太依赖于调研信息、主观判断及个人经验,暴露出了较大劣势:

  1. 大脑处理能力限制:大脑计算能力应付不了庞大的数据量与复杂的信息处理过程。
  2. 容易受到认知偏差:人容易受到非理性因素影响,面对大涨大跌的情况容易激进恐惧,并且容易相信道听途说的消息而丧失自我判断的能力。
  3. 强调收益率而非风险控制,偏重个股挖掘而非投资组合:由于人的精力有限,常常把目光聚焦到几个特定高收益率的股票上,没有考虑资产之间的相关性,一荣俱荣,一损俱损,没有回避非系统性风险的准备。

1.1.2 早期金融研究

1952年,马柯维茨提出现代资产组合理论[1],引入了均值和方差来定量刻画股票投资的收益和风险,推导有效边界(刻画了收益对应最佳投资组合),避开了一般经济均衡的理论框架,使金融学发生了根本改观。

img

1964年,资本资产定价模型(CAPM)[2]提出投资者的收益主要来自于两部分:市场的平均收益(Beta收益)和独立于市场的超额收益(Alpha收益),所有证券的收益率都与唯一的公共因子(市场证券组合)的收益率存在着线性关系,不仅提供了评价收益-风险相互转换特征的可运作框架,也为多因子模型提供基础。

1

1976年,Ross提出套利定价理论(APT)[3],认为对收益产生影响的市场因素并不单一,证券收益率与一组因子线性相关,是一系列风险溢价的线性相加。当一组因子只有“市场组合”时,套利模型等同于CAPM,因此APT是一种广义的CAPM,成为多因子量化模型的基础。

1993年,Fama和 French 提出了出了经典的三因子模型[4],认为投资组合的超额回报率可以由市值因子(SMB)、账面市值比因子(HML)和市场资产组合因子(Rm−Rf)所共同解释解释。此后不断发掘新的因子,陆续提出了四因子,五因子等模型。于是以多因子量化模型为代表的量化投资,作为一种新型的投资策略逐渐进入投资者的视野。

1.1.3 量化投资

量化投资是利用计算机技术,将投资策略模型化的过程。具体的来说,将适当的投资思想、经验、甚至直觉反应在量化模型中,利用电脑帮助处理大量信息,归纳市场规律,建立可以重复使用并反复优化的投资策略,指导投资决策。[5]

量化投资因其纪律性、系统性而很大程度上改善了传统投资的劣势。投资者开始借助计算机技术使得投资行为更加客观高效,量化投资的研究和应用越来越受到中国金融行业的关注与重视,并将成为未来投资中最为重要的策略。

2

如图所示,量化投资有比较庞大的体系结构,量化选股量化择时是两个核心问题,即:如何筛选更有价值且风险较低的股票,什么时间点买入或卖出。

1.1.4 多因子量化模型

多因子模型是量化投资领域应用最广泛也是最成熟的量化选股模型之一,建立在投资组合、资本资产定价(CAPM)、套利定价理论(APT)等现代金融投资理论基础上。[6]多因子模型假设市场无效或效率低,通过主动投资组合管理获得超额收益。其中心思想是多个因素动态地影响市场,但经常有几个因素可以在特定时期内起到稳定的作用。在量化实践中,市场参与者和分析家对市场动态和因素有不同的理解,从而构建不同的多因素模型。

3

如图所示,多因子量化模型已经成为一套成熟的体系,流程大致分为5步(如图所示):根据经济金融理论或市场经验寻找和发掘因子,然后通过对历史数据的拟合和统计分析对因子进行验证和筛选,最后以这些因子的组合作为选股标准,以一定策略选取股票,构建相应投资组合,进行回测以评价模型有效性。

但是一个好的模型并非一成不变的,随着市场变化,因子产生的作用也会变化,可能会暂时失效,也可能永久失效,因此模型需要适应因子的动态性,自动地屏蔽低重要性因子的影响,并且人工或自动地构造更多的因子加入量化模型的因子池中。

1.1.5 因子选取

多因子模型使用的因子也来源于传统投资策略,主要有概念炒作、基本面分析、技术面分析,并衍生出了相应的因子(如图所示),分别是概念因子,技术面因子,基本面因子

4

其中概念因子以概念炒作和消息面刺激为主;技术面因子来源于市场交易数据,具体表现为交易摩擦因子、动量因子、价值因子等;基本面因子来源于财务报表,具体表现为成长因子、盈利因子、财务流动因子等;另外,在构建全球多因子量化模型时,可以考虑将金融市场的宏观指标加入因子构建之中,不再局限于中国的A股市场。

1.2 国内外研究现状

随着计算机技术的发展与广泛应用,多因子量化模型正逐渐借助数据挖掘与机器学习技术来达到更好的预测效果与选股能力。后续的研究主要有:寻找并筛选有效因子,使用更复杂的模型以优化性能

1.2.1 寻找并筛选有效因子

廖理、赵锋(2003)等人将国际上常用的风险因子与中国的股票市场情况相结合, 筛选出16个可用于解释中国股市的因子,并基于Barra模型展开分析[7]。汪洋于2010年基于估值指标和业绩指标构建选股策略,并提出估值因子对上市公司股票具有更大影响力[8]。2013年,刘辉等人证明了Fama-French三因子模型在中国A股股市仍然有效[9],认为公司规模(Size)和股票收益具有负相关关系。

后续不断提出更多的因子,2018在清华大学五道口金融学院发布的《中国A股市场量化因子白皮书》[10]中,作者总结了市场上比较认可的6类共56个量化因子,使用1997-2017的A股数据进行检验和筛选后,有13个因子(图中标黄)被证明有效,排除相关性因子后,仅剩下9个因子(图中画框)。

5

随着可用因子不断增多,建模过程中产生的数据规模急剧增大,即使是经验丰富的投资经理也很难掌握并完全利用这些数据。但使用可视化技术可以帮助投资者直观地了解数据动态,从而更好地进行因子和股票的选取。如何进一步挖掘数据中潜在的、有价值的信息并将其有效地呈现,以辅助投资者分析决策,成为了本文主要的研究问题。

1.2.2 优化模型性能

6

在多因子选股模型优化方面,继基础的线性模型之后,学者采取了更新颖的技术,获得了更优的选股策略。包括:Kim等人(2003)的支持向量机[11](SVMs),Zhou和Yu等人(2006)的遗传算法[12](GA),焦健等人(2009)的静态和动态CART决策树模型,苏治等人(2013)的基于核主成分遗传算法改进的支持向量回归机人工智能选股模型(KPCA-GA-SVR),徐步云(2015)的基于SOA神经网络的轨迹聚类方法,张冬阳(2018)的基于Barra风险模型Logistic回归方法,黄媛(2019)的长短期记忆网络(Long Short-Term Memory, LSTM)[14],王伦(2019)的Adaboost-SVM的多因子模型[15],王伦与李路的基于**深度森林(gcForest)**算法的多因子模型[16]。

刘佳琪(2020)[17]以沪深300成分股作为股票池,选取2010年年初到2019年年初中价值类,成长类,规模类,交投类,情绪类,每股,质量类和风险类这8大类共34个因子的数据,探讨了XGBoost结合半衰期IC加权的方法在多因子选股模型中的应用。实证XGBoost方法能选取重要的因子,然后运用半衰期IC加权对重要因子进行赋权的方法在排名前10%的股票中可获得年化收益率为26.86%,要比年化收益为2.05%的沪深300指数高出24.81%。

然而,这些复杂的模型在可解释性上存在极大的问题,虽然可能带来较低的误差,但本身也有极大的劣势:

  1. 不能给予投资者直观的解释:为什么某些因子就比其他因子更加重要,为什么通过这样的方法能够筛选出这样的股票,复杂的模型就像一个黑盒一样,只有输入和输出,过程发生了什么不可知。因此,投资者难以相信这些模型,很少采用这些模型辅助他们决策,在他们看来,较低的误差说明不了什么,可解释性可能更为重要。
  2. 不能给予投资者交互决策的机会:在筛选因子时,投资者可能有其他因素的考量,在多因子模型中添加一些个人经验甚至直觉,但是复杂模型往往采用一些比较固定的策略,没有给予投资者动态选择的权利。

1.3 研究目的与意义

多因子量化模型可以综合传统投资所有的优点,通过在每个投资策略中设定相关的量化因子的方式一揽全局。凭借其成本低廉、业绩出色、能够充分克服人性的弱点等特点,自其诞生来,量化投资就受到了广泛的关注,也创造了诸多奇迹。

然而已有模型在各种因子如何影响股票最终收益率在以下方面存在不足:(1)可解释性:使用复杂模型具有较低的误差,却不能解释各因子对于收益率的贡献,从而无法使用灵活的策略筛选出有效因子和相应的投资组合;(2)准确率:线性模型可以解释各因子的收益率,但有非常高的误差,从而无法构造出理想的投资组合。

因此本文的主要目的就是提升模型可解释性的同时,减小模型误差。(1)提升模型的可解释性:模型最终的目的是基于因子有效性帮助股民选股,因此需要可视化解释每个因子每日贡献,具体分为因子降维,解释复杂模型两个部分。(2)减小模型误差:由于样本维度远高于特征维度,线性模型不足以适应如此高的复杂度,带来了很高的误差,使用复杂模型回归,引入新的特征(如板块因子)能够相当程度上缓解这一问题。

1.4 研究方法与内容

基于上述的研究目标,研究工作主要集中在提升模型可解释性,减少模型误差两个方面,具体可分为如下五部分内容。

7

1.4.1 数据预处理及线性模型构建

从Wind与国泰安CSMAR数据库中获取2001年1月至2018年12月中国所有A股股票的日交易数据和财务报表数据,按照清华大学五道口金融学院发布的《中国A股市场量化因子白皮书》计算出6类共56个量化因子,选取在2013年共238个交易日的日收益率和56个因子,对数据进行缺失值处理、去极值处理及标准化处理。之后以56个因子作为自变量,以日收益率作为因变量,构建多因子线性模型,并分析因子之间的相关性。

1.4.2 复杂模型构建

使用一些较为复杂的数据挖掘模型,本文主要使用了可解释的集成模型(以XGBoost为代表,还包括随机森林,lightBGM),评价各个因子的贡献,并对模型进行可视化。为了提高模型准确率,降低误差,对XGBoost模型进行了进一步参数调整,采用单天模型调参、时间序列调参及超参变换三种方法,对比复杂模型和线性模型的误差。

1.4.3 解释复杂模型

提升可解释性与减小误差一定程度上是矛盾的,使用更复杂的模型去减小误差会造成可解释性的下降,而单纯使用线性模型有较好的可解释性,却不能拟合非线性情况。因此需要权衡利弊,如何在使用复杂模型的同时,依然保持模型的可解释性,并通过可视化进行因子筛选,成为了关键。

本文主要采取了较为成熟的SHAP方法对复杂模型进行解释,从复杂的机器学习模型中发掘一些规律和见解,包括排序重要性(Permutation Importance),部分依赖图(Partial Plots)与贡献依赖图(Dependence Contribution Plots),SHAP图与摘要图。

1.4.4 因子降维

由于日因子数据是高维数据,已经证明只有一小部分因子是有效因子,对其进行降维用于排除不相关属性、相近属性,从而使用较少的数据就能达到相近、甚至更高的准确度;通过因子降维可以节约计算资源,同时合理分配其他因子对于收益率的贡献,增加模型的可解释性。

1.4.5 引入板块因子

因为不同板块股票情况天差地别,不适合统一进行解释,本研究中引入了3级板块数据,分为24个大板块,66个中板块及200个小版块,形成“大-中-小”的层次结构,每只股票属于其中的某个小版块,指明了股票对应公司所属的行业类别,同一行业内部的股票表现具有一定相似性。板块数据在多因子量化模型中具体的策略是板块因子,本研究分别采用大板块,中板块,小板块作为因子,对不同模型进行试验。

1.5 论文构成

本文共分为如下七个部分对复杂金融投资模型的可视化分析展开讨论。

第一章为绪论。首先介绍本毕业设计的选题背景和研究目的,对多因子模型在国内外的研究进展进行了详细梳理,总结目前的研究成果和存在的不足,进一步分析课题的研究意义,并提出研究方案和内容。

第二章为数据预处理及线性模型构建,包括自变量预处理、因变量预处理、线性模型构建。

第三章为复杂模型构建,包括XGBoost原理,XGBoost构建,XGBoost调参,其他复杂模型。

第四章为复杂模型的解释,包括排序重要性,依赖图,SHAP与总结图。

第五章为因子降维,包括预降维,后降维。

第六章为引入板块因子构建模型,包括获取数据,板块可视化,回归分析。

第七章是对全文的总结,概括研究工作的创造性与存在的不足,提出课题的改进方向与思路。

2 数据预处理及线性模型构建

本章第一节对数据进行说明,第二节对自变量预处理,第三节对因变量预处理,第四节介绍线性模型有关概念,并进行线性模型构建。

8

如图2.1所示,本章首先对自变量和因变量进行预处理,包括缺失值、去极值、标准化等处理并可视化处理的结果,接着构建线性模型,比较采用不同收益率数据的误差情况,最后介绍线性模型可视化系统帮助投资者选股决策的流程和逻辑。

2.1 数据获取与说明

本课题所使用的数据来源于Wind金融数据库与国泰安CSMAR数据库,选取的股票池为中国股票市场的全部A股,时间范围是2013年1月至2013年12月,获取的数据变量包括股票日交易数据和财务报表数据。

  1. 股票日交易数据:来源于Wind金融数据库,所涉及的数据变量包括:交易日期、股票代码、收盘价、开盘价、交易量、交易额、交易换手率等。
  2. 季度财务报表数据:来源于国泰安CSMAR数据库,所涉及的数据变量包括:总资产、总负债、存货、营业收入、利润总额、营业现金流等。

2.2 自变量预处理

自变量选取的是1.2.2《中国A股市场量化因子白皮书》中选取的56个因子,按照公式通过股票日交易数据和季度财务报表数据计算而出。因子分为六大类,分别是交易摩擦因子、动量因子、价值因子、财务流动因子、盈利因子、成长因子,其中前三个属于1.1.5中提到的技术面因子,后三者属于基本面因子,根据因子定义计算所得的因子值称为因子暴露

数据预处理是数据挖掘过程中重要的基础准备步骤,没有合理正确的数据,就不可能通过数据获取正确的结果。而由于金融市场独特的领域特征,用于处理原始数据存在的数据缺失、数据异常等情况,因此,数据预处理在研究股票数据时是十分必要的步骤。本课题通过缺失值处理、去极值处理及标准化处理对股票数据进行清洗,以备多因子模型建模及后续步骤。

在预处理之前,可以大致上了解一下数据分布,使用箱型图能够很好表达:

绘制的是盒状图,但实际上看上去像散点图,箱型图由上边缘、下边缘、中位数和两个四分位数组成,而在上边缘、下边缘之外的部分都是异常值。这说明因子数据中存在大量异常值,有以下原因:(1)有的因子(如size)分布区间比较大,但是主要的部分都集中在一定区间内(2)有的因子(如LG)存在相当的异常值。去掉这些因子,以平均值填充缺失值,再一次可视化:

XX = X.drop(columns=['RDsales','size', 'LG','BVEG','TAXchg','cashpr','saleinv','INVG'])
XX = XX.fillna(XX.mean())
XX.boxplot(figsize=(30,15))

大量因子依然未能显示其箱型图,而是在箱型之外的散点,由此可以预见,如果不对数据进行预处理,构建模型的效果一定会很差。

3.3.1 缺失值处理

方案一:使用横截面均值

若一只股票的某个因子暴露值在某日缺失,则取当日其它股票对应因子值的均值填充该缺失部分;若一只股票的某个因子暴露值在连续的一段时间内均为空白,则直接剔除该股票

这种方案除了比较简单,但从原理上有些不妥,该股票的因子值与其他股票的因子有关系吗?用其他股票的均值来填补能表现该股票的个性吗?要采用均值也应该采用自己的均值。

方案二:使用个股时间序列估计

更好的算法是使用一种时间序列模型,因为因子的变化基本上是连续的,可以通过前面或者后面的因子值计算缺失的因子值。但实际上一些因子值是不具备平稳性的,使用时间序列也很难估计其值的大小。由于此方案的复杂性,这种方案并没有被实施。

方案三: 直接剔除缺失值

如图所示,除了部分因子,缺失值实际上很少,均低于0.03。其中例外的因子有:EP达到0.074144,DP达到0.146086,cashpr达到0.17541)。如果直接删去所有缺失值的行,数据只有原来的68.27%。

缺失值是否也有本身的意义?直接剔除缺失值这种做法能否保持源数据的信息量?都有待商榷。

方案四:个股按月填补缺失值

此处采用当月自己的均值填补缺失值,如果当月某因子记录数为空值的情况多于10(一个月有20条左右记录,缺失50%就已经很多了),剔除该股票该月所有信息(不是剔除股票,因为股票在其他时间段依然是有意义的)。但是即使填补了数据,由于缺失值太多,最后剩下68.47%,不能比方案三保留多少数据。

这种方案对数据进行了复杂的预处理,但是最后的结果反而不好,原因是某些因子(如cashpr)在大量的股票上都是连续的空值,这种方案只好以失败告终。

最终采用的方案是方案一、方案三、未处理缺失值三种方案,最简单的方案反而是最有效的。线性模型不接受缺失值的情况,因此使用方案一和方案三做对比,而XGBoost回归是接受缺失值的存在的,因此采用方案三和未处理缺失值两种方案。

3.3.2 去极值处理

金融领域数据相较其它领域的观测值而言,具有更为高频的、更加剧烈的波动特征,因此部分股票的某些因子在个别时间点急剧变化,造成大量异常点,在箱型图中能很直观地展示。采取线性回归构建多因子模型时,这些个别的极端值会拉偏因子对股票收益率的解释程度,影响模型的拟合效果。因此,在标准化因子之前,先进行去极值处理。
去极值并非将极值数据删去,而是设定数据的上限与下限,将超出限值的数据调整为限值,常用的上下限构造标准有绝对值差中位数(mean absolute deviation,MAD)、3和百分位。

方案一:MAD

有一元序列,该序列与其中位数偏差的绝对值所形成的序列的中位数称作MAD,其数学表示$$MAD=median(|x_i-median(x)|)$$。其中,median(x)表示取序列中位数。最后将x限制在 median(x)kMAD<=xi<=median(x)+kMADmedian(x)-k\cdot MAD<=x_i<=median(x)+k\cdot MAD 中。

image-20210514212344545

如图所示,以size因子为例,MAD将左图所示分布规约到右图,给人的直观感觉是尾巴太长了,像是硬生生直接截下来一节,并且部分因子(如sharechg)计算出来MAD值为0,去极值后直接成为了冗余的数据,在金融领域,这样的处理方法显然不合理。

方案二:百分位

将因子值进行升序的排序,对排位百分位高于1−α或排位百分位低于α的因子值,进行类似于 MAD 、 3σ 的方法进行调整,其中α为分位点,金融领域成熟的做法是取为2.5%。

最后绘制出来的箱型图如图所示,避免了MAD的缺陷,的确是比最开始舒服了不少。

方案三:去除极端值

极端值数据是否有其存在的意义,如果直接将极端值删去,而非约束到某个区间,是否有更好的效果。

for factor in factors:
    dev = X.std()[factor]/5
    string = factor+'>='+str(min_value[factor]-dev)+' and '+factor+'<='+str(max_value[factor]+dev)
    try:
        X=X.query(string)
    except:
        continue

如果采用标准差的十分之一删去极值,数量会锐减到原数据量的20%,而采用标准差的五分之一,则会减少到68.3%。数据分布上不再存在比较大的尾巴,避免了约束极值的缺陷,但造成了数据量的下降。权衡利弊,舍弃了这种方案。

3.3.3 标准化处理

不同变量的观测值往往会由不同的单位衡量,不同的因子由于意义和计算方式的不同,也存在着量纲的不一致性,造成不同因子的暴露在数值上也呈现了较大差异。对数据进行标准化处理可以将量纲统一,防止因子值量纲的差异对模型造成影响。常用的标准化方法为z-score标准化和min-max标准化。

方案一:min-max标准化

这种方法基于原始数据的最大值和最小值进行数据的标准化,也称作离差标准化,转化公式如下:

x=xxminxmaxxminx^*=\frac{x-x_{min}}{x_{max}-x_{min}}

其中,为样本数据的最大值,为样本数据的最小值,经过min-max标准化处理后的序列值均落在[0,1]区间内。

这种方法具有一定的缺陷:(1)若序列存在极端值,则容易造成标准化后数据近似于0,不利于分析,(2)若数据发生变动或新的数据加入,则需要再次获取最大值和最小值,重新进行标准化处理。基于如上考虑,本文采用z-score标准化处理股票数据。

方案二:z-score标准化

这种方法基于原始数据的均值与标准差进行数据的标准化,也称作标准差标准化,转化公式如下:

x=xμσx^*=\frac{x-\mu}{\sigma}

其中,是所有样本数据的均值,则表示所有样本数据的标准差。经过z-score标准化处理后的序列均值为0,方差为1,数据围绕0上下波动。再次绘制因子的箱型图:

X1=(X-X.mean())/X.std()
X[list(factors)]=X1[list(factors)]
XX=X.drop(columns=['size']) # size因子即使经过标准化,量纲上与其他因子还是有很大差别
XX.boxplot(figsize=(30,15))

可以看出,这种处理方法相当好地描述了源数据的形态和分布。为了进一步优化数据分布,部分因子(如size,sharechg,saleinv等)分布比较特殊,偏离箱型图的异常点仍然比较多,可以考虑使用对数标准化,而不是通常的Z-Score。设计一种应对各种各种情况的标准化算法涉及复杂的算法,因为本研究主要的内容集中在复杂模型上,暂时没有深入研究。

2.3 因变量与处理

日交易数据表有(open, close, pre_close)三个属性,最后需要计算收益率的值作为最后的因变量。其中open表示开盘价,close表示收盘价,pre_close表示前一个交易日的收盘价,

2.3.1 检查正确性

对于日交易数据,需要检查以下条目以验证数据的正确性:

  1. 数据表中存不存在空值或缺失值。
  2. closet1=pre_closetclose_{t-1}=pre\_close_t 这一个必要条件,检查是否正确。
  3. 是否存在某些天的日收益率大于10%或小于-10%,在金融市场规定股票单日长跌幅不超过10%,超过这个区间就属于异常情况,可能是公司上市、退市、集合竞价等一些特殊情况,对于多因子较大的影响,应该被约束。如图所示,约束之后股票的分布显得正常许多。
Y[Y['yield']<-0.1]=-0.1
Y[Y['yield']>0.1]=0.1

image-20210514223923780

经过检验,虽然表内不存在空值,但是存在一些缺失值,即明明不是周末,股票前一天和后一天相差的时间多于一天,有可能是股市在节假日暂时休市的情况。因此,k日平均收益率需要谨慎考虑计算方式。

2.3.2 日收益率

计算日收益率有以下两种方式:$$yield_t=\frac{close_t-open_t}{open_t}$$,或者$$yield_t=\frac{close_t-close_{t-1}}{close_{t-1}}$$。closet1close_{t-1}表示前一天的收盘价,opentopen_t表示当天的开票价,两者之间相差一个集合竞价,是两市早上9点15分至25分进行,新股20%,正常股票10%,ST股5%上下浮动。如果基于前一天的收盘价竞价时买盘强大,而且买盘挂的价格高,开盘价就会高于昨天的收盘价,反之就会低。

从这种意义上,集合竞价也由股票内在动因决定,因子对其应该也有影响,但这里只考虑简单因素(使用第一种方式)

2.3.3 k日均收益率

一天的收益率导致的巧合性还是远远大于股市背后的规律性,因此考虑使用k日均收益代替日收益率,即采用k个交易日的平均收益率,这样可以一定程度上缓解股票背后的随机性。特别的,短期收益率k=5(近似一周),中期收益率k=20(近似一个月),长期收益率k=60(近似一个季度),而当k=1时,退化成日收益率。

计算方法:$$yield_{k,t}=\frac{close_{t+k-1}-close_{t-1}}{k\cdot close_{t-1}}=\frac{close_{t+k-1}-pre_close_t}{k\cdot pre_close_t}$$

k日均收益率的计算涉及到较为复杂的Dataframe位移操作,即将k个空白填充的收益率与原始收益率直接拼接,再检验其时间差,有以下注意点:

  1. k值取太大会使得损失的数据量越大,因为位移可能会导致比较大的误差,损失的数据量如表格所示;
  2. 验证位移前后时间差在(k1,75k+1)(k-1, \frac{7}{5}k+1)之内,其中75\frac{7}{5}是考虑到周末对允许的最大值给予延长,并且允许(-1,+1)的误差。当k分别取1,5,20,120时。k日收益率计算得到的数据分布分别如图A,B,C,D所示:
k 1 5 20 60
损失数据量 0 0.08 0.44 0.95
保留数据量 1 0.92 0.56 0.05

经过实验,在k取1-20区间,损失的数据量还是在能接受范围之内的。因此多因子量化模型的目光可以不再聚焦于一天,而是一周,甚至一个月。

image-20210514230435849

2.4 线性模型构建

2.3.1 线性模型原理

多因子模型一般可分为打分法回归法。打分法的主要思想为:根据因子与收益率的相关性排序给股票打分,选择得分较高的股票进行投资。本课题使用回归法构建模型,回归法旨在量化不同因子对股票的影响程度与数量关系,以因子暴露为自变量,股票日收益率为因变量,从而构建多元回归模型。

回归方法也相当丰富,1.2.3介绍了包括LSTM,XGBoost其他各种各样的选股模型,本节中采用了最为基础的线性模型,方便后续用复杂模型进行对照。基于线性回归法在某一时间段(常常使用一天,也可以使用多天,乃至一个月)的多因子模型结构如下:

image-20210514164227162

其中,N为股票的数量,i从1取到N,为股票的下标,p为因子的数量(本节采用56个因子,故p取56),j从1取到p,为因子的下标。rir_i为股票i的日收益率,xijx_i^j 为股票i在因子j上的因子暴露,fjf^j为回归系数,记为因子j的收益率,ϵi\epsilon_i为残差,是线性模型无法解释的部分,金融领域又称为股票i的特质收益,b为偏差,金融领域又称为市场平均收益率,即该股票池的指数。

线性回归模型采用最小二乘法,最小二乘法思想较为直接,通过简单直接的求导和矩阵运算,可以得出全局最优的封闭解,所有股票在某个因子上收益的平均值为零,残差部分平均值也为零,故偏差正好就代表了平均收益率。由于股票数量N远大于因子数量p,但是线性模型规定这些因子共同解释所有股票的收益,造成约束度远大于自由度,因此即使寻找到全局最优解,残差ϵi\epsilon_i也一定不会小。

在完成回归后,基于以下假设:在短时间内因子回归系数不会有太大变化,未来的一段时间内可以延用现在的回归系数。代入新的因子暴露至模型中,便可预测下一阶段的股票收益率,继而根据预测结果构造投资组合。

2.3.2 数据相关性可视化

线性回归模型构建之前,预先可视化数据的相关性都够给人直觉的洞察,引导未来可能做出的深入研究,故作出以下三种数据可视化分析。相关性可视化使用的数据是经过预处理的(自变量缺失值采取剔除策略)2013年全年所有数据。

可视化一:单因子对收益率的影响
factors=list(X.columns)
factors.remove('ts_code')
factors.remove('trade_date')	# 获取因子名称,去除主键

X['code_date'] = X['ts_code'] + X['trade_date']	# 自变量:因子
Y['code_date'] = Y['ts_code'] + Y['trade_date'] # 因变量:日收益率
Z=pd.merge(X,Y,on='code_date') # 同一天,同一支股票的因子和收益率进行表格内连接

import seaborn as sns
factor1= ['size', 'beta', 'betad', 'idvol', 'total_vol', 'idskew', 'skew', 'coskew', 'turn', 'std_turn']
sns.pairplot(Z, x_vars=factors, y_vars='yield',kind="reg", height=20, aspect=0.7, hue='code_date')
plt.show()

如图所示,对所有因子进行单因子分析,除了少许因子(如size)可能与收益率有些许相关关系,更多的因子只像正太分布,很难看出因子对收益率的线性相关关系,可以进一步计算相关系数。

可视化二:相关系数图

由于因子之间本身可能存在强烈的相关关系,如白皮书中所指出的总波动率(vol,即股票日收益率的标准差)与特定波动率(idvol,即回归模型残差的标准差),为了排除这类相关性高的因子,使模型更合理分配因子贡献,很有必要研究因子之间的相关性。

主要任务是计算所有因子,包含收益率之间的相关系数并绘制热力图。样本是由多维特征的构成的,把每个特征维度都看成一个随机变量,为了考查两两特征间的关系,可以借助随机变量的协方差。

cov(Xi,Xj)=E(XiEXi)(XjEXj)DXi=E(XiEXi)2DXj=E(XjEXj)2cov(X_i,X_j)=E(X_i-EX_i)(X_j-EX_j)\\ DX_i=E(X_i-EX_i)^2\\ DX_j=E(X_j-EX_j)^2

rij=cov(Xi,Xj)DXiDXjr_{ij}=\frac{cov(X_i,X_j)}{\sqrt{DX_i\cdot DX_j}}

其中, rij1r_{ij}\leq1: 1表示随机变量XiX_iXjX_j完全线性正相关; -1表示完全线性负相关; 0表示线性无关,但是线性无关并不代表完全无关。
样本(共m个)随机变量X=[X1,X2,,Xn]TX=[X_1,X_2,\cdots,X_n]^T,第k个样本为{xk.=[xk1,xk2,,xkn]T1km}\{x_{k.}=[x_{k1},x_{k2},\cdots,x_{kn}]^T|1\leq k\leq m\}。则任意两个维度特征的协方差为$$\displaystyle cov(X_i,X_j)=\frac{\sum\limits_{k=1}^m(x_{ki}-\overline{x_{.i}})(x_{kj}-\overline{x_{.j}})}{m-1}$$。其中,分母是 m-1是因为随机变量的数学期望未知,用“样本均值”代替,自由度减1。

Z1=Z.drop(columns=['ts_code'])
cor = np.corrcoef(Z1,rowvar=0)
fig = plt.subplots(figsize = (35,35))
sns.heatmap(cor, cmap='rainbow', center=0, annot=True, fmt='.2f', xticklabels=Z1.columns, yticklabels=Z1.columns)

如图所示,存在一些相关系数相当高的属性,比如turn和std_turn,系数高达0.99,而turn和LM负相关,系数达到-0.64。同时,我们发现不是所有因子都与收益率有线性相关关系,有的相关性很低。如果能对因子降维,将会减少后续的计算复杂度。

2.4.3 多维线性回归

回归一:日收益率

利用sklearn的LinearRegression进行训练,取训练集:测试集=8:2,以下是在2013-03-01为横截面,自变量取剔除缺失值的预处理方案,因变量取日收益率,构建线性模型的结果。

x=X[X['trade_date']=='2013-03-01'].drop(columns=['trade_date'])
y=Y[Y['trade_date']=='2013-03-01'].drop(columns=['trade_date'])
z=pd.merge(x,y,on='ts_code')
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

这里自变量x有1590支股票(2000多支股票剔除缺失值后剩下),因变量y有2276支股票,但是一经过内连接,就只有1498支股票,说明x和y中存在互斥的。有因子数据但没有收益数据,或者有收益数据却没有因子。

from sklearn.linear_model import LinearRegression  #线性回归
linreg = LinearRegression()
model = linreg.fit(x_train, y_train)

根据模型在2013-03-01测试集上的预测值和真实值进行对比,如图所示,相对于测试集实际的结果,线性模型预测值显得相对比较“保守”,标准差要低很多,均方误差为3.39。在所有横截面上回归的具体误差将在后续复杂模型构建中进行对比。

回归二:k日收益率

为了对比k日均收益率相对日收益率对于模型效果是否有正面的影响,在线性模型构建中,采用了k=5(代表周均收益率)及k=20(代表月均收益率),得到结果如下表所示:

k 1 5 10 20
样本含量 1498 1461 1375 1139
MSE 3.329 1.285 0.486 0.245

image-20210515190618884

如图所示,使用k日均收益率得到模型的准确率似乎要比使用日收益率回归得到的均方误差要小得多,随着k值的增加,数据分布更为集中。在一定程度上排除了金融数据中单日噪声造成的不良影响。

2.5 线性模型可视化系统

在量化因子投资领域,准确率并非投资者追求的唯一指标,最终的目的不是让模型拟合得准,而是获取高收益率。如何借助量化因子模型获取高收益率的投资组合,本身是有一套逻辑体系的。

image-20210518114054684

使用线性模型可视化系统如图所示,有以下几个步骤:

  1. 因子分析:股票市场的交易数据和财报数据作为系统的输入,按照定好的因子计算公式计算出所有股票在所有横截面上的所有因子暴露;构建线性回归模型,计算每个横截面模型的因子收益率;
  2. 因子可视化:在时间序列上对于因子收益率进行可视化,展示因子的重要性排序及因子变化趋势,给用户提供选择因子的接口;
  3. 股票分析:针对2中用户选择的因子采取某种策略对股票打分,对累积分数进行排序;
  4. 股票可视化:将排名靠前的N支股票可视化展现其价格随时间变化的趋势,并且在每个横截面上展示因子贡献的分配,给用户选择股票的交互接口;
  5. 投资组合分析:针对4中用户所选的股票按照某种策略构造投资组合,计算投资组合价格随时间变化的趋势,对投资组合进行回测;
  6. 投资组合可视化:将投资组合表现、组合中每只股票表现与市场指数的表现在时间序列上变化进行可视化。

可视化系统之所以使用线性模型,而不采用更复杂的模型,关键在于因子可视化的部分。线性模型的回归系数(又被称为因子收益率),对于所有样本是一致的。

因此可以绘制出随时间变化的因子贡献图:如图所示,每个点代表某个因子在该横截面的贡献,横坐标代表时间,点在纵坐标的位置不代表因子贡献值或者因子收益率,而代表因子收益率在当天的排序(区分收益率为正向上排布,反之向下),大小代表因子收益率,颜色代表因子所属六大类型之一。通过选中某个因子,将会将该因子在时间线上的变化一线串珠起来,直观显示因子在时间上排名的变动趋势。选中一系列因子,即可作为希望考虑的因子集合,进行股票分析。

image-20210518114137601

因子贡献图设计比较巧妙,但在无法显示真实收益率数据,无法比较预测值与真实值之间的差异,因而无法衡量模型是否在当前横截面上表现的比较好。使用复杂模型是否也能融入可视化系统,作为因子分析的一部分,有待讨论。

3 复杂模型构建

本章从XGBoost原理展开,构建XGBoost模型并进行可视化,随之使用单一模型,Dart,超参变换三种方式进行模型的调参,前者的模型之间相互独立,而后面两种方式都属于时间序列上调参,用到了较为复杂的技术。最后尝试了其他模型的构建,并对比所有模型误差大小。

3.1 XGBoost原理

集成学习继承链如图所示,XGBoost继承于GBDT,GBDT继承于BDT,BDT继承于Boosting,在保留父模型属性的基础上添加了自己新的属性。要详尽介绍XGBoost原理需要从Boosting属性(加法模型和向前分布说起)。

3.1.1 Boosting

Boosting并不是一个定死的算法,他体现的更多的是一种算法的思想:加法模型前向分布 算法的结合。[18]

加法模型

加法模型的输出是一系列弱基函数加权和,表达式为f(x)=m=1Mβmb(x;γm)f(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right)。其中,M表示基函数个数,b(x,γm)b(x,\gamma_m)代表基函数,γm\gamma_m代表基函数学习到最优的参数,βm\beta_m代表基函数的系数(权重)。

在给定的N个训练数据 {(xi,yi)}i=1N\{(x_i,y_i)\}_{i=1}^N 以及损失函数 L(y,f(x))L(y,f(x)) 的条件写,学习加法模型f(x)f(x)就成为了经验风险最小化问题:minβmγmi=1NL(yi,m=1Mβmb(xi;γm))\min _{\beta_{m} \gamma_{m}} \sum_{i=1}^{N} L\left(y_{i}, \sum_{m=1}^{M} \beta_{m} b\left(x_{i} ; \gamma_{m}\right)\right),即:找到一组基函数以及基函数的权重,使得他在当前样本空间下与标签值的差距最小化。

前向分布

前向分布求解问题的思路是:从前向后,每一步只学习一个基函数以及其系数,逐步逼近目标函数。具体的步骤如下:

输入:N个训练数据 {(xi,yi)}i=1N\{(x_i,y_i)\}_{i=1}^N 以及损失函数 L(y,f(x))L(y,f(x)) ,基函数合集{b(x;γm)}\{b\left(x ; \gamma_{m}\right)\}

输出:加法模型f(x)f(x)

  1. 初始化f0(x)=0f_0(x)=0
  2. 对m=1…M,极小化损失函数以求得对应基函数参数βm,γm=argβ,γmini=1NL(yi,fm(x)){\beta_m, \gamma_m} = arg_{\beta, \gamma}\min \sum_{i=1}^{N} L(y_{i}, f_m(x)),其中fm(x)=fm1(x)+βmb(x;γm)f_{m}(x)=f_{m-1}(x)+\beta_{m} b\left(x ; \gamma_{m}\right)
  3. 求和得到加法模型f(x)=fM(x)=m=1Mβmb(x;γm)f(x)=f_{M}(x)=\sum_{m=1}^{M} \beta_{m} b\left(x ; \gamma_{m}\right)

前向分布算法将同时求解从m=1…M所有参数的优化问题,逐步化简为逐次求解各个βm\beta_mγm\gamma_m的优化问题。

3.1.2 BDT

提升决策树(BDT, Boosting Decision Tree)是以决策树为基函数的提升决策树。[19]相对于Boosting,公式简化为f(x)=m=1MT(x,Θm)f(x)=\sum_{m=1}^{M} T\left(x, \Theta_{m}\right),其中,T代表决策树;Θm\Theta_m代表决策树的参数,M代表树的个数。具体有以下变化:

  1. 基函数权重βm\beta_m变为1;

  2. 基函数变为决策树;

  3. 损失函数采用平方误差,可以写成:L(y,fm1(x)+T(x;Θm))=[rT(x;Θm)]2L\left(y, f_{m-1}(x)+T\left(x ; \Theta_{m}\right)\right)=\left[r-T\left(x ; \Theta_{m}\right)\right]^{2},其中r表示前一步输出的残差,满足r=yfm1(x)r=y-f_{m-1}(x)

因此,每一轮的训练都在拟合上一轮训练的残差

3.1.3 GBDT

梯度提升决策树(GBDT, Gradient Boosting Decision Tree)在BDT的基础上,引入了梯度的概念。损失函数中,每一步都走当前梯度的方向,多次迭代之后,误差函数就会降到一个局部最低点。

核心做法是使用损失函数的负梯度代替残差:[φL(y,f(xi))φf(xi)]f(x)=fm1(x)-\left[\frac{\varphi L\left(y, f\left(x_{i}\right))\right.}{\varphi f\left(x_{i}\right)}\right]|_{f(x)=f_{m-1}(x)},表示损失函数(在前一模型输出值处)的负梯度的取值,使用这一值作为决策树中残差的近似值,作为目标训练下一次迭代。具体步骤如下:

输入:N个训练数据 {(xi,yi)}i=1N\{(x_i,y_i)\}_{i=1}^N 以及损失函数 L(y,f(x))L(y,f(x))

输出:梯度提升决策树f(x)f(x)

  1. 初始化f0(x)=argmini=1NL(yi,c)f_0(x)=argmin\sum_{i=1}^N L(y_i,c) ,确定分界点c,使得整体误差最小;

  2. 对每棵树m=1…M:

    对所有样本i=1…N,计算损失函数在当前模型的负梯度rmi=[φL(y,f(xi))φf(xi)]f(x)=fm1(x)r_{m i}=-\left[\frac{\varphi L\left(y, f\left(x_{i}\right)\right)}{\varphi f\left(x_{i}\right)}\right]|_{f(x)=f_{m-1}(x)} ,近似为当前样本在当前模型的残差,即当前学习目标(按照BDT原理),以此生成第m棵树。记当前样本回归到节点区域RmjR_{mj},该节点区域计算 cmj=argmin(xRmj)L(yi,fm1(xi)+c)c_{m j}=\operatorname{argmin} \sum_{\left(x \in R_{m j}\right)} L\left(y_{i}, f_{m-1}\left(x_{i}\right)+c\right)

  3. 求和得到梯度提升决策树f(x)=fM(x)=m=1Mj=1JcmjI(xRmj)f(x)=f_{M}(x)=\sum_{m=1}^{M} \sum_{j=1}^{J} c_{m j} I\left(x \in R_{m j}\right)

残差究竟跟负梯度有什么关系,为什么能够这样近似?比较好的解释是:既然希望找到f(x)f(x)使得 L(y,f(x))L(y,f(x))最小,那么f(x)f(x)就应该沿着损失函数减小的方向变化,即f(x)=f(x)φL(y,f(x))φf(x)f'\left(x\right)=f(x)-\frac{\varphi L(y, f(x))}{\varphi f(x)},又因为新学习器是由前一轮学习器和本次回归树相加,即f(x)=f(x)+T1f’\left(x\right)=f(x)+T_{1}。两式相减,得到φL(y,f(x))φf(x)=T1-\frac{\varphi L(y, f(x))}{\varphi f(x)}=T_{1}

3.1.4 XGBoost

GDBT关于残差的近似有点不够精确,毕竟只使用到一阶梯度。XGBoost[20]进行了二阶泰勒展开,并且同时在正则项、并行处理、缺失值处理上对前者进行了优化,可谓是相当大的改进,接下来依次介绍:

改进一:二阶泰勒展开

相对于GDBT,损失函数可以不再采用均方误差,中第一项可以写成: i=1NL(yi,fm(xi))=i=1NL(yi,fm1(xi)+T(xi;Θm))\sum_{i=1}^NL(y_i,f_m(x_i))=\sum_{i=1}^NL(y_i,f_{m-1}(x_i)+T\left(x_i ; \Theta_{m}\right)),其中T(xi;Θm)T\left(x_i ; \Theta_{m}\right)表示当前决策树输出。

根据泰勒公式的二阶展开式为:f(x+Δx)f(x)+f(x)Δx+12!f(x)Δx2f(x+\Delta x) \simeq f(x)+f^{\prime}(x) \Delta x+\frac{1}{2 !} f^{\prime \prime}(x) \Delta x^{2},损失函数第一项可以化为:i=1N[L(yi,fm1(xi))+giTm(xi;Θ)+12hiTm2(xi;Θ)]\sum_{i=1}^{N}\left[L\left(y_{i}, f_{m-1}\left(x_i\right)\right)+g_{i} T_{m}(x_i ; \Theta)+\frac{1}{2} h_{i} T_{m}^{2}(x_i ; \Theta)\right],其中 g 为(损失函数相对于模型输出的)一阶导, h 为二阶导,这里 L(yi,fm1(xi))L\left(y_{i}, f_{m-1}\left(x_i\right)\right)常数项,可以舍掉,化简为i=1N[giTm(xi;Θ)+12hiTm2(xi;Θ)]\sum_{i=1}^{N}\left[g_{i} T_{m}(x_i ; \Theta)+\frac{1}{2} h_{i} T_{m}^{2}(x_i ; \Theta)\right]

特别地,损失函数采用均方误差:g=L(y,f(x))f(x)=2(f(x)y)g=\frac{\partial L(y, f(x))}{\partial f(x)}=2(f(x)-y)h=2L(y,f(x))f(x)2=2h=\frac{\partial^2 L(y, f(x))}{\partial f(x)^2}=2;结果将会变得比较简单:i=1N[2(f(xi)yi)Tm(xi;Θ)+Tm2(xi;Θ)]\sum_{i=1}^{N}\left[2(f(x_i)-y_i) T_{m}(x_i ; \Theta)+T_{m}^{2}(x_i ; \Theta)\right]

改进二:引入正则项

在损失函数后面引入了第二项正则化项 Ω(Tm(x;Θ))\Omega\left(T_{m}(x ; \Theta)\right),代表本轮需要加进去的这个树模型的复杂度,用叶子节点的数量 T和每个叶子节点中的得分(输出值) ωj\omega_j来衡量模型复杂度:Ω(Tm(x;Θ))=γT+12λj=1Twj2\Omega\left(T_{m}(x ; \Theta)\right)=\gamma T+\frac{1}{2} \lambda \sum_{j=1}^{T} w_{j}^{2}。其中γ\gammaλ\lambda是因子系数,表示正则化项中更关注哪一部分。

进一步定义iIjg(i)=Gj,iIjh(i)=Hj\sum_{i \in I_{j}} g^{(i)}=G_{j}, \quad \sum_{i \in I_{j}} h^{(i)}=H_{j},则损失函数可以写成:j=1T[Gjwj+12(Hj+λ)wj2]+γT\sum_{j=1}^{T}\left[G_{j} w_{j}+\frac{1}{2}\left(H_{j}+\lambda\right) w_{j}^{2}\right]+\gamma T。若令其导数为0,求得wj=GjHj+λw_{j}=-\frac{G_{j}}{H_{j}+\lambda},损失函数最优解为12j=1TGj2Hj+λ+γT-\frac{1}{2} \sum_{j=1}^{T} \frac{G_{j}^{2}}{H_{j}+\lambda}+\gamma T

学习策略(决策树的分裂)

XGBoost采用贪心算法,每次尝试分裂一个节点,计算增益,选择增益最大的。因为损失函数中 Gj2Hj+λ\frac{G_{j}^{2}}{H_{j}+\lambda} 衡量了叶节点对总体的贡献,目标函数越小越好,该值越大越好,因此增益的计算方式为: Gain=12[GL2HL+λ+GR2HR+λ(GL+GR)2HL+HR+λ]γGain=\frac{1}{2}\left[\frac{G_{L}^{2}}{H_{L}+\lambda}+\frac{G_{R}^{2}}{H_{R}+\lambda}-\frac{\left(G_{L}+G_{R}\right)^{2}}{H_{L}+H_{R}+\lambda}\right]-\quad {\gamma}

增益越大,说明能使目标函数减少地越多,因此每次选择某一特征,枚举所有分裂点(精确贪心),选择增益最大的节点进行分裂,直到小于某个阈值,或者树的复杂度过大,停止分裂。还可以使用近似算法,将样本放入一个个桶中,根据分位数选取切分点。

改进三:缺失值处理

缺失值处理也是XGBoost的一大亮点,对于缺失值能自动学习出它应该划分的方向。简单来说:分别将特征k的所有缺失值放在左子树和右子树,分别计算增益,选择较大的一个,从而确定缺失值的划分。

由于XGBoost能自动处理缺失值,成为了其相对于其他模型的一大优势,不用使用各种方法委曲求全。对于因为各种情况不能获取因子值的情况迎刃而解。

3.2 XGBoost构建及调参

3.2.1 XGBoost构建

由于sklearn已经封装好了XGBoost,我们不必再关系其内部实现细节,更不用说对模型的结构进行调整。官方接口暴露的参数并不多,需要考虑的因素也不多:

  1. 为了高速训练,使用到gpu,并且不再使用默认的精确贪心,而是使用直方图近似();

  2. XGBoost回归的损失函数支持不仅支持损失平方回归(squarederror,MSE,又称均方误差),还支持对数损失平方(squaredlogerror,MSLE),逻辑回归等等。在本研究中仅考虑MSE与MSLE两种情况:

    MSE=1ni=1n(yiy^i)2MSE = {\frac{1}{n}\sum_{i=1}^n(y_i-\hat y_i)^2}

    MSLE=1ni=1n(log(yi+1)log(y^i+1))2MSLE = {\frac{1}{n}\sum_{i=1}^n(log(y_i+1)-log(\hat y_i+1))^2}

    两者之间的差异:MSLE 惩罚欠预测大于过预测,适用于某些需要欠预测损失更大的场景。如果预测的值的范围很大,MSE 会被一些大的值主导。这样即使你很多小的值预测准了,但是有一个非常大的值预测的不准确,MSE 就会很大。

    考虑到以下两点原因,最后采用了MSE作为损失函数:(1)自变量已经采取过标准化,箱型图已经在一个合理的范围内;(2)线性模型采用的是MSE,如果XGBoost采用MSLE就无法进行对比。

  3. 按照需求调整n_estimators,learning_rate,max_depth,max_leaf_nodes,max_delta_step等参数

  4. 使用early stopping,防止过拟合,并且可以减少计算量。

model = xgb.XGBRegressor(max_depth=6, learning_rate=0.05, n_estimators=100, objective='reg:squarederror',tree_method='gpu_hist')
model.fit(x_train, y_train, eval_set=[(x_test, y_test)], eval_metric='rmse', early_stopping_rounds=5)

3.2.2 XGBoost可视化

image-20210516161743100

对XGBoost模型在2013-03-01数据测试集上进行可视化,如图所示,XGBoost预测值(右侧)相对于线性模型(左侧)要显得激进一些,预测值的标准差远大于线性模型,可见XGBoost结构比线性模型复杂得多。

XGBoost以特征在树节点中出现的次数作为特征重要性,可以绘制一个重要性图(如图所示),某些特征出现的次数要原因多于其他因子(比如retnmax),说明这一因子的重要性要远大于其他因子。

XGBoost重要性较高的因子的前五名分别为:最大日收益率 (maximum daily return, retnmax)、12 个月动量 (12-month momentum, mom12)、市值(firm size, size)、交易额 (volume in dollar, volumed)、非流动性风险 (illiquidity, illq)。除了12 个月动量以外,其他因子都被《量化因子白皮书》选中为重要因子,因此,可以初步认定模型的构建是合理的。

image-20210516162357780

如图所示,对XGBoost生成的某颗树进行可视化,每个分支节点都是关于某个因子的条件,满足条件归于yes分支,不满足归于no分支,因子值缺失则按照missing所指示的方向,缺失值处理原理如3.1.4改进三所示,即使因子值是缺失的,该样本也是有意义的,XGBoost很好地避免了其他模型对于缺失值的窘境。

将XGBoost树可视化出来有助于后续解释每个因子的贡献值,直观地来讲,采用以下策略,也能计算得到每个因子的贡献值:

  1. 每个节点都会有一个预测值,代表样本从根节点到当前节点已经获取到的贡献值。该预测值通过子节点的平均值(按照样本的加权平均)计算得到;
  2. 每条边都有一个预测值,代表以该边为出边的节点对应因子的贡献值。该预测值通过后一节点的预测值减去前一节点的预测值得到;
  3. 对于每个样例,逐次通过每颗树,根据边的预测值进行累加,即可得到每个因子的贡献。

3.2.3 Dart

XGBoost主要结合了大量的回归树和较小的学习率。在这种情况下,早期添加的树木很重要,而后期添加的树木并不重要。Vinayak和Gilad-Bachrach提出了一种新的方法Dart[21],将深度神经网络社区的dropout技术添加到增强的树木中,并在某些情况下报告了更好的结果。

随机丢弃生成的决策树,然后再从剩下的决策树集中迭代优化提升树,这是DART的主要思想。具体有以下特性:

  1. 直接移除树来解决过拟合:阻止生成琐碎的树(只会纠正微不足道的错误)
  2. 训练过程引入随机性,因此:(1)训练可能会比gbtree慢,因为随机dropout会禁止预测缓存区;(2)提早停止可能会不稳定。

伪码DART的原理如图所示:

image-20210516110105802

在时间序列上使用Dart模型的思想如下:

  1. 使用第一个横截面上的数据训练一个初步模型,该模型使用dart作为提升器,作为后续模型的基础;采用的参数如下:

    max_depth=6, learning_rate=0.05, n_estimators=100, objective='reg:squarederror', booster='dart', rate_drop=0.1, skip_drop=0.5
    
    
  2. 后续横截面的模型在前者的基础上训练,而不是新建一个新的模型。跟深度学习模型的finetune类似,使用不同但相关的数据在同一模型上进行微调。

由于这种方法训练过程中引入了随机性,得到的均方误差并不稳定,多次训练但是平均下来均方误差趋近于一个稳定的值,将在3.3.4准确度对比中详细分析。

3.2.4 超参变换

有比手动调参更巧妙的方法吗?直觉上,类似遗传算法的思想,借助探索(exploration)+利用(exploitation)自动寻找最佳位置,将这种算法命名为超参变换。基于以下假设:相邻的模型对因子到收益率拟合情况是相近的,超参数也应该是相近的,不会有太大的变化。

具体的做法是:后一天在前一天的基础上随机选择k个参数进行变换,由于2013全年238天需要训练238个模型,就需要将参数变化237次,因为有了early stopping,我们不再需要更改迭代次数,有以下参数可以尝试更改:

  1. learning_rate:学习率,默认为0.05,每次上下浮动10%
  2. max_depth:基学习器最大深度,默认为6,每次上下浮动1
  3. early_stopping_rounds:在训练过程中经过多少次误差不降低就停止,默认为3,每次上下浮动1
  4. gamma:节点分裂所需要损失减小最小的阈限,默认0.1,每次上下浮动10%
  5. min_child_weight:越大,避免模型学习到局部样本,容易欠拟合,越小容易过拟合。默认1,每次上下浮动10%
  6. subsample:训练每棵树时,使用数据占全部训练数据的比例。默认值为0.7,每次上下浮动10%,最大值为1
  7. colsample_bytree:训练每棵树时,使用特征占全部特征的比例。默认值为0.7,每次上下浮动10%,最大值为1
para={
    0:6,     #  'max_depth':6,
    1:3,     #  'early_stopping_rounds':3
    2:0.05,  #  'learning_rate':0.05,
    3:0.1,   #	'gamma':0.1,
    4:1,     #	'min_child_weight':1,
    5:0.7,   #	'subsample':0.7,
    6:0.7    #	'colsample_bytree':0.7
}

在以上1-7可修改的参数中随机选择k个参数进行上浮和下浮,如果模型在测试集上得到的误差降低,将采用更新后的超参数进行下一轮迭代,每次记录超参数的值以便于最后进行可视化,查看超参数变化趋势并分析原因。

这里的k值指exploration的范围,k指越大,可供探索的范围就越广,但是同时模型训练的时间也变为了原来的k倍。在本次研究中,取k值为2,即随机选择两个因子,在保留了更大的探索空间的同时,也使得训练时间在可接受的范围内。

image-20210516112539842

以XGBoost使用去除缺失值作为源数据的第一轮迭代为例,超参变换趋势图如图所示(学习率量纲太小,绘制的是十倍),可以看到,基本上所有的超参数都有增加的趋势,其中early_stopping_rounds这一参数异常增大,这一结果意料之外,但仍在情理之中。可以做如下解释:

  1. 模型倾向于变得更加复杂:early_stopping_rounds从最开始3增加到最后75,最大深度从6增加到最后12;说明树的结构在变得越来越复杂,树的数量也在增加;
  2. 模型自动地避免过拟合,逐渐变得更加保守:min_child_weight从最开始的1增加到最后的45,gamma从最开始的0.3逐步增加到最终4.11;
  3. 对数据和因子进行采样的效果不尽人意:subsample和colsample_bytree最开始都设定在0.7的位置,但是学习的过程中逐渐向1趋近,说明对数据和因子采样对模型训练有负面影响。

3.3.5 准确率对比

将以上所有模型调参,其中(1)源数据自变量采用使用平均值、去除缺失值、未去除缺失值三种预处理方法,线性模型采用前两种,而XGBoost采用后两种;(2)超参变换方式采用了两轮,第一轮寻找超参的较优解,第二轮采用较优的超参再次拟合,从理论上来讲,第二轮的模型表现应该优于第一轮。

2013年全年MSE平均值 Linear XGBoost单一模型 XGBoost-Dart XGBoost-超参变换(first round) XGBoost-超参变换(second round)
使用平均值(Linear)
/未去除缺失值(XGBoost)
3.921 3.888 3.903 3.825 3.912
去除缺失值 3.801 3.742 3.768 3.717 3.833

image-20210516114233233

如图所示,通过以上准确率对比,有以下结论:

  1. XGBoost相对于Linear回归(图中蓝色柱子)的误差有一定的下降,但效果比较有限,不能做到本质的改变。
  2. 使用Dart方法(图中绿色柱子)相比XGBoost单一模型误差反而上升Dart考虑模型之间的相关性甚至还不如将模型独立开来,
  3. 超参变换第一轮次(图中红色柱子)能将误差下降到最低程度,但是第二轮次(图中紫色柱子)误差反而大幅度提高。可能因为第二轮次是使用从2013年最后一个横截面调整好的超参数重新回到第一个横截面进行拟合,造成了模型上的不连续。

不管如何调参,每天的预测MSE仍在3.5到4范围内,相当于每个横截面上都有2个百分点的误差。背后的原因是什么?模型已经足够复杂,只可能是数据本身就缺乏回归的可行性,尤其是因变量采用的是日收益率而不是k日收益率,可能在未来的研究中采用k日收益率,得到的结果会更合理。

3.4其他复杂模型

在使用XGBoost之后,也尝试使用了其他复杂模型进行尝试,包括随机森林与lightBGM,两者均为集成模型,相对深度学习模型可解释性更高。本节分别使用两种模型在2013-03-01数据进行测试,并对齐基学习器进行可视化。

3.4.1 随机森林

随机森林=决策树+Bagging,即一系列决策树进行投票,综合预测的过程,在回归任务中,采取的是众多决策树进行平均的策略。因此虽然相对线性模型更加复杂,但相对于XGBoost预测来说显得较为“保守”,在2013-03-01数据测试集上预测值如图所示,预测值的标准差较小,随机森林得到的准确率优于线性模型,但离XGBoost还有一段距离。

image-20210516164612096

如图所示,对随机森林其中的一棵回归树进行可视化,每个节点都有一个预测值,是子节点预测值按照样本量的加权平均,这一预测值对于解释模型是极有帮助的。

3.4.2 lightBGM

lightGBM是继XGBoost的另一种GBDT,速度比XGBoost快,采用直方图算法代替XGBoost的精确贪心或者进行贪心。但是这种模型的准确度不如XGBoost,在2013-03-01数据测试集上预测值如图所示,甚至与真实值之间有一大截差距。注意这里超参数是采用了sklearn的GridSearchCV进行搜索过的,即使大面积搜索超参数,模型的表现仍然很差,MSE一直居于5以上,远远弱于其他模型。

如图所示,对lightBGM其中的一棵回归树进行可视化,其结构与XGBoost类似,但是没有缺失值的处理。

image-20210516170834617

3.5 小结

复杂模型的确能给回归带来正面影响:(1)误差得到一定程度的减小;(2)可以使用更为全面的数据,即使带有缺失值的样本仍然可以训练和预测。但同时本身也带来了许多缺陷:(1)给解释因子收益率以便筛选有效的因子造成了极大的困难,无法验证复杂模型的结果是否可靠;(2)训练缓慢,常常需要线性模型多倍的时间去训练,尤其对于超参变换的方法;(3)降低的误差比较有限。

带来的优势是否能够弥补其带来的劣势仍是未知的,这也是目前金融领域较少采用相对复杂模型而使用线性模型的原因之一。为了避免这些问题,后续研究继续探索了解释复杂模型因子降维,和加入板块因子

4 解释复杂模型

提升可解释性与减小误差一定程度上是矛盾的。集成学习模型,相对于深度学习模型较为简单,有一定的可解释性,同时也有与深度学习近似的准确性。因此在金融领域采用XGBoost是非常有价值的一个尝试,对于复杂模型进行解释,以适应金融领域及投资的需求尤其重要。

本文主要采取了较为成熟的SHAP方法[22]对复杂模型进行解释,从复杂的机器学习模型中发掘一些规律和见解:

  • 在一次预测中,单一特征如何影响预测的?特征之间是如何相互影响的?用到依赖图;
  • 微观上(对于单一样本),每个特征对于输出值的贡献?用到SHAP图;
  • 宏观上(对于所有样本),每个特征是怎么影响模型预测的?用到摘要图;

本章从SHAP树模型简介,依赖图,SHAP图,总结图四个部分进行展开,使用到的模型为3.2.1中构建的XGBoost,使用的数据是去除缺失值后的因子作为自变量,日收益率作为因变量,在横截面2013-03-01的模型进行可视化。

4.1 SHAP树模型简介

image-20210516193132422

SHAP(SHapley Additive exPlanations),是合作博弈论中的一个解决方案,用于分配特征的贡献。如图所示,一个复杂的学习模型如同一个黑盒,输入特征,输出预测值,却无法给出特征如何影响输出的,贡献是正是负,影响了多少都是未知的,为了解释各特征的影响,借用了合作博弈论中SHAP值解释模型内部细节。

具体的,对于每个样本i,其预测值等于偏差bias和每个特征的SHAP值的加和:pred(i)=bias+j=1JSHAPj(i)pred^{(i)} = bias + \sum_{j=1}^{J} SHAP^{(i)}_j
其中:特征数为J,bias为模型的偏差,对于所有样本一致,SHAPj(i)SHAP_j^{(i)}表示第i个样本在特征j上的SHAP值,pred(i)pred^{(i)}表示模型对该样本的输出值。

SHAP对于树集成学习器,transformers,TensorFlow/Keras模型,PyTorch模型,其他模型都有不同的解决方法,将几乎所有用于模型解释的现有方法连接在一起,形成了SHAP框架。具体内容相当丰富,本研究仅关注XGBoost的SHAP解释,故这里只对SHAP树模型进行简介,采用的是Lee团队的TreeExplainer方法[]。

Lundberg S M, Erion G G, Chen H, et al. Explainable AI for Trees: From Local Explanations to Global Understanding[J]. CoRR, 2019, abs/1905.04610.

在3.2.2,3.4.1及3.4.2中都对树的结构进行了可视化,甚至求得了重要性等统计量,都是对于树在全局上的解释。在树的全局解释方法方面存在丰富的历史,但对局部的解释关注甚少,使用TreeExplainer方法提升了模型的可解释性,可以清楚的知道模型做出判断的依据,通过分解每个特征的贡献(局部解释)得到一些模型总结,特征依赖,交互影响等全局解释。

TreeExplainer方法结合了数据集中的多个局部解释进行,达到对模型判断机理的全局理解,并能够:(1)提高检测数据集中真实特征相关性的能力;(2)避免不一致问题;(3)构建SHAP(Shapley additive explanation)摘要图,简洁地显示了特征效果、普遍性和方向,避免了把特征效果和普遍性混为一谈,从而揭示了罕见的高幅值效果。

4.2 依赖图

2.3.2在构建线性模型之前做过了初步的数据线性相关性可视化,但是数据之间的相关性呈现的不一定线性关系,非线性关系,甚至一些数据分布形态都是值得注意的,SHAP就提供了部分依赖图、2D部分依赖图及贡献依赖图三种漂亮的可视化方法。

4.2.1 部分依赖图

部分依赖图旨在研究单一特征(因子)对于预测值的影响,在模型训练完成后进行的,具体的步骤为:(1)在预测时对于一个样例:选中某一变量,不停地修改其值进行一系列预测,记录所有的结果能得到一条线(特征-预测值);(2)使用多个样例重复以上步骤若干次,形成一个区域,最后做出区域的均值。通过分析这个区域的面积及走势,推断因子对于预测值影响的程度。

本次实验中,使用到了50个样例,选择的因子为XGBoost统计高重要性的4个因子进行分析,包括retnmax, beta, age, size。

image-20210516201159247

如图所示,分别是4个因子的部分依赖图,有两点值得注意的地方:(1)y轴表示的是模型预测相较于基线值或最左边的值的变化;(2)蓝色阴影部分表示置信区间。从图中可以看出,retnmax与预测值有正相关,由于区域的面积较小,说明retnmax对预测值的相关性高,能带来的信息量比较大,其他三个因子beta, age, size都对预测值负相关。

4.2.2 2D部分依赖图

如图所示,对特征之间的相互作用进行描述,与部分依赖图类似,但以两个因子(size和retnmax)作为自变量,颜色深浅代表预测值均值的大小。在retnmax较小,size较大时,预测值较小,retnmax较大时,不论size值大小,都对预测值有较大的正贡献;而在retnmax取0.1附近有一个横断面,retnmax表示最大日收益率,直观含义是:只要该股票在前一个月中存在某天收益率接近0.1,那么在该横截面上的收益率都有较高的期望。

4.2.3 贡献依赖图

部分依赖图展示了单或双因子对预测的影响,但没有因子的分布,贡献依赖图虽然也是描述双因子对预测的影响,但加入了更多的细节。贡献依赖图是一种散点图,每个点表示一个样本点,包含三个通道的信息:(1)横坐标表示因子A值的大小,(2)纵坐标表示因子A具体的贡献,(3)颜色代表因子B的大小。

image-20210516215948856

如图所示,左图展示正相关因子(idvol和total_vol),中间展示负相关因子(mom12和momchg),右图输入size作为因子A,Shapley自动寻找比较有趣的因子B。通过通道1和3的信息,可以发掘因子之间的相关性。通过通道1和2的信息,可以获取因子值如何影响其SHAP贡献,是否具有线性相关性。

4.3 SHAP图

4.3.1 单样本SHAP图

瀑布图和力图是单样本SHAP图的两种表现形式,两者相互等价,都是对表达式pred(i)=bias+j=1JSHAPj(i)pred^{(i)} = bias + \sum_{j=1}^{J} SHAP^{(i)}_j的图像化表达。

瀑布图如图所示,E[f(X)]E[f(X)]表示模型的偏差bias,基于此偏差,每个因子提供正或负的贡献,最终达到f(x)f(x),即该样本的预测值pred。其中红色部分表示因子的贡献为正,蓝色表示因子的贡献为负,由于因子太多,仅显示贡献值绝对值大小排名前几的因子。图中选择的是2013-03-01当天模型在第195个样例上的表现,属于预测比较准确的样例,真实值为3.936,预测值为3.869,误差很小。

image-20210516220623858

力图如图所示,与瀑布图类似,只是将所有因子聚集到同轴上了,在轴的下方标注了该因子对于的SHAP值,图中的base value即模型的偏差bias,每个红色箭头代表一个给预测值带来正贡献的因子,蓝色箭头代表一个给预测值带来负贡献的因子,红色和蓝色的交界处即为该样例预测值f(x)f(x)。因此偏差向左移动所有蓝色箭头的长度,再向右移动所有红色箭头的长度,正好到达预测值。

image-20210516222400614

4.3.2 横截面SHAP图

通过将力图旋转90度,并且水平上堆积,可以看到整个数据集上的解释,因为这是模型在该横截面上(2013-03-01)所有样本的SHAP解释图,可称为横截面SHAP图。

这里选取了测试集300个样本,横坐标为样本的标号,纵坐标为收益率,红色和蓝色交界处即为因子的预测值,红色部分代表所有给预测值带来正贡献的因子,蓝色部分代表所有给预测值带来负贡献的因子。所有样例的偏差是一致的,在图中1.096的位置,对每个样例来说,从此位置向下移动蓝色的距离,再向上移动所有红色的距离,正好达到预测值,即红蓝交界处。特别的,鼠标停留在195样例上即可显示对应的因子收益,及预测值,与单样本SHAP图完全一致。

image-20210516223010098

数据集SHAP图能够表达相当丰富的信息,也可以进行多种形式的可视化,选择“样本按照相似度排序”的结果如图所示,相邻样本之间因子贡献相似。

image-20210516224028162

按照因子retnmax排序的结果如图所示,这时,横坐标不再是样例序号,而是retnmax值的大小,从这张图中,也可以看出来retnmax在值为0.1附近整个模型的解释有一个突变,之前的部分蓝色部分多于红色部分,而之后红色部分要远多于蓝色部分,从而造成了比较高的预测值。

image-20210516224256644

4.3.3 全局SHAP图

以上横截面SHAP图在本研究的应用上的有两个缺陷:(1)没有展示真实值的大小,故不能判断SHAP解释是否有效;(2)只能展示某个横截面上单一模型,不能展示按时间序列排布的多个横截面上模型的情况。因而无法比较因子在时间序列上贡献的稳定性、持久性与连续性。

2.5所述线性模型因子贡献图是一种优雅的金融多因子量化选股模型的可视化设计,如果使用复杂模型,是否也能设计一种类似的图,可供因子贡献值直观的表现,并且提供交互方法选择对应的因子。

image-20210516225545458

全局SHAP图是一种解决方法,如图所示,收益率,股票,时间是需要可视化的三个维度,在每个时间横截面上都有一个横截面SHAP图,需要展示所有样本,所有因子对于收益率的SHAP解释。但是全局SHAP图仅是理论上可行,如何实施一种可行高效的可视化系统是一大难点,需要满足以下条件:(1)同时应付 238*2275*81高维变量的可视化;(2)给予用户交互的权利,可以选中某一横截面、某一因子、某一支股票单独查看;(3)进行股票或者时间线上的聚合以优化可视化复杂度,优化交互。

4.4 摘要图

摘要图是对SHAP解释的统计图,包括散点摘要图和因子贡献平均图。

enter image description here

散点摘要图如图所示,可视化展现出特征对结果影响的总览,横坐标表示对应特征的SHAP贡献,纵坐标表示每个特征(按照对于预测值的影响进行了排序,选取排名靠前的因子可视化),每个样本在每个特征上都绘制一个散点,点的位置代表当前样本在当前因子上的SHAP贡献,点的颜色代表当前样本的因子值。

对于某个因子,如果红色的点基本在右边,蓝色的点基本在左边,说明该因子大给预测值以正的贡献,因子小给预测值以负的贡献,即该因子与收益率成正相关关系,并且点在SHAP解释上分布的标准差越大,则正相关关系越强。注意这里的相关不一定是线性相关,可以使用复杂的非线性模型对数据拟合。

因子贡献平均图如图所示,对于某个因子,计算所有样本SHAP值绝对值的平均值,将这个平均值作为特征的重要性。衡量了因子对于预测值的影响程度,在这一表示上,与XGBoost以因子出现次数衡量重要性非常相似,因为有对每个因子的量化,排序方式要显得更有参考价值。

4.5 小结

本章主要对XGBoost如何分配因子的贡献进行了解释和可视化。复杂模型的确能给回归带来正面影响,但是如何解释复杂模型,以适应金融领域及投资的需求,SHAP提供了一个解决方案。首先使用贡献图对于数据之间的非线性相关关系进行了可视化,后续使用SHAP图在微观上对因子贡献给予直观的展示,最后使用摘要图描述宏观上对因子影响模型预测的方式及其重要性。但如4.3.3所述SHAP嵌入到金融领域,对时间序列上一系列横截面模型进行可视化,并真正适合投资者使用,仍然需要未来深入的可视化系统设计及实践。

5 因子降维

复杂模型使得误差得到一定减小,但是无论是解释复杂模型,设计可视化系统,还是模型训练和预测,都带来了比较大的代价。因此是事先进行因子降维,将相关性低的因子排除,从而达到在保留模型误差不升高多少的情况下:(1)节约计算资源;(2)合理分配其他因子对于收益率的贡献,增加模型的可解释性。

在众多降维方法之中,基于坐标变换的降维方法,如PCA, LDA等方法会使得因子含义完全丧失,违背了更合理分配因子贡献的初衷,因此采用了一种简单的方法,基于因子在每天的排序重要性剔除低重要性因子,从而达到降维的效果。为了区分统一剔除,抑或是单天剔除,又分为预降维和后降维两种方法。

本章首先提出因子排序重要性的概念,之后使用排序重要性作为指标去除无用特征对比各模型误差,最后再分别使用预降维和后降维两种方法对筛选出最佳因子组合,并比较剔除前后的准确率。使用的数据是2013年全年的数据,模型使用了线性模型和XGBoost进行对比,自变量同时使用了平均值填补、未去除缺失值、去除缺失值三种预处理策略,因变量使用了日收益率。

5.1 排序重要性

如图所示,在模型训练完成后,随机打乱某一特征各个样例的数据,重新进行预测,准确率会降低吗?直觉上,如果该特征对于预测很重要(正相关和负相关均属于对预测很重要),打乱顺序后预测准确率降低的大小将会很大;如果该特征对于预测基本上不相关,打乱顺序后预测准确率甚至会不降反升,因为这种随机排序给模型预测提供了机会。

排序重要性(Permutation Importance)[23],又称平均降低准确率(MDA, Mean Decrease Accuracy),正衡量了随机打乱某一特征后准确率降低的平均值,并以此作为该特征的重要性。

2

2013-03-01横截面上XGBoost的排序重要性如图所示,这是继3.2.2中XGBoost贡献图、4.4中因子贡献平均图之后的又一种因子重要性排序方式,从图中,可以获取以下信息:(1)retnmax是最重要的特征,打乱顺序对于结果的影响最大;(2)RDsales重要性为负值,打乱后预测值反而变得更加准确,说明这种特征完全不重要,随机的排序提供了幸运空间。

5.2 去除无用特征

虽然为因子重要性排序的方法很多,在本研究中只采用了排序重要性作为指标。不论是线性模型还是XGBoost,采用去除无用特征的策略是:

  1. 对于每个横截面的模型,构建模型之后计算每个因子的排序重要性;
  2. 在全年所有模型上,分别计算出每个因子排序重要性值为负的个数,排序重要性的总和两个指标,作为衡量全局因子重要性的两个属性;
  3. 选择在负值个数排名前十的因子,及重要性总和排名后十的因子,取两者的交集,认定为“无用特征”并予以去除;
  4. 使用剩下的因子重新对数据进行拟合,比较误差。

对于线性模型,重要性总和排名后十、负值个数排名前十的因子,如表所示,获取到的无用特征包括:EP, INVchg, ROA, AM, RD, CFdebt, AG, ROE, age。

1 2 3 4 5 6 7 8 9 10
INVchg ROA EP RD CFdebt AG AM ROE age turn
sum -0.020763 0.0092 0.051527 0.093335 0.117634 0.26277 0.317527 0.327453 0.446346 0.467408
INVchg EP ROA RD age AG CFdebt AM ROE CRG
negative 124 121 116 116 103 102 101 99 99 95

对于XGBoost,重要性总和排名后十、负值个数排名前十的因子,如表所示,获取到的无用特征包括 EP, INVchg, ROA, AM, RD, CFdebt, AG,QR, ROE。与线性模型排除的因子基本一致,只是将age改成了QR。

1 2 3 4 5 6 7 8 9 10
INVchg EP ROA RD CFdebt AG AM QR ROE turn
sum -0.072263 -0.061677 -0.005055 0.049697 0.138167 0.253116 0.259827 0.336807 0.350083 0.405136
INVchg ROA RD EP CFdebt AM QR ROE AG mom12
negative 129 126 121 120 111 110 108 101 97 89

分别对线性模型和XGBoost去除各自的无用因子后,使用2013全年的数据再一次进行拟合,得到如表所示的均方误差,最右一栏为去除低重要性因子后的表现。即使去掉了十个因子,全年的误差也几乎没有上升,甚至对于Linear使用平均值的模型反而有所下降。

2013年全年MSE平均值 原始模型 去除低重要性因子
Linear使用平均值 3.921 3.903
Linear去除缺失值 3.801 3.818
XGBoost未去除缺失值 3.888 3.910
XGBoost去除缺失值 3.742 3.749

5.3 筛选最佳因子组合

为了选择最佳因子组合,给投资者一系列去除低重要性的方案,不是按固定的策略固定去除,而是按照需求灵活去除因子。因此使用预降维和后降维两种策略。

5.2 预降维

预降维给予投资者选择去除因子个数的权利,以动态适应投资者的需求。不同投资者对于模型误差接受的程度不一样,对于因子个数的要求也不尽相同。如果想将目光聚焦到前k个尤其重要的因子,而避免其他因子的影响,可能需要牺牲模型的准确性,增强可视化效果;如果依然想让模型保持较高的准确性,最好将去除因子个数选取在误差突变之前的点。

在本研究中使用2013全年的数据,模型使用线性模型,对无用特征进行排序过后,考虑逐个排除因子,查看准确率是否有较大的影响,逐个排除因子的策略如下:(1)计算每个因子在全年的排序重要性总和排序重要性为负的个数,如果是XGBoost,还可以考虑SHAP中因子贡献平均值XGBoost因子出现的次数;(2)对每个因子进行打分,打分综合考虑了1中所有的属性,按照因子在这些属性上的排名打分,越重要的因子打分越高;(3)对因子打分进行降序排序,选择前k个因子进行排除;(4)对于剩下的因子在全年所有模型上重新训练,记录均方误差的平均值。

去除因子数 0 3 20 35 40
2013年全年MSE 3.801 3.796 3.827 3.924 4.045

全年MSE随因子如图所示,去除前3个因子时,误差下降达到最小值;在去除20个因子以前,误差变化较小,随之有一个误差的阶梯式升高;去除因子达到35个是另外一个阶梯,之后误差会急剧增大,可能因为有效的因子在最后的21个之中。真正有效的因子数量差不多只有20个,直接去除掉不但提高了模型的可解释性,也会加快模型训练速度。

5.3 后降维

预降维是在全年排除相同因子采用的,而后降维将对每天的数据进行评估,对于每天的模型分别去除不重要的因子,是因子降维的一种动态策略。对每个横截面上的模型采取的策略是:(1)使用k个随机打乱顺序,计算出所有因子重要性,若k个排序重要性均为负则去除该因子(k越大,筛选低重要性因子就越严格,去除的因子越少);(2)采取剩余的因子再次进行拟合。记录该横截面上去除因子的个数和均方误差,最后求平均值。

k 1 2 3 4
平均去除因子个数 15.092 11.374 10.025 9.134
2013全年MSE 3.83609 3.82184 3.77619 3.79177

image-20210517154808546

如图所示,左侧坐标轴及橙色的柱子为2013全年MSE,右侧坐标轴及蓝色折线图为平均去除因子的个数。当k=3时,模型在全年MSE达到最低,并且平均去掉了10个因子以上,k值再增加并不能使得结果变得更好。

相比于预降维来说,后降维更加灵活,不再指定每天移除的因子必须相同,而是对每个模型动态去除因子。在去掉相同的数量的因子的情况下,相对预降维达到更小的误差。

5.4 小结

在金融领域,随着量化因子的维度越来越大,因子降维显得越来越重要,为了保留因子可解释性,一般采用的方法是去除低重要性因子或者因子聚合。去除低重要性因子的依据有很多,在本研究中采用的主要是排序重要性,以MSE为指标筛选最佳因子组合,确定去除因子的个数,具体筛选的方法也分为预降维和后降维两种,按照投资者的喜好确定降维的策略和筛选因子的严格程度。

6 引入板块因子

即使使用了56个因子进行回归,依然提供不了足够的自由度去适应A股市场近3000支股票,即使采用了复杂模型并进行一系列调参、因子降维等技术,误差值仍然居高不下,目光聚焦到源数据本身,而不是处理数据的模型和算法,如果能在研究中引入更多的因子,模型的误差是否会下降。

业界比较成熟的方法是将股票分板块分析,本研究借鉴了分板块的思想,将板块作为一个类型的因子,引入模型中。本章首先从同花顺i问财网站上获取板块数据;其次对板块进行可视化,分析板块分布的情况;最终使用线性模型和XGBoost模型分别进行回归,比较误差并分析原因。

6.1 获取板块数据

如图所示,板块数据在同花顺i问财上最为齐全,由于行业是按照“大-中-小”类进行区分的(例如:信息服务-传媒-营销服务),因此每只股票有三个行业数据。经过网络爬虫和数据预处理,得到了如表所示4259 支股票的股票代码、公司名称、大-中-小板块数据。最终得到三级板块类别数目分别为24、66、200个。

ts_code name sector1 sector2 sector3
0 600891 退市秋林 综合 综合 综合Ⅲ
1 002071 长城退 信息服务 传媒 营销服务
2 600701 退市工新 综合 综合 综合Ⅲ
3 603157 *ST拉夏 纺织服装 服装家纺 女装
4 688215 瑞晟智能 机械设备 专用设备 其它专用机械
4254 600614 *ST鹏起 有色金属 新材料 金属新材料Ⅲ
4255 600634 *ST富控 信息服务 传媒 其他传媒
4256 002260 *ST德奥 家用电器 白色家电 小家电
4257 002359 *ST北讯 信息设备 通信设备 通信配套服务
4258 002711 *ST欧浦 交通运输 物流 物流Ⅲ

另外,在2013全年2275支股票样本中,有35支未出现在以上数据中(包括600401.SH000939.SZ600317.SH、600074.SH等),可能是已经退市很久了,不再被记录。在本研究中,默认这些股票不属于任何板块。

6.2 板块可视化

已经获取了三级板块数据,关键的问题是如何选择板块?选择一级还是二级、三级板块,如何在模型中嵌入板块数据,考虑到简便性和可实施性,最初提出了以下几种方案:

  1. 分为24个大板块,每个横截面训练24个模型去拟合数据;
  2. (1的基础上)将相似的板块进行聚合,每个横截面训练的模型更少些;
  3. 将板块作为一个属性,是则为1,否则为0,相当于扩展自变量的因子的维度,24个大板块相当于24个因子,每个横截面仍然只用训练一个模型,但是因子的维度增加了板块的类型数;
  4. (3的基础上)对板块因子进行降维处理,将低维的板块因子加入因子中进行训练。

为了权衡以上方案的可实施性,预先可视化行业分布情况,对6.1中获取的数据进一步加工处理,绘制了行业环形图和行业气泡图:

3 4

如图所示,行业大板块包含股票(上市公司)数目的前五名分别是:机械设备、信息服务、化工、医疗生物、电子。但这并不代表这些行业是最有影响力的行业,因为并未将公司的市值大小考虑进去,可能很多行业已经出现了寡头垄断的现象,造成上市公司只有那几家市值非常大的公司,小型的公司迫于竞争压力而难以进入市场。

考虑到添加因子的代价要小于每天拟合多个模型,拟合多个模型造成复杂模型的解释、因子降维都会复杂许多,故最终采用了方案三,并且同时实验了大板块和中板块数据的加入,比较结果。

6.3 模型回归

对于大板块共24个类别,每个类别作为一个因子,拼接在自变量之后,将自变量原本56维扩展到80维。类似的,对于中板块共66个类别,自变量将扩展到122维。

使用的数据是2013年全年的数据,使用模型的情况同5.3(Linear使用平均值、Linear去除缺失值、XGBoost未去除缺失值、XGBoost去除缺失值四种情况),因变量使用了日收益率。

2013年全年MSE平均值 原始模型 去除低重要性因子 加入大板块数据 加入中板块数据
Linear使用平均值 3.9213 3.9034 3.7450 3.8616
Linear去除缺失值 3.8005 3.8178 3.7889 3.7723
XGBoost未去除缺失值 3.8883 3.9095 3.7986 3.8648
XGBoost去除缺失值 3.7419 3.7494 3.7204 3.7307

image-20210517195836470

如图所示,加入大板块数据(黄色柱子)使得四种情况的原始模型(红色柱子)MSE都有了显著的降低,尤其对于Linear使用平均值,XGBoost未去除缺失值两种情况,说明板块因子的确对模型回归有正面影响。

需要注意的是,如果加入的是中板块数据(蓝色柱子),虽然表现仍然优于原型模型,但表现会变差,在这种情况下,122个因子中有超过一半(66个)的因子都是板块数据,因为板块数据都是独热编码,造成了输入矩阵极其稀疏的情况,不论是线性模型,还是XGBoost,都不能很好的应对这种情况。因此在引入板块数据之后,尤其是高维的中板块,甚至小板块数据,按照5中的因子降维也是很有必要的。

6.4 小结

就引入板块因子本身来说,依然是一个相当有启发性的尝试,至少模型误差有了较大幅度下降,其效果甚至能媲美使用复杂模型带来的增益。但是仍然面临着较大的挑战,独热编码作为特征本质上是对样本类别的划分,但是在类别比较多且互相之间不交叉的情况下将产生大量稀疏数据,给模型带来较大负担,同时因为存在大量无用的因子抢夺其他因子的贡献,降低了模型的可解释性。比较好的解决方式是将高维度独热编码的板块因子聚合成少数几个特征,使得这些特征在分布上能够充分利用实数域空间,同时能够较好地表达板块直接的关系。

结论

本研究围绕着复杂金融投资模型可解释性和准确性两个主题进行了一系列探索,两个主题既截然对立,又互相联系。令人惋惜的是,每次在某个方面有了些许提升,都在另外一个方面付出了代价,这样的代价有时候甚至要超过收益。复杂模型的引入降低了误差,但是难以设计解释复杂模型的可视化系统,前者是量的提升,后者是质的恶化。

尝试使用更加复杂的策略、模型和算法有时候并不能带来期望的收益。这也正印证了金融投资领域的一个金句:“越是简单的策略反而越有效”,人们在接触到更多策略后,下意识觉得越复杂的策略越精准、高级、带来超额收益。但实际上策略越是复杂,受到条件的限制越多,受到的影响越多,最后结果越不稳定。

首先使用线性模型在2013年的每个时间横截面上,以股票日收益率为因变量,五道口金融学院发布的六类56个因子值为自变量,进行了多因子模型的建模拟合。将回归系数作为因子收益率,量化了因子对股票收益的影响程度。将线性模型拟合的结果(均方误差和线性模型可视化系统)作为后续研究的参照。

在提升准确性部分,本文采用了复杂模型回归,并引入了板块因子。首先使用了更为复杂的XGBoost模型,并采取了Dart及超参变换策略进行调参,尝试了另外两种模型(随机森林和lightBGM)作为对比,得到了在均方误差及数据利用率上优于线性模型的方案。并且借鉴了金融领域分板块的思想,在量化因子模型中引入了三级板块因子,分别加入因子数据中进行回归,其中大板块因子的引入得到了最佳的结果,在均方误差降低的程度甚至比得上采用复杂模型。

在提升可解释性部分,本文采用了解释复杂模型,因子降维。首先对XGBoost进行SHAP解释,绘制其微观上的依赖图、SHAP图,和宏观上的摘要图,并提供了一种可视化系统设计方案——全局SHAP图。之后以排序重要性作为依据,去除低重要性因子,并对线性模型使用了预降维和后降维两种处理方法筛选最佳因子组合,使得均方误差不增加情况下,极大程度上缩减了因子的维度。

本文在金融投资模型的准确性和可解释性中探索并实施了大量模型和策略,取得了一定的成果与创新,未来研究的方向可从如下七方面进行:(1)因变量采用k日收益率而非收益率;(2)自变量因子的维度可以进一步扩展,将大量市场经验加入多因子量化模型;(3)复杂模型可以尝试使用深度学习模型,具有更好的回归准确率;(4)尝试使用时间序列模型,而非在每个横截面上都拟合一个模型,相互之间独立;(5)设计一个针对SHAP解释的可视化系统,以适应复杂模型在金融领域的应用;(6)在因子降维中使用更多指标作为去除因子的依据,而非只有排序重要性;(7)使用因子聚合,将相同类型的因子聚集为一个大因子,尤其对于高相关性因子,及稀疏的板块类型因子。

本研究在金融投资领域使用复杂模型进行回归即可视化都已经挖掘到一定广度和深度。但是相对而言,内容比较零散,章与章之间的关系不够强烈,没有形成一个完整的逻辑体系。一方面,需要进一步深入挖掘金融领域在股票市场投资的成熟策略,进行模型化,并纳入多因子量化模型体系;令一方面,需要设计并实践一个针对SHAP解释的可视化系统,能够融合本研究中所尝试的所有策略,真正意义上将复杂模型进行应用,提供更为丰富的交互接口,帮助投资者决策。

致谢

时间飞逝,四年的大学生活无意识间已经结束,看起来漫长的一千四百六十个日夜实际上很短。我现在还清楚地记得,2017年夏天我带着行李来到沙河报道的场景恍如昨日。过去四年,我怀着对大学的憧憬和好奇心,从一个无知的青年成长起来。在学校的细心训练中,我逐渐成长为一个富有专业知识、能够独当一面的年轻人。

首先,感谢北航四年的教育,让我深入理解计算机体系结构和底层原理,将我带入崭新的计算机世界。出于对未知的好奇和兴趣,选修了大量一般专业课程,因此学习到大量专业的知识和技术,包括Python, Java, C/C++等编程语言,还通过学校课程,自学、阅读相关文献并动手实践代码而对机器学习领域有了较为深入的理解。

其次,感谢学校的学生社团组织,大学期间参加的社团给了我相当宝贵的经历。大二期间我担任指舞吉他社副社长,主要负责社团的设备和资金管理,参与组织大大小小的活动,其中包括一场超过300人的大型晚会。这些经历给了我极大的改变,使我的组织协调、人际交往能力得到了极大的提升,在后续许多项目中,我逐渐从一个学习者转变成为一个领导组织者,尤其担任了许多项目的组长,包括软件工程、校级数学建模大赛、冯如杯科技竞赛、数据挖掘、无线网络系统、Matlab程序设计等,并在这些项目上取得了较好的成绩。

因此,也非常感谢这些项目组员的配合,让我有机会体验一个领导者的担当和责任。在以上这些项目中,我主要负责,任务分解与分配、项目集成和部署,展示和答辩等环节。作为一个领导者,最重要的不是自己做了多少工作,而是以一种分治的思维,将复杂棘手的问题分解为一个个相对容易的子问题,按照组员擅长的方向合理给组员分配任务,最后集成一体,形成一个体系。每当集小组所有人的力量,完成了一个庞大的项目,我都会有一种由衷的自豪。

再次,我想感谢我的导师时磊老师。毕业设计是大学四年中最重要的部分之一,为我们的大学生涯提交一个满意的答案,并留下宝贵的记忆。由于家人热衷于金融投资,我也稍微对金融领域有所染指,并且在经济学和金融学上自学了大量知识,并非希望展开金融领域的研究,而是为未来在理财和公司管理上做准备。当我苦于毕业设计的选题时,时老师给了我这个宝贵的机会,有关金融投资模型的研究使我对金融领域有了更为深入的理解。在我迷茫与金融领域研究出路时,时老师为我寻找了继续发展的道路,给了我很大的鼓励。所以,我非常感谢我的导师,给了我试炼的机会与不断前进的勇气。

接下来,我想感谢一直支持我的父母。他们不太干涉我的学习,但每当我遇到困难,苦于寻找解决方法的时候,他们会给予我全力的支持和帮助。在毕业后的留学和读研的重要选择中,他们支持我的决定,将成为我遇到各种困难最强的支援。在学术研究和课余生活中,不论开心和失落,成功和失败,总有家人倾听我的抱怨,分享我的喜悦,使我走出自卑与挫败的阴影。是他们的支持和鼓励,让我乘风破浪,不断向前。

当然,我想感谢我的辅导员王嘉凯,我的室友和同学,感谢他们在我的研究和校园生活中的帮助,让我的大学生活更加完善和丰富。我们分享喜悦和悲伤,互相鼓励,互相支持,受到压力的时候一起进步。毕业的时候,祝朋友们有个美好的未来,可以找到自己喜欢的工作,我希望我们友谊长存。

最后,感谢各位评审老师们能够在百忙之中抽出珍贵的时间,评审我的论文。

感谢出现在我大学时光中的每一个人,愿大家身体健康、心想事成!

参考文献

[1]Harry Markowitz. Portfolio Selection[J]. Journal of Finance, 1952, 7(1):77-91.

[2]W. F. Sharpe. Capital Asset Prices: A Theory of Market Equilibrium Under Conditions of Risk[J]. The Journal of Finance, 1964, 19(5): 452-422.

[3]S. A. Ross. The Arbitrage Theory of Capital Asset Pricing[J]. Journal of Economic Theory, 1976, 13(3):341-360.

[4]E. F. Fama, K. R. French. Common Risk Factors in The Returns on Stocks and Bonds [J]. Journal of Financial Economics, 1993, 33:3-56.

[5]DeFusco R A, McLeavey D W, Pinto J E, et al. Quantitative investment analysis[M]. John Wiley & Sons, 2015.

[6]Schwabe R. Optimum designs for multi-factor models[M]. Springer Science & Business Media, 2012.

[7]廖理, 赵锋, 李阁峰. 基于多指数模型的投资组合风险控制方法和风险因子识别[J]. 世界经济, 2003, 26(09):44-49.

[8]汪洋. 基于估值与业绩的选股策略有效性研究[D]. 电子科技大学, 2010.

[9]刘辉, 黄建山. 中国A股市场股票收益率风险因素分析:基于Fama-French三因素模型[J]. 当代经济科学, 2013, 05(04):27-31.

[10]清华大学五道口金融学院民生财富管理研究中心. 中国A股市场量化因子白皮书[Z]. 北京:清华大学五道口金融学院, 2018.

[11]Kyoung-jae Kim. Financial time series forecasting using support vector machines [J]. Neurocomputing, 2003, 55(1-2): 307-319.

[12]Zhou C , Yu L , Huang T , et al. Selecting Valuable Stock Using Genetic Algorithm[C]// Simulated Evolution and Learning, 6th International Conference, SEAL 2006, Hefei, China, October 15-18, 2006, Proceedings. Springer Berlin Heidelberg, 2006: 688-694.

[13]张冬阳. 基于Logistic回归的Barra因子选股模型研究[D]. 南京大学, 2018.

[14]黄媛. 基于LSTM神经网络的多因子选股模型实证研究[D]. 湘潭大学, 2019.

[15]王伦. Adaboost-SVM多因子选股模型[J]. 经济研究导刊, 2019(10):107-108.

[16]王伦, 李路. 基于gcForest的多因子量化选股策略[J/OL]. 计算机工程与应用:1-11[2020-05-26]. http://kns.cnki.net/kcms/detail/11.2127.TP.20191228.1124.004.html.

[17]刘佳琪, 张建. 基于机器学习的多因子选股模型[J]. 时代金融, 2020(17).

[18]Bar A, Rokach L, Shani G, et al. Boosting Simple Collaborative Filtering Models Using Ensemble Methods[J]. CoRR, 2012, abs/1211.2891.

[19]Appel R, Fuchs T J, Dollar P, et al. Quickly Boosting Decision Trees - Pruning Underachieving Features Early[A]. Proceedings of the International Conference on Machine Learning (ICML)[C]. USA: JMLR.org, 2013:594-602.

[20]Chen T, Guestrin C. XGBoost: {A} Scalable Tree Boosting System[J]. CoRR, 2016, abs/1603.02754.

[21]Rashmi K V, GiladBachrach R. DART: Dropouts meet Multiple Additive Regression Trees[A]. Proceedings of the Eighteenth International Conference on Artificial Intelligence and Statistics (AISTATS)[C]. USA: JMLR.org, 2015.

[22]Lundberg S M, Lee S. A Unified Approach to Interpreting Model Predictions[A]. Annual Conference on Neural Information Processing Systems (USA)[C]. CA, 2017:4765-4774.

[23]Altmann A, Tolosi L, Sander O, et al. Permutation importance: a corrected feature importance measure[J]. Bioinform., 2010, 26(10):1340-1347.