【研报分享】华泰证券:再探基于遗传规划的选股因子挖掘

因子挖掘
标签: #<Tag:0x00007fc069d18ab8>

(anna) #1

【华泰金工林晓明团队】再探基于遗传规划的选股因子挖掘——华泰人工智能系列之二十三

摘要

本文对遗传规划提出了三个改进方向,进一步提升其因子挖掘能力

本文是对华泰金工前期报告《基于遗传规划的选股因子挖掘》(2019.6)的补充和改进,目的是进一步提升遗传规划挖掘选股因子的能力。本文提出并测试了3个改进方向:(1)新的适应度指标——因子互信息和多头超额收益;(2)非线性因子的使用方法;(3)交叉验证控制过拟合。测试中展示了20多个挖掘出的选股因子供投资者参考。通过方法论的介绍,本文旨在说明遗传规划或许能挖掘出大量因子(尤其是非线性因子),这对于能够利用非线性因子的机器学习选股模型来说具有重要意义。

改进方向1:新的适应度指标——因子互信息和多头超额收益

互信息可以捕捉因子和收益间的非线性关系,在遗传规划中使用互信息作为适应度指标,可以挖掘出多个互信息较高的因子。在分层测试中,该类因子与收益的关系大多呈现出“中间分层收益高,两端分层收益低”的特性,且分层规律稳定,这种规律能被基于机器学习的多因子选股模型有效利用。另外,部分投资者可能希望从多头超额收益来评价因子,本文也将多头超额收益加入到适应度指标中,挖掘出了数个多头超额收益较高的因子。

改进方向2:非线性因子的使用方法

对于非线性因子的使用,一般有两大类方法,第一类方法是在因子合成时直接使用机器学习模型(如XGBoost、神经网络等)拟合因子与收益率间的关系。第二类方法是对单个因子做非线性变换,重构因子与收益之间的关系,最终得到线性因子。第二类方法中有两个具体方法:三次方回归残差法和多项式拟合法。两个方法各有优劣,在本文的测试中,三次方回归残差法比较简单,但转换效果较差;多项式拟合法转换效果较好,但需要逐个对因子拟合非线性关系,拟合结果对不同因子不能通用。

改进方向3:交叉验证控制过拟合

为了控制过拟合的风险,我们在gplearn中加入交叉验证环节,观察新因子在验证集上的适应度表现,据此来评价遗传规划挖掘有效因子的能力。加入交叉验证之后,遗传规划的流程如下:将数据集按指定比例划分为训练集和验证集两部分,训练集用于训练和进化,循环生成子代因子;对于每一代新生成的因子,模型都会在验证集上计算适应度,并记录每一代的验证集平均适应度,观测验证集平均适应度的收敛性,当其明显收敛时,停止循环。在本文的测试中,确实观察到了因子平均适应度在验证集收敛的情况。

风险提示:通过遗传规划挖掘的选股因子是历史经验的总结,存在失效的可能。遗传规划所得因子可能过于复杂,可解释性较低,使用需谨慎。本文仅对因子在全部A股内的选股效果进行测试,测试结果不能直接推广到其它股票池内。

遗传规划回顾和改进方向

在本系列前期报告《基于遗传规划的选股因子挖掘》(2019.6)中,我们介绍了遗传规划的基本原理,如图表1所示,遗传规划从随机生成的公式群体开始,通过模拟自然界中遗传进化的过程,来逐渐生成契合特定目标的公式群体。然后我们对遗传规划程序包gplearn进行深度改进,实现了遗传规划在因子挖掘上的应用。本篇报告将在上一篇报告的基础上,从适应度指标的选择、非线性因子的使用方法和控制过拟合的手段这三个不同的角度探索模型的改进方向。

改进方向1:新的适应度指标

在遗传规划中,适应度衡量了公式运算结果与给定目标的相符程度,是公式进化的重要参考指标。本系列前期报告《基于遗传规划的选股因子挖掘》(2019.6)中使用RankIC来作为因子的适应度指标,它是传统多因子选股模型中对因子的评价指标之一,主要衡量因子和收益间的线性关系。在本篇报告中,我们在gplearn中加入了两个新的适应度指标——互信息和多头超额收益,并测试它们的因子挖掘效果。

互信息

在基于机器学习的多因子选股模型中,非线性因子也能被有效使用,此时就需要一个能衡量因子和收益间非线性关系的适应度指标。在本系列报告中的《人工智能选股之特征选择》(2018.7)介绍过互信息指标,在此我们将再次介绍该指标的原理。互信息的概念来自概率论和信息论,常用于度量两个随机变量之间的关联程度。不同于相关系数仅能够捕捉两个随机变量之间的线性相关性,互信息方法可以捕捉两个变量之间的任何统计依赖性。两个离散随机变量X和Y的互信息定义为:

image

其中,p(x, y)是X和Y的联合概率分布函数,p(x)和p(y)分别是X和Y的边缘概率分布函数。在连续随机变量的情形下,求和替换为二重定积分:

其中,p(x, y)是X和Y的联合概率密度函数,p(x)和p(y)分别是X和Y的边缘概率密度函数。

直观上,互信息反映了联合分布p(x, y)与边缘分布乘积p(x)p(y)的相似程度,它能够度量X和Y共享的信息,量化了已知两个变量其中一个时,另一个变量不确定性的减少程度。例如,如果X和Y相互独立,则已知X不会对Y提供任何信息,那么p(x, y) = p(x)p(y),两者的互信息为零。在使用互信息进行特征选择时,特征与标签之间的互信息越大,两者之间共享的信息越多,那么两者的关联度越高。

下面的例子来自sklearn官网,形象地说明了互信息的效果。例如有三个特征X1,X2,X3,它们服从区间[0,1]内的均匀分布,定义y如下:

image

其中为标准正态分布。我们可以使用F检验和互信息来分析y和X1,X2,X3的关系,结果展示在图表2中。可以看出,F检验只能评价变量间的线性关系,y和X1之间的线性关系较高(F-test=1.00),y和X2的线性关系较低(F-test=0.28)。互信息能评价变量之间的任何统计依赖性,y和X2的互信息较高(MI=1.00),y和X1之间的互信息较低(MI=0.36),X3没有出现在y的表达式中,所以y和X3之间没有任何相关性。在遗传规划中使用互信息作为适应度指标,就能够逐渐挖掘出互信息较高的因子。

多头超额收益

RankIC衡量的是因子和收益之间的线性关系,但对于部分投资者来说,可能希望从多头超额收益来评价因子。因此,我们也将多头超额收益加入到适应度指标中,具体计算如下:参照分层回测的做法,同时考虑正向因子和负向因子,跟踪计算分层组合第一层和最后一层的组合净值;在样本期期末计算这两个组合的年化超额收益率,取两者较大值作为多头超额收益。

改进方向2:非线性因子的使用方法

由于互信息可以衡量变量间的非线性关系,所以使用互信息挖掘出来的因子往往是非线性因子,即因子在分层测试中并非头部(或尾部)组合表现最好,而是中间层次的组合表现最好。对于非线性因子的使用,一般有两大类方法,第一类方法是在因子合成时直接使用机器学习模型(如XGBoost、神经网络等)拟合因子与收益率间的关系,该类方法在本系列前期报告中有过大量介绍,此处不再赘述。第二类方法是对单个因子做非线性变换,重构因子与收益之间的关系,最终得到线性因子。第二类方法中有两个具体方法:三次方回归残差法和多项式拟合法,我们将进行详细介绍。

三次方回归残差法

三次方回归残差法方法主要参考了BARRA的报告Characteristics of Factor Portfolios,(Menchero,2010),报告介绍了一种计算非线性规模因子Non-linear Size (NLS)的方法。NLS因子由规模因子和规模因子三次方项的线性组合构造,公式如下:

image

其中,X_n(factor)表示特定截面日期的第n只股票的因子值,NLS表示非线性规模因子,Size表示规模因子,通过求解上面的方程组可以得到非线性规模因子X_n(NLS)的解析解。在实际计算中,用Size^3对Size过原点回归取残差即可得到NLS。这种因子转换的效果如下:

图表3中,横轴表示原始因子Size的暴露度,纵轴表示转换后因子的暴露度,三条曲线分别对应:蓝线-三次方回归残差(NLS),红线-三次方规模因子(Size^3),黑线-原始规模因子。在转换后,NLS的峰值位于原始因子Size的中间部分,而左右两端的取值较低,实现了因子的非线性转换,而且效果与我们的转换目标相似。因此,我们可以套用这种方法来转换互信息高分因子。

多项式拟合法

多项式拟合法是一种适用性更广的转换方法,具体做法是用第T+1期的股票收益对第T期因子的多项式进行回归,用回归拟合得到参数来对因子进行多项式转换。在我们挖掘出的非线性因子中,因子与股票收益的关系曲线单调性最多只出现两次转变,而且曲线不一定是对称的。考虑到因子的这些特征,我们认为把多项式的最高阶定为三次比较合适,回归模型具体表达式如下:

image

在实际计算中,我们采用滚动回归的方式,每隔20个交易日做一次回归拟合,使用历史500天的数据作为回归样本,每次拟合出来的参数用于转换未来20个交易日的因子。

与三次方回归残差法相似,多项式拟合法也是使用因子的高次函数来重构因子,不同的是,前者只使用了因子本身的数据信息,而后者进一步加入了股票收益的信息。在形式上,多项式拟合法还考虑了二次项的影响,提升了转换函数的灵活度。

改进方向3:交叉验证控制过拟合

在本系列报告的《基于遗传规划的选股因子挖掘》中,我们在训练因子和评估算法性能时,使用的是同一个数据集,用已经在训练环节出现过的样本来评估算法性能,容易产生过拟合。为了控制过拟合的风险,我们在gplearn中加入交叉验证环节,观察新因子在验证集上的适应度表现,据此来评价遗传规划挖掘有效因子的能力。

加入交叉验证之后,遗传规划的流程如下:将数据集按指定比例划分为训练集和验证集两部分,训练集用于训练和进化,循环生成子代因子,这一部分与原先的算法基本一致;对于每一代新生成的因子,我们都会在验证集上计算适应度,并记录每一代的验证集平均适应度,观测验证集平均适应度的收敛性,当其明显收敛时,停止循环。

遗传规划选股因子挖掘的测试流程和测试结果

测试流程

测试流程包含下列步骤:

  1. 数据获取和特征提取:

(1) 股票池:全A股,剔除ST、PT股票,剔除每个截面期下一交易日停牌的股票。

(2) 回测区间:2010/1/4~2019/7/31。时间排前80%的截面为训练集,后20%的截面为验证集。

(3) 原始因子列表如图表5所示,都是个股的原始量价信息,未经过特征工程。

(4) 函数列表如图表6所示。

(5) 预测目标:个股20个交易日后的收益率。

  1. 使用遗传规划进行因子挖掘:
  1. 使用图表5中的因子和图表6中的函数集,生成大量公式,并按照图表4的流程进行公式的进化和筛选。

  2. 公式适应度的计算:假设有公式F,得出该公式在截面t上对所有个股的因子向量F_t后,我们会对因子进行以下处理:

    a) 中位数去极值:设F_M为该向量中位数,F_M1为向量|F_t - F_M|的中位数,则将向量F_t中所有大于F_M + 5F_M1的数重设为F_M + 5F_M1,将向量F_t中所有小于F_M - 5F_M1的数重设为F_M - 5F_M1;

    b) 中性化:在每个截面t上,对进行行业、市值、20日收益率、20日换手率、20日波动率中性化,以剔除以上五个因子的影响。

经过以上处理后,计算处理后因子适应度(互信息或多头超额收益)。

  1. 对遗传规划挖掘出的因子进行IC测试、分层测试和相关性分析。

测试结果

在遗传规划的运行过程中,我们可以监控公式群体的一些统计信息来得知当前公式进化的状况。图表7展示了某次测试中的统计信息(适应度为互信息)。可以看出,随着进化代数的增加,训练集和验证集的平均适应度都逐渐上升趋于收敛。实际应用中,可以在验证集平均适应度达到最优后停止算法的运行。

遗传规划所得因子的单因子测试

本章中,我们将分别展示通过互信息和多头超额收益作为适应度指标挖掘出的因子,并进行单因子测试。

分层测试法说明

分层测试法与回归法、IC值分析相比,能够发掘因子对收益预测的非线性规律。也即,若存在一个因子分层测试结果显示,其Top组和Bottom组的绩效长期稳定地差于Middle组,则该因子对收益预测存在稳定的非线性规律,但在回归法和IC值分析过程中很可能被判定为无效因子。分层测试构建方法如下:

  1.  股票池:全A股,剔除ST、PT股票,剔除每个截面期下一交易日停牌的股票。
    
  2.  回测区间:2010/1/4~2019/7/31。
    
  3.  换仓:月频调仓,在每个截面期核算因子值,构建分层组合,在截面期下一个交易日按当日vwap换仓,交易费用默认为单边0.15%。
    
  4.  分层方法:先将因子暴露度向量进行预处理,将股票池内所有个股按处理后的因子值从大到小进行排序,等分N层,每层内部的个股等权重配置。当个股总数目无法被N整除时采用任一种近似方法处理均可,实际上对分层组合的回测结果影响很小。分层测试中的基准组合为股票池内所有股票的等权组合。
    
  5.  多空组合收益计算方法:用Top组每天的收益减去Bottom组每天的收益,得到每日多空收益序列r1, r2, …, rn,则多空组合在第n天的净值等于(1+r1)(1+r2)…(1+rn)。
    
  6.   本文分层测试的结果均不存在“路径依赖”效应,我们以交易日=20天为例说明构建方法:首先,在回测首个交易日K_0构建分层组合并完成建仓,然后分别在交易日K_i,K_(i+20),K_(i+40),⋯按当日收盘信息重新构建分层组合并完成调仓,i取值为1~20内的整数,则我们可以得到20个不同的回测轨道,在这20个回测结果中按不同评价指标(比如年化收益率、信息比率等)可以提取出最优情形、最差情形、平均情形等,以便我们对因子的分层测试结果形成更客观的认知。
    

互信息作为适应度指标挖掘所得因子的测试结果

使用互信息作为适应度指标后,遗传规划挖掘出了多个非线性因子。图表8展示了这些因子的表达式、互信息和RankIC(因子进行了行业、市值、20日收益率、20日波动率、20日换手率中性化),图表9展示了这些因子分层测试中超额收益最高层次的测试结果。

图表10展示了这些因子的相关性,除了个别因子的相关性较高以外,因子之间整体的相关性不高。

接下来,我们详细展示Alpha1~Alpha6的分层测试结果。

Alpha1因子的详细测试结果

Alpha1 = -ts_cov(delay(turn, 3), volume, 7)

Alpha1计算的是delay(turn, 3)和volume在过去7个交易日内的协方差相反数。从分层测试的结果上看,原始因子的最高收益组合出现在第6层,Top层和Bottom层都没有实现正超额收益;经过三次方回归残差法转换后,前6层均实现了正超额收益,后4层的超额收益都为负值,但最高收益组合出现在第4层,即超额收益和层数之间仍不是严格的单调关系;经过多项式拟合法转换后,超额收益和层数之间呈现单调关系,即转换后的因子与收益之间存在较强的线性关系。

Alpha2因子的详细测试结果

Alpha2 = -ts_cov(delay(volume, 5), vwap, 4)

Alpha2计算的是delay(volume, 5)和volume在过去4个交易日内的协方差相反数。从分层测试的结果上看,原始因子的最高收益组合出现在第6层,Top层和Bottom层都没有实现正超额收益;经过三次方回归残差法转换后,前5层均实现了正超额收益,后5层的超额收益都为负值,但最高收益组合出现在第4层,即超额收益和层数之间仍不是严格的单调关系;经过多项式拟合法转换后,超额收益和层数之间呈现单调关系,即转换后的因子与收益之间存在较强的线性关系。

Alpha3因子的详细测试结果

Alpha3 = -ts_cov(ts_cov(delay(low, 3), turn, 7), turn, 7)

Alpha3是先计算delay(low, 5)和turn在过去7个交易日内的协方差,然后再计算这个协方差与turn在过去7个交易日内的协方差,最后取相反数作为因子值。从分层测试的结果上看,原始因子的最高收益组合出现在第3层,前2层的超额收益为负值,后7层的超额收益呈现出明显的递减趋势;经过三次方回归残差法转换后,前5层均实现了正超额收益,后5层的超额收益都为负值,除了第2层,其它层的超额收益和层数之间呈现出明显单调关系;经过多项式拟合法转换后,超额收益和层数之间也呈现单调关系。

Alpha4因子的详细测试结果

Alpha4 = -ts_cov(ts_cov(sub(vwap, close), high, 5), turn, 7)

Alpha4是先计算sub(vwap, close)和high在过去5个交易日内的协方差,然后再计算这个协方差与turn在过去7个交易日内的协方差,最后取相反数作为因子值。从分层测试的结果上看,原始因子的最高收益组合出现在第7层, Top层和Bottom层都没有实现正超额收益;经过三次方回归残差法转换后,第1层至第5层均实现了正超额收益,其他层的超额收益都为负值,超额收益和层数之间仍不是严格的单调关系;经过多项式拟合法转换后,除了第9层,其他层的超额收益和层数之间呈现单调关系,即转换后的因子与收益之间存在较强的线性关系。

Alpha5因子的详细测试结果

Alpha5 = -mul(ts_sum(vwap, 5), ts_cov(volume, vwap, 3))

Alpha5是先对过去5个交易日的vwap求和,然后计算volume和vwap在过去3个交易日内的协方差,最后对这两个数的乘积取相反数。从分层测试的结果上看,原始因子的最高收益组合出现在第5层, Top层和Bottom层都没有实现正超额收益;经过三次方回归残差法转换后,前5层均实现了正超额收益,后5层的超额收益都为负值,前6层的超额收益和层数之间呈现出严格的单调关系;经过多项式拟合法转换后,超额收益和层数之间呈现单调关系(除了第10层),即转换后的因子与收益之间存在较强的线性关系。

Alpha6因子的详细测试结果

Alpha6 = -ts_cov(ts_max(turn, 7), free_turn, 9)

Alpha6是计算ts_max(turn, 7)和free_turn在过去9个交易日内的协方差。从分层测试的结果上看,原始因子的最高收益组合出现在第2层,Top层和Bottom层都没有实现正超额收益;经过三次方回归残差法转换后,前4层均实现了正超额收益,后6层的超额收益都为负值,前7层的超额收益和层数之间呈现单调关系;经过多项式拟合法转换后,前4层均实现了正超额收益,后6层的超额收益都为负值,但超额收益和层数之间不是严格的单调关系。

小结

在Alpha1~ Alpha6的分层测试中,可以看出这些因子大致都具有“中间分层收益高,两端分层收益低”的特性。在使用三次方回归残差法和多项式拟合法对非线性因子进行转换时,两个方法各有优劣,三次方回归残差法简单通用,但转换效果较差;多项式拟合法转换效果较好,但需要逐个对因子拟合非线性关系,拟合结果对不同因子不能通用。

多头超额收益作为适应度指标挖掘所得因子的测试结果

使用多头超额收益作为适应度指标后,遗传规划挖掘出了数个因子。图表47展示了这些因子的表达式、多头年化超额收益率和RankIC(因子进行了行业、市值、20日收益率、20日波动率、20日换手率中性化)。

图表48展示了Alpha21~Alpha24因子的相关性。由于小市值股票和低成交量股票流动性较差,我们还展示了这些因子和市值因子以及成交量因子的相关性。

接下来,我们将展示Alpha21~Alpha24的详细分层测试结果。

Alpha21因子的详细测试结果

Alpha21 = -sigmoid(rank(ts_cov(turn, close, 10)))

Alpha21是先计算turn和close在过去10个交易日内的协方差,然后对这个协方差依次用rank和sigmoid两个变换函数进行调整并取相反数。

Alpha22因子的详细测试结果

Alpha22 = -rank_div(open, volume)

Alpha22计算的是rank(open)除以rank(volume)所得商的相反数。

Alpha23因子的详细测试结果

Alpha23 = -sigmoid(rank_div(mul(volume, high), rank(high)))

Alpha23是先用rank(mul(volume,high)除以rank(rank(high),然后用sigmoid函数对所得商进行变换。

Alpha24因子的详细测试结果

Alpha24 = sigmoid(ts_prod(rank_div(vwap, free_turn), 3))

Alpha24的核心成分是rank(vwap)除以rank(free_turn)得到的商,再计算这一商在过去3个交易日的连乘乘积,最后使用sigmoid函数对这一乘积进行变换。

结论

本文是对华泰金工前期报告《基于遗传规划的选股因子挖掘》的补充和改进,目的是进一步提升遗传规划挖掘选股因子的能力。本文提出并测试了3个改进方向,结论如下:

改进方向1:新的适应度指标——因子互信息和多头超额收益。互信息可以捕捉因子和收益间的非线性关系,在遗传规划中使用互信息作为适应度指标,可以挖掘出多个互信息较高的因子。在分层测试中,该类因子与收益的关系大多呈现出“中间分层收益高,两端分层收益低”的特性,且分层规律稳定,这种规律能被基于机器学习的多因子选股模型有效利用。另外,部分投资者可能希望从多头超额收益来评价因子,本文也将多头超额收益加入到适应度指标中,挖掘出了数个多头超额收益较高的因子。

改进方向2:非线性因子的使用方法。对于非线性因子的使用,一般有两大类方法,第一类方法是在因子合成时直接使用机器学习模型(如XGBoost、神经网络等)拟合因子与收益率间的关系。第二类方法是对单个因子做非线性变换,重构因子与收益之间的关系,最终得到线性因子。第二类方法中有两个具体方法:三次方回归残差法和多项式拟合法。两个方法各有优劣,在本文的测试中,三次方回归残差法比较简单,但转换效果较差;多项式拟合法转换效果较好,但需要逐个对因子拟合非线性关系,拟合结果对不同因子不能通用。

改进方向3:交叉验证控制过拟合。为了控制过拟合的风险,我们在gplearn中加入交叉验证环节,观察新因子在验证集上的适应度表现,据此来评价遗传规划挖掘有效因子的能力。加入交叉验证之后,遗传规划的流程如下:将数据集按指定比例划分为训练集和验证集两部分,训练集用于训练和进化,循环生成子代因子;对于每一代新生成的因子,模型都会在验证集上计算适应度,并记录每一代的验证集平均适应度,观测验证集平均适应度的收敛性,当其明显收敛时,停止循环。在本文的测试中,确实观察到了因子平均适应度在验证集收敛的情况。

本文在测试中展示了20多个挖掘出的选股因子供投资者参考。通过方法论的介绍,本文旨在说明遗传规划或许能挖掘出大量的因子(尤其是非线性因子),这对于能够利用非线性因子的机器学习选股模型来说具有重要意义。

风险提示

通过遗传规划挖掘的选股因子是历史经验的总结,若市场规律改变,存在失效的可能。遗传规划所得因子可能过于复杂,可解释性较低,大多数不是线性因子,使用需谨慎。本文仅对因子在全部A股内的选股效果进行测试,测试结果不能直接推广到其它股票池内。

作者:华泰证券金工林晓明团队