金融工程 证券研究报告 专题报告2023年09月28日 【专题报告】 基于价量数据的排序学习选股模型 华创证券研究所 证券分析师:杨宸祎邮箱:yangchenyi@hcyjs.com执业编号:S0360523080003 相关研究报告 《量化选股系列——机构情绪与个人情绪》 2023-09-05 《技术指标研究之一:重新认识技术指标》 2023-08-21 《形态学研究之八:如何利用形态信号进行行业择时》 2023-08-07 《K线形态研究之七:停顿线》 2023-07-31 《K线形态研究之六:乌云压顶线》 2023-07-31 排序学习的定义 排序学习(LearningtoRank,LTR)又名“机器排序学习”(Machine-learnedRanking)是一种监督学习方法,此机器学习算法通过在数据集上对大量特征进行训练,从而学习生成排序模型,以用于解决实际中的排序问题。排序学习 在文档检索、过滤和推荐系统等领域,已得到广泛应用。 LTR算法演变 本文逐步介绍排序学习具体的算法演变,其中包括了,基于配对文档相对排序的概率损失函数,用数据对来训练模型的pairwise排序学习方法RankNet、对RankNet的配对思想进行了扩展,将RankNet中损失函数相对得分函数的梯度定义为lambda,与整体排序的评分标准(如NDCG)进行结合的LambdaRank、以及我们模型中所用到的在LambdaRank的基础上将Mart与现有模型相结合的LambdaMart算法。 模型设计 在构建股票池的时候,选择了沪深300、中证500、中证1000的历史成份股分别作为A股市场大盘股、中盘股、小盘股的代表构建了1800只股票的备选股票池,取数时间范围为2014年11月至2023年8月底。选股策略选取了价量数据作为模型特征的主要组成部分,其中包括了每日个股上大单、中单、小单的流入流出数据,并在此基础上添加了一致预期数据。在进行数据处理之后,我们对以上数据使用了不同的算子进行特征工程。 LGBMRanker选股轮动模型回测结果 本文通过使用LGBMRanker对沪深300、中证500、中证1000的成份股进行排序学习,构建出基于价量数据的选股模型,经回测该策略从2015年11月至 2023年8月底的累计绝对收益率为167.31%,相较于等权基准,累计超额收益率为160.16%,年化收益率为13.28%,超额年化为12.40%,夏普比率为0.48最大回撤为34.58%。从回测结果来看,策略相较于等权基准的年胜率为88.89%,月胜率为65.96%,相较于沪深300的年胜率为77.78%,月胜率为 58.51%,相较于中证500的年胜率为100%,月胜率为67.02%,相较于中证 1000的年胜率为100%,月胜率为76.60%。策略2023年年初至8月底的绝对收益率为18.10%,相较于等权基准,超额收益率为13.14%,表现出色。 风险提示: 本报告中所有统计结果和模型方法均基于历史数据,不代表未来趋势。 投资主题 报告亮点 本篇报告作为排序学习系列研究的第二篇报告,首先简单回顾了排序学习的理论基础与算法逻辑,然后深入地介绍了排序学习几种算法的演变并做了简单的推导,最后使用LGBMRanker在目标股票池内上构建出基于排序学习的选股模型,表现出色。 投资逻辑 排序学习将个股的价量特征作为参数输入,将其转化为当期对个股未来走势的相对优劣排序。根据历史数据回测,通过持仓排名较前的个股,可以取得一定的相较于等权基准的超额收益。 目录 一、什么是排序学习?5 (一)排序学习的背景5 (二)排序学习的特殊之处5 二、排序学习算法演变5 (一)RankNet介绍5 1、概率损失函数6 (二)LambdaRank介绍6 1、对RankNet算法的加速6 2、梯度函数λ的选取8 (三)LambdaMart介绍8 1、对Mart的介绍8 2、LambdaMart公式推导9 3、LambdaMart算法流程10 三、排序学习选股模型10 (一)LGBMRanker简介10 (二)选股模型设计11 1、股票池11 2、特征选择11 3、标签选择13 4、训练方法13 5、回测结果13 四、总结19 �、风险提示20 图表目录 图表1特征表12 图表2训练方法13 图表3LGBMRanker选股策略净值图14 图表4LGBMRanker选股策略对比指数净值图14 图表5策略表现15 图表6胜率表现15 图表7分年度收益率统计15 图表8今年以来月度收益率统计16 图表9行业分布占比(%)16 图表10市值分布占比(%)17 图表11最新信号17 图表12LGBMRanker选股策略9月份走势(截至20230919)19 一、什么是排序学习? (一)排序学习的背景 随着数字时代的来临,社会信息化程度的不断加深,互联网上承载的信息量呈指数级增长。想要在海量的数据中检索到自己需要的信息或者想要提高用户的需求与信息之间的匹配程度,就会涉及到排序问题。排序问题,简单来说就是如何从信息膨胀下的数据洪流中便捷地检索出用户最感兴趣的结果,重要性不言而喻,同时也引起了学术界和工业界的广泛关注与研究。与此相关的推荐系统在过去十几年的时间里取得了长足的发展并普遍运用于搜索、推荐、广告等各个领域。而处理排序问题的方法不同也会产生不同的推荐系统,同样的关键词,一个搜索引擎可以让用户在搜索结果的前几页就快速找到想要的信息,而另外一个搜索引擎则无法做到,或者经常浏览的两个软件,一个总能推送出用户最新最感兴趣的内容,而另一个只能生硬的根据用户所选的标签静态的匹配内容,这些显著的差异就是因为其核心的推荐算法不同。 “排序学习”(LearningtoRank,LTR)又名“机器排序学习”(Machine-learnedRanking),顾名思义是使用机器学习用于解决分类与回归问题的方法,来解决排序问题。通过机器学习算法在数据集上对大量的特征进行训练,构建出排序模型,让其能够依据数据的相关性、重要性等衡量指标对数据进行排序,从而满足用户的需求。 (二)排序学习的特殊之处 相比于传统的分类和回归模型,排序学习有着一些显著的不同之处。首先,排序学习关注的是多个对象之间的相对排序关系,而不是单个对象的分类或回归问题。其次,由于排序学习需要处理多个对象的排序信息,所以排序学习模型通常更加复杂,需要考虑对象之间的交互信息和排序关系。 其他机器学习方法通过对一系列数据进行训练,并不断优化迭代从而得到一个预测模型,再把验证数据一个一个放到预测模型中,生成其对应的预测值再加以利用,最终目的是要降低预测值与真实值之间的差异来达到精确预测。而排序学习训练集是以(q,D)的形式输入模型,其中q为query查询,对于每一个查询queryq,我们由n个文档D= [d1,d2,…,dn],n>=1,以此作为模型的参数并让模型对其进行排序,然后根据真实排序与预测排序衡量排序效果,再以提升排序效果为目的不断优化迭代。 由此可以看出,排序学习中使用的评估指标也不同于传统的分类和回归任务。对于排序学习而言,传统分类和回归任务中使用的评估指标如准确率、均方误差等都不再适用,而常用的排序学习评估指标包括NormalizedDiscountedCumulativeGain(NDCG),则用于度量模型在对象排序上的性能。 二、排序学习算法演变 (一)RankNet介绍 RankNet是一种pairwise的排序学习方法,基于配对文档相对排序的概率损失,用成对的数据训练神经网络。 1、概率损失函数 假设𝑑�和𝑑�是查询𝑞�下的两个文档,𝑑�和𝑑�的特征向量分别是𝑥�和𝑥𝑗,有𝑠�=𝑓(𝑥𝑖),𝑠�= 𝑓(𝑥𝑗),𝑠𝑖�=𝑠�−𝑠𝑗,其中�是得分函数,分数越高,可推断文档的排名越靠前。𝑑�⊳𝑑�表示第i个文档排在第j个文档的前面,𝑑�⊳𝑑�的预测概率为: 1 𝑃𝑖�=𝑃(𝑑�⊳𝑑𝑗)=1+𝑒−𝑠𝑖� 这是一个logistic形式的概率函数,取值在[0,1]之间,随𝑠𝑖�的取值单调递增,当𝑠𝑖�=0时, �=1,即�和�排序得分相同时,�排在�前的概率为1/2,两个文档之间的排序没法 𝑖�2 �� �� 通过现有的信息区分开来。定义𝑑�⊳𝑑�的理想目标值为: ̅𝑃̅𝑖̅�=𝑃̅(𝑑�⊳𝑑𝑗) 如果要求存在理想的输出结果̅𝑠̅𝑖̅�使得目标概率 ̅𝑃̅̅=1 𝑖� 1+𝑒−̅𝑠̅𝑖̅̅� 根据𝑠̅̅𝑖̅�的定义,当我们知道一组相邻的𝑠̅̅𝑖̅,𝑖̅+̅1̅的结果(j<i<k-1),可计算𝑠̅̅𝑦̅𝑘̅: � ̅𝑠̅𝑦̅𝑘̅=𝑠̅�−𝑠̅�=𝑠̅�−𝑠̅̅𝑦̅+̅1̅+̅𝑠̅𝑦̅+̅1̅−𝑠̅̅𝑦̅+̅2̅+⋯+̅𝑠̅𝑘̅̅−̅1̅−𝑠̅�=∑̅𝑠̅𝑖̅,𝑖̅+̅1̅ 𝑖=� 因此,可以考虑将文档按任意顺序排列后,计算所有相邻成对文档的相对排序得分,从而可以推出任意两个文档𝑑�和𝑑�之间的相对排序得分𝑠𝑗𝑘,进而方便地求得任意两个文档 𝑑�⊳𝑑�的概率𝑃𝑗�。经证明,指定任意一组相邻概率,可唯一识别出𝑃𝑗�。有了上面的结论,可以大大简化RankNet的计算量,最少只计算相邻数据即可。 损失函数形式如下: 𝐶𝑖�=−̅𝑃̅𝑖̅𝑦𝑙𝑜𝑔𝑃𝑖�−(1−̅𝑃̅𝑖̅𝑦)log(1−𝑃𝑖�)=−̅𝑃̅𝑖̅𝑦𝑠𝑖�+log(1+𝑒𝑠𝑖�) 𝐶𝑖�是交叉熵损失函数,衡量了目标概率̅𝑃̅𝑖̅�与预测概率𝑃𝑖�的接近程度。 (二)LambdaRank介绍 LambdaRank基于RankNet的配对思想进行了扩展,将RankNet中损失函数相对得分函数的梯度定义为lambda,与整体排序的评分标准(如NDCG)进行结合,实现了近似优化整体评分标准(如NDCG)。 1、对RankNet算法的加速 文档𝑑�和𝑑�在某查询下的标签分别𝑙�和𝑙𝑗,定义𝑙�>𝑙�表示𝑑�排在𝑑�前,则对应的̅𝑃̅𝑖̅�如下: ̅̅̅ 1𝑙�>𝑙� 𝑖� �=[ 0𝑙�<𝑙� RankNet中的损失函数可以重新写为: −𝑠𝑖�+log(1+𝑒𝑠𝑖�)𝑃̅̅𝑖̅�=1 𝐶𝑖�=[log(1+𝑒𝑠𝑖�) ̅𝑃̅𝑖̅�=0 总的损失函数等于所有配对(𝑑𝑖,𝑑𝑗)对应𝐶𝑖�的和。注意到,如果𝑑�排在𝑑�前,配对(𝑑𝑖,𝑑𝑗) 和(𝑑𝑗,𝑑𝑖)对应的损失𝐶𝑖�和𝐶𝑗�是相等的,此时 1+𝑒𝑠𝑗� 𝐶𝑗�=log(1+𝑒𝑠𝑗�)=log 𝑒𝑠𝑗� 𝑒𝑠𝑗�=log(1+𝑒−𝑠𝑗�)+𝑠𝑗� =−𝑠𝑖�+log(1+𝑒𝑠𝑖�)=𝐶𝑖� 因此,为方便起见,可以将所有配对重新写为(𝑑𝑖,𝑑𝑗)的形式使得[𝑖,𝑗]∈𝐼,其中�包含了所有𝑑�排在𝑑�前的配对,总的损失为: 𝐶�=∑𝐶𝑖� [𝑖,𝑗]∈� 在训练过程中,使用损失相对权重的梯度进行更新,结合链式法则,得到: 𝜕𝐶� 𝜕𝑤� =∑ [𝑖,𝑗]∈� 𝜕𝐶𝑖� 𝜕𝑤� =∑[ [𝑖,𝑗]∈� 𝜕𝐶𝑖�𝜕𝑠� 𝜕𝑠�𝜕𝑤� 𝜕𝐶𝑖�𝜕𝑠� +] 𝜕𝑠�𝜕𝑤� 计算损失函数相对得分函数的偏导,并令其等于𝜆𝑖� 𝜕𝐶𝑖� 𝜕𝑠� 𝑒𝑠𝑖�−1 𝑖� =−1+==� 1+𝑒𝑠𝑖�1+𝑒𝑠𝑖� � 𝜕𝐶𝑖� −𝑒𝑠𝑖�1 𝜕𝐶𝑖� 𝜕𝑠� =1+1+𝑒𝑠𝑖�=1+𝑒𝑠𝑖�=−𝜕� =−𝜆𝑖� 可以发现,损失