(python的调仓函数)(python的调仓函数)

(python集合常用方法)(python 集合 函数)

摘要

Bootstrap是可行的构建“平行A股市场”的重采样方法

Bootstrap是一种可行的构建“平行A股市场”的重采样方法,能够模拟机器学习不同环节的随机性,从而检验在真实A股市场中得出的研究结论是否为过拟合。我们分别对样本内数据、样本外数据和回测时间进行Bootstrap重采样,发现在“平行A股市场”中分组时序交叉验证方法的模型性能和单因子回测指标均优于其它两种方法,统计检验结果显著。真实世界的研究结论能够在平行世界中复现,表明该结论为过拟合的可能性较低。我们借助“偶然”的工具,探寻出“必然”的规律。

Bootstrap重采样的核心思想是有放回地抽样

Bootstrap是一种统计学上的重采样方法,又称自举法,主要用于研究统计量的统计特性。该方法的核心思想是有放回地抽样。对原始数据集进行有放回地抽样,得到N组Bootstrap数据集。每组Bootstrap数据集中,有的样本可能被重复抽到,有的样本没有被抽到。计算每一组Bootstrap数据集的统计量,将得到N组Bootstrap数据集的该统计量的分布,进而得到该统计量的统计量。

Bootstrap重采样方法对机器学习量化研究体系的构建具有指导意义

Bootstrap重采样对机器学习量化研究体系的构建具有指导意义。机器学习量化策略开发和传统量化策略开发的重要区别在于,机器学习研究的复杂度、其所涉及的环节、超参数和参数数量远超传统量化研究,任何环节随机性的引入,对最终整个系统都可能造成类似蝴蝶效应式的影响。本文采用Bootstrap模拟不同环节的随机性,系统性地评估随机性对机器学习结果的影响方向和影响程度。

机器学习不同环节随机性对模型表现的影响各异

三种Bootstrap重采样方案对同一组交叉验证方法的影响方向和程度有区别。Bootstrap样本内数据集相当于向训练集因子值添加小幅的扰动,可能小幅削弱模型表现;Bootstrap样本外数据集相当于向测试集因子值添加小幅的扰动,可能部分增强或削弱模型表现;Bootstrap回测时间即改变模型的回测时间段,可能大幅增强或削弱模型表现。上述结果对研究者的启示是在开发过程中需要密切关注训练数据的质量,同时应避免因回测时间选择不当而造成的误判。

Bootstrap提供刻画随机性的思路,使研究者能基于指标分布进行决策

在以往的量化模型开发过程中,通常将历史回测表现视作确定性的结果,而忽略随机性对回测结果的影响。在面临不同量化策略的取舍之时,往往只是简单基于策略的年化收益率、夏普比率、收益回撤比等评价指标。Bootstrap重采样方法提供了一种刻画随机性的思路,使研究者能够基于评价指标的统计分布、而非单个统计量,对模型优劣做出相对客观的判断和决策。本文从方法论的角度,对结合机器学习的多因子选股框架进行反思,针对模型比较环节和模型评价环节提出创新式的改造,希望对本领域的投资者有所启发。

风险提示:人工智能选股方法是对历史投资规律的挖掘,若未来市场投资环境发生变化,该方法存在失效的可能。机器学习选股模型随机性的来源多样,本研究只考虑有限的三种情况,存在忽略其它更重要随机性来源的可能。Bootstrap重采样方法是对随机性的简单模拟,存在过度简化的可能。

本文研究导读

世界上几乎唯一可以确定的事情是不确定性。在自然科学领域,小到微观世界里粒子的高速运动,大到宏观世界里生物的漫长演化,无不受随机性这双看不见的手的摆布。在社会科学领域,无数遵从随机性的个体经由随机的连接和交互,构成一张复杂的巨型网络,派生出种种纷繁多彩的社会现象。一代代人类穷尽心智,透过随机性的迷雾试图认识和理解世间万象。

现代科学经过数百年的发展,已被公认为理解世界最有力的武器之一。科学的本质特征是可证伪性。“所有天鹅是白色的”这一命题本身是错误的,但是其命题的表述是科学的,原因在于该命题可以通过“找出一只黑天鹅”加以证伪。然而,由于随机性的存在,大部分科学命题并不能简单通过找反例的方式证伪。例如想证伪“吸烟者寿命更长”并不容易,吸烟对健康的影响机制过于复杂,该命题仅仅是一个模糊的、概率上的表述。单纯找出一个寿命较短的烟民并没有多大的说服力,人们需要借助统计学的工具,透过“偶然”的外衣一窥“必然”的真相。

研究随机性的统计学是现代科学的基石之一。统计学是如何解决上述问题的呢?首先定义“吸烟者寿命更长”为虚无假设,“吸烟者寿命不会更长”为备择假设。其次对烟民和非烟民进行随机抽样,样本量尽可能大,并且尽量控制其它影响寿命的因素。进而对两类人群的寿命分布进行定性比较和定量统计检验,计算虚无假设成立的概率(p值)。最终在一定显著性水平下拒绝或接受虚无假设,作出相应推断。以上例子只是相对简化的表述,实际上可以通过更精巧的设计、更复杂的统计模型作出更准确的论断。但无论其模型多么繁复,本质仍是基于大量样本结合统计模型,以推断虚无假设成立的概率。尽管p值的使用近年来在学术界备受质疑,上述比较随机变量分布并进行统计检验的思路仍是目前人们从偶然中发现必然的几乎是最有力的工具。

令人稍感意外的是,在量化投资领域,研究者在优质量化策略的求索之路上,却似乎遗忘了随机性的存在,将历史回测表现视作确定性的结果。在面临不同量化策略的取舍之时,往往只是简单基于策略的年化收益率、夏普比率、收益回撤比等评价指标。例如策略A的夏普比率比策略B更高,我们便舍弃策略B,选择策略A。然而,金融市场是一个开放复杂的巨系统,只需要随机性的手稍加摆弄(例如样本内、外数据集的轻微改变),回测结果就可能大相径庭。我们所有的观测以及得到的结论,都是基于确定性的历史,都是针对我们所生活的真实世界。如果这些结论在与真实世界相仿的“平行世界”里不成立,那么我们就有理由认为,这些结论只是针对真实世界的过拟合。

更值得忧虑的是,上述问题在人工智能量化研究领域都会被放大。机器学习量化策略开发和传统量化策略开发的重要区别在于,机器学习研究的复杂度、其所涉及的环节、超参数和参数数量远超传统量化研究,任何环节随机性的引入,对最终整个系统都可能造成类似蝴蝶效应式的影响。然而不同环节随机性对结果的影响程度,尚没有被系统性的研究过。例如,我们观测到的一切选股因子值都是信号和噪音的叠加。如果训练集因子发生微小扰动,是否会大幅影响机器学习模型的训练结果?如果测试集因子发生微小扰动,是否会大幅影响机器学习策略的回测表现?如果上述问题的回答均为“是”,那么我们同样有理由认为,机器学习模型存在较大的过拟合风险。

能否创造出和真实世界相仿的平行世界?能否将真实世界中的结论放在平行世界中加以验证?能否借鉴统计检验的思路,测量基于真实世界开发的量化策略出现过拟合的概率?作为针对上述问题的初次探索,本文采用基础的重采样方法——Bootstrap,对多因子选股的月度截面数据进行重采样,创造出和真实A股市场相仿的若干组“平行A股市场”,并且以华泰金工《人工智能16:再论时序交叉验证对抗过拟合》中的三组机器学习策略为考察对象,利用定性比较和定量统计检验方法考察各策略在平行A股市场中的表现,最终评估该研究得到的最优策略为过拟合的可能性。本文从方法论的角度,对结合机器学习的多因子选股框架进行反思,针对模型比较和模型评价环节提出创新式的改造,希望对本领域的投资者有所启发。

采用Bootstrap重采样构建“平行世界”

问题的提出:回测过拟合的困境

量化策略开发的过程中,对多组策略进行取舍时,大多依据回测阶段的业绩表现。例如策略A的夏普比率为2,策略B的夏普比率为1.5,策略C的夏普比率为1,那么我们一般认为策略A优于策略B、C。然而,回测阶段的良好表现可能源于一些偶然因素,并非意味着该策略正确捕捉到了市场中的规律,回测阶段的最优策略在实盘阶段可能表现平平,如下图所示,我们将这种现象称为回测过拟合。

(python的调仓函数)(python的调仓函数)

回测表现的差距究竟源于真实效果上的差异,还是源于一些偶然因素,我们很难做确切地归因。非不为也,实不能也。真实金融市场不存在“平行世界”,无法通过多次测量进行统计检验的方式,确认研究结论的真实性。

Bootstrap方法为我们提供了一个窗口,能够基于单个真实金融市场数据,模拟出众多金融市场数据的“平行世界”。假设模拟出10000组A股数据集,那么我们可以得到10000组A、B、C三组策略的夏普比率,基于三者的分布进行统计检验,进而推断“策略A优于策略B、C”的研究结论究竟是由于模型正确捕捉到了市场中的规律,还是由于模型陷入了回测过拟合。

Bootstrap重采样方法

Bootstrap是一种统计学上的重采样方法,又称自举法,主要用于研究统计量的统计特性,从而检验统计结果的稳定性。其基本思想如下图所示。原始数据集的统计量(如均值)等能够很方便地得到,那么如何计算该统计量的统计量呢(如均值的标准差)?Bootstrap方法的核心思想是有放回地抽样。对原始数据集进行有放回地抽样,得到N组Bootstrap数据集,N通常需要大于1000。计算每一组Bootstrap数据集的统计量(如均值),将得到N组Bootstrap数据集的该统计量的分布,进而得到该统计量的统计量(如标准差)。

(python的调仓函数)(python的调仓函数)

下面以具体例子说明。我们希望研究2019年4月1日A股非停牌个股的平均涨跌幅,数据集D为2019年4月1日A股3569只非停牌个股的涨跌幅,求均值得到x_p=3.6132%,那么均值的均值和标准差应该如何计算?

(python的调仓函数)(python的调仓函数)

首先对数据集进行有放回地抽样,从数据集中随机抽取一个样本,然后放回,再抽取一个样本,再放回,……,如此重复3569次,得到了一个包含3569只股票的新数据集D1。注意到原始数据集D中有的股票可能被重复抽到,有的股票可能没有被抽到。我们将新数据集D1称为一组Bootstrap数据集,求均值得到x_D1 。重复上述步骤,我们可以得到N组Bootstrap数据集D2,D3,……,DN,以及每组数据集的均值。假设重采样次数,可以求出这10000个平均涨跌幅的均值:

(python的调仓函数)(python的调仓函数)

标准差:

(python的调仓函数)(python的调仓函数)

借助Bootstrap方法,我们从一个原始数据集衍生出了N个新的Bootstrap数据集。

有的读者可能提出质疑:对原始数据集进行Bootstrap重采样后,得到的Bootstrap数据集中有的股票可能被反复抽到,有的股票没有被抽到,针对这样的“假数据集”计算均值有何意义?实际上,单个Bootstrap数据集的统计量确实没有多大意义,然而众多Bootstrap数据集统计量构成的分布提供了有效的增量信息。以一个通俗的例子说明,一颗沙粒可能无足轻重,我们更关心聚沙成塔后那座塔的特性。

Bootstrap和机器学习的关系

作为一种统计学方法,Bootstrap和机器学习有何关系?我们试从两个层面回答。

首先,从“术”的层面,Bootstrap对机器学习算法能起到优化作用。Bootstrap广泛应用于弱学习器的集成,这种集成方法也称为Bagging。随机森林是经典的基于Bagging思想的集成学习模型之一,将大量决策树通过并行的方式集成。在训练每一棵决策树时,首先对原始数据集进行行采样和列采样,列采样即每一步分裂时仅从随机抽取的一部分特征中做出选择,行采样即对原始样本进行有放回地抽样,从而得到一个与原始数据集样本量相同的Bootstrap数据集。最后将大量决策树通过少数服从多数的原则集成起来,实现随机森林的预测。这里每一棵树的训练只是基于不完整的Bootstrap数据集,学习能力相对较弱,其判断可能无足轻重,但是众木成林后,随机森林拥有更强的学习泛化能力。

其次,从“道”的层面,Bootstrap对机器学习量化研究体系的构建具有指导意义。机器学习量化策略开发和传统量化策略开发的重要区别在于,机器学习研究的复杂度、其所涉及的环节、超参数和参数数量远超传统量化研究,任何环节随机性的引入,对最终整个系统都可能造成类似蝴蝶效应式的影响。然而不同环节随机性对结果的影响程度,尚没有被系统性的研究过。例如,我们观测到的一切选股因子值都是信号和噪音的叠加。如果训练集因子发生微小扰动,是否会大幅影响机器学习模型的训练结果?如果测试集因子发生微小扰动,是否会大幅影响机器学习策略的回测表现?我们需要借助工具评估不同环节随机性对结果的影响。本文将采用Bootstrap方法模拟这些随机性,构建一系列“平行A股市场”,考察机器学习量化模型在这些平行世界中的表现,对不同策略进行比较和取舍,检验策略是否陷入回测过拟合。下面章节我们将详细介绍构建平行A股市场的方法。

构建“平行A股市场”

机器学习选股模型随机性的来源较为多样,我们试列举三种可能的来源,如下图所示。

1. 我们观测到的选股因子值是信号和噪音的叠加。假设个股的因子值是服从某个特定分布的随机变量,真实世界里的观测值是该随机变量的采样,那么在另一些“平行A股市场”中,无论是样本内还是样本外数据集,相同个股的相同因子都可能取不同的值。样本内数据集因子值的随机噪音可能对模型训练环节造成影响。我们不希望因子的随机扰动使得训练得到的机器学习模型发生大幅改变。

2. 和第1点类似,样本外数据集因子值的随机噪音可能对模型回测环节造成影响。我们不希望因子的随机扰动使得机器学习策略的回测表现发生大幅改变。

3. 模型的回测表现和回测时间的选择密切相关。回测区间是牛市还是熊市占主导,是小市值风格还是从价值风格占主导,表现都会大相径庭。我们希望策略能够穿越不同市场环境,不希望回测时间的选择对结果造成大幅影响。

(python的调仓函数)(python的调仓函数)

针对以上三种随机性的来源,我们尝试下列三种Bootstrap重采样构建“平行A股市场”的方案。

(python怎么打开使用)(python怎么打开函数)

1. 针对样本内数据集的随机性,我们对样本内数据集进行Bootstrap重采样,具体如下图所示。对于样本内的每个月底截面期,假设全A股票池有效个股数量(非停牌、非次新股、下月初非涨停)为3600只,那么我们对全A股票池进行有放回地抽样,重复3600次,得到一个包含3600只股票的Bootstrap股票池及其对应的截面期因子数据。相比于真实全A股票池,Bootstrap股票池中有的股票可能重复抽到,有的股票可能没有被抽到。在随后机器学习的训练环节,该月底截面期的特征即为这3600只“新”股票的因子值。需要说明的是,Bootstrap的重采样次数通常应大于1000。但是考虑到研究的时间开销,本文将重采样次数N设为100。我们发现N=100已经能够观察到分布间的差异,并且得到具备一定统计效力的结果,细节请参考本文结果部分。

(python的调仓函数)(python的调仓函数)

2. 针对样本外数据集的随机性,我们对样本外数据集进行Bootstrap重采样,具体如左下图所示。对样本外的每个月底截面期,对全A股票池做有放回地抽样,得到Bootstrap股票池及对应的截面期因子数据。在随后的回测环节,该月底截面期的特征即为这些“新”股票的因子值。

(python的调仓函数)(python的调仓函数)

3. 针对回测时间的随机性,我们对回测时间进行Bootstrap重采样,具体过程如右上图所示。假设原始样本外数据集包含从2011年1月~2018年12月共96个月底截面期对应的回测月份(最后一个月底截面期2018年12月对应的回测月份为2019年1月),我们对于这96个回测月份进行有放回地抽样,并重复96次,得到一个包含新的96个回测月份的Bootstrap回测时间。相比于原始的96个回测月份,Bootstrap回测时间中有的月份可能被重复抽到,有的月份可能没有被抽到。我们随后基于这96个“新”回测月份进行机器学习模型的回测。需要指出的是,这96个新回测月份不存在严格的时序关系,即Bootstrap回测时间段中靠前的月份在真实市场中所对应的月份并不一定靠前。

方法

考察对象:三组交叉验证调参方法

我们希望采用Bootstrap方法模拟金融市场中的随机性,构建一系列“平行A股市场”,考察机器学习量化选股模型在这些平行世界中的表现,对不同策略进行比较和取舍,检验策略是否陷入回测过拟合。具体而言,本研究的考察对象是华泰金工《人工智能16:再论时序交叉验证对抗过拟合》(20190218)中的三组交叉验证调参方法,分别为:K折交叉验证、乱序分组递进式交叉验证、分组时序交叉验证。三组调参方法使用的基学习器相同,均为XGBoost模型,模型构建细节也相同,仅有的区别是通过调参最终选定的超参数不同。《人工智能16:再论时序交叉验证对抗过拟合》的研究结论是:基于分组时序交叉验调参方法得到的人工智能选股策略表现优于另外两种方法。本研究将检验上述结论是否存在回测过拟合。

下面简单介绍待检验的结论。对于三组交叉验证方法,我们逐月计算模型性能(如AUC)以及单因子测试表现(如Rank IC)。为了突出方法间的差异,将乱序分组递进式和分组时序的AUC或Rank IC减去K折的AUC或Rank IC,再对差值做累加。如果差的累积值稳定上升,那么可认为该方法稳定优于K折;如果差的累积值维持在0轴,那么可认为该方法和K折没有差别。下图结果显示,分组时序表现优于乱序分组递进式,说明时序交叉验证带来的提升源于时序信息的保留;同时乱序分组递进式优于K折,说明使用更少样本也能部分提升模型表现。

(python的调仓函数)(python的调仓函数)

关于三种交叉验证调参方法的概念,本文不再赘述,感兴趣的读者请参考华泰金工《人工智能14:对抗过拟合:从时序交叉验证谈起》(20181128)和《人工智能16:再论时序交叉验证对抗过拟合》(20190218)。简单而言:

1. K折交叉验证是经典的交叉验证方法,适用于独立同分布的非时间序列数据,应用于金融领域的时间序列数据存在过拟合风险,是本文的基线模型。

2. 乱序分组递进式交叉验证相比于K折使用更少样本,但是破坏时序信息,也是本文的基线模型。

3. 分组时序交叉验证是针对时间序列数据提出的改进,能一定程度上减轻过拟合,是本文推荐使用的模型。

(python的调仓函数)(python的调仓函数)(python的调仓函数)(python的调仓函数)

人工智能选股模型测试流程

(python的调仓函数)(python的调仓函数)

本文选用XGBoost作为基学习器,测试流程包含如下步骤:

1.数据获取:

a) 股票池:全A股。剔除ST股票,剔除每个截面期下一交易日停牌的股票,剔除上市3个月内的股票,每只股票视作一个样本。

b) 回测区间:2011年1月31日至2019年1月31日。

2.特征和标签提取:每个自然月的最后一个交易日,计算之前报告里的70个因子暴露度,作为样本的原始特征,因子池如下表所示。计算下一整个自然月的个股超额收益(以沪深300指数为基准),在每个月末截面期,选取下月收益排名前30%的股票作为正例(y = 1),后30%的股票作为负例(y = 0),作为样本的标签。

(python的调仓函数)(python的调仓函数)

3.特征预处理:

a) 中位数去极值:设第T期某因子在所有个股上的暴露度序列为D_i,D_M 为该序列中位数,D_M 1为序列 |D_i -D_M| 的中位数,则将序列D_i中所有大于D_M+5D_M1的数重设为D_M+5D_M1,将序列D_i中所有小于D_M-5D_M1的数重设为D_M-5D_M1;

b) 缺失值处理:得到新的因子暴露度序列后,将因子暴露度缺失的地方设为中信一级行业相同个股的平均值;

c) 行业市值中性化:将填充缺失值后的因子暴露度对行业哑变量和取对数后的市值做线性回归,取残差作为新的因子暴露度;

d) 标准化:将中性化处理后的因子暴露度序列减去其现在的均值、除以其标准差,得到一个新的近似服从N(0, 1)分布的序列。

4.滚动训练集和验证集的划分:本文采用年度滚动训练方式,全体样本内外数据共分为八个阶段,如下图所示。例如预测2011年时,将2005~2010年共72个月数据合并作为样本内数据集;预测T年时,将T-6至T-1年的72个月合并作为样本内数据。根据不同的交叉验证方法划分训练集和验证集,交叉验证的折数均为12。对于分组时序交叉验证,每次训练集长度均为6个月的整数倍,验证集长度均等于6个月。对于K折交叉验证,验证次数为12次;对于乱序分组递进式和分组时序交叉验证,验证次数为11次。凡涉及将数据打乱的交叉验证方法,随机数种子点均相同,从而保证打乱的方式相同。

(python的调仓函数)(python的调仓函数)

5.交叉验证调参:对全部超参数组合进行网格搜索;针对每一组超参数组合,每次验证使用XGBoost基学习器对训练集进行训练,并且记录模型在验证集的表现;选择全部验证集平均AUC最高的一组超参数作为模型最优超参数。不同交叉验证方法可能得到不同的最优超参数。最终确定的最优超参数设置下表所示。

(python的调仓函数)(python的调仓函数)

6.样本内训练:使用最优超参数设置下的XGBoost基学习器对完整的原始样本内数据集进行训练。采用Bootstrap方案1时,对100组Bootstrap样本内数据集分别进行训练,得到100组XGBoost模型。

7.样本外测试:完成模型训练后,以T月末截面期所有样本预处理后的特征作为模型的输入,得到每个样本的预测值。将预测值视作合成后的因子,采用回归法、IC分析法和分层回测法进行单因子测试。采用Bootstrap方案2时,对100组Bootstrap样本外数据集进行预测并回测。采用Bootstrap方案3时,将原始样本外数据集后按照100组Bootstrap回测时间重新组织并回测。

8.模型评价:

a) (针对Bootstrap方案1)100组测试集正确率、AUC等衡量模型性能的指标分布情况;

b) (针对Bootstrap方案1、2和3) 单因子测试得到的统计指标和回测绩效的分布情况。

单因子测试

回归法和IC值分析法

测试模型构建方法如下:

1. 股票池:全A股,剔除ST股票,剔除每个截面期下一交易日停牌的股票,剔除上市3个月以内的股票。采用Bootstrap方案2时,股票池为Bootstrap样本外数据集,同时需符合上述筛选条件。采用Bootstrap方案3时,股票池为Bootstrap回测时间确定的月末截面期所对应的、同时符合上述筛选条件的股票。

2. 回测区间:2011-01-31至2019-01-31。

3. 截面期:每个月月末,用当前截面期因子值、与当前截面期至下个截面期内的个股收益进行回归,并计算其Rank IC值。

4. 数据处理方法:对于分类模型,将模型对股票下期上涨概率的预测值视作单因子。对于回归模型,将回归预测值视作单因子。因子值为空的股票不参与测试。

5. 回归测试中采用加权最小二乘回归(WLS),使用个股流通市值的平方根作为权重。IC测试时对单因子进行行业市值中性。

分层回测法

依照因子值对股票进行打分,构建投资组合回测,是最直观的衡量因子优劣的手段。测试模型构建方法如下:

1. 股票池、回测区间、截面期均与回归法相同。

2. 换仓:在每个自然月最后一个交易日核算因子值,在下个自然月首个交易日按当日收盘价换仓,交易费用以双边千分之四计。

3. 分层方法:因子先用中位数法去极值,然后进行市值、行业中性化处理(方法论详见上一小节),将股票池内所有个股按因子从大到小进行排序,等分N层,每层内部的个股等权配置。当个股总数目无法被N整除时采用任一种近似方法处理均可,实际上对分层组合的回测结果影响很小。

4. 多空组合收益计算方法:用Top组每天的收益减去Bottom组每天的收益,得到每日多空收益序列r_1,r_2,...,r_n,则多空组合在第n天的净值等于(1+r_1)(1+r_2)...(1+r_n)。

5. 评价方法:全部N层组合年化收益率(观察是否单调变化),多空组合的年化收益率、夏普比率、最大回撤等。

结果

方案1:对样本内数据集进行Bootstrap重采样

首先我们展示对样本内数据集进行Bootstrap重采样的结果。对于每一次重采样,我们基于真实因子截面数据,构建一个“平行A股市场”;以平行世界中的因子截面数据为样本内数据集,以不同交叉验证方法得到的最优超参数作为模型的超参数,训练XGBoost模型;模型训练完成后,以真实A股市场的因子截面数据为样本外数据集,进行预测和单因子回测,计算模型性能和各项回测指标。最后统计100次重采样的模型性能和单因子回测指标,绘制分布,比较三组交叉验证方法的指标分布情况。Bootstrap样本内数据集的结果回答了如下问题:样本内数据的小幅变动是否影响机器学习研究结论?

模型性能

三组交叉验证方法样本内正确率和AUC的分布情况如下图。两项指标的分布较为密集,例如全部分组时序交叉验证的样本内正确率集中在61%~62%的区间,样本内AUC集中在0.66~0.67的区间。从三组交叉验证方法的样本内表现看,K折优于乱序分组递进式,乱序分组递进式优于分组时序。

(python的调仓函数)(python的调仓函数)

三组交叉验证方法样本外正确率和AUC的分布情况如下图。和样本内表现截然不同,三组交叉验证方法的样本外表现出现了逆转,分组时序远优于乱序分组递进式,乱序分组递进式优于K折。Bootstrap样本内数据集构建的平行世界中得出的研究结论与真实世界中得出的研究结论一致(真实世界结论参考图表8、9,下同)。

(python的调仓函数)(python的调仓函数)

回归法和IC值分析法

三组交叉验证方法回归法和IC值分析法各项指标的分布情况如下图。分组时序交叉验证的|t|均值、t均值、因子收益率均值、Rank IC均值远优于乱序分递进式和K折。Bootstrap样本内数据集构建的平行世界中得出的研究结论与真实世界中得出的研究结论一致。

(python的调仓函数)(python的调仓函数)(python的调仓函数)(python的调仓函数)

分层回测法

三组交叉验证方法分层回测法各项指标的分布情况如下图。分组时序交叉验证的多空组合年化收益率、Top组合年化收益率、Top组合夏普比率均优于乱序分递进式和K折;对于多空组合夏普比率,分组时序交叉验证具有微弱优势。Bootstrap样本内数据集构建的平行世界中得出的研究结论与真实世界中得出的研究结论基本一致。

(python的调仓函数)(python的调仓函数)(python的调仓函数)(python的调仓函数)

上图展示了三组交叉验证方法100次Bootstrap重采样下收益最高、收益最低的两条多空组合净值以及真实A股市场下的多空组合净值。首先,仍可以观察到分组时序、乱序分组递进式、K折收益从高到低的排序关系。其次,我们发现真实净值(实线)和最优净值(点线)接近,和最差净值(短划线)相差较大。换言之,大部分Bootstrap样本内平行世界训练得到的模型表现不如真实世界训练得到的模型。这说明样本内数据集的小幅扰动在多数情况下可能削弱模型表现。

方案2:对样本外数据集进行Bootstrap重采样

下面展示对样本外数据集进行Bootstrap重采样的结果。对于每一次重采样,我们基于真实因子截面数据,构建一个“平行A股市场”;以真实世界中的因子截面数据为样本内数据集,以不同交叉验证方法得到的最优超参数作为模型的超参数,训练XGBoost模型;模型训练完成后,以平行A股市场的因子截面数据为样本外数据集,进行单因子回测,计算各项回测指标。最后统计100次重采样的单因子回测指标,绘制分布,比较三组交叉验证方法的指标分布情况。Bootstrap样本外数据集的结果回答了如下问题:样本外数据的小幅变动是否影响机器学习研究结论?

回归法和IC值分析法

三组交叉验证方法回归法和IC值分析法各项指标的分布情况如下图。分组时序交叉验证的|t|均值、t均值、因子收益率均值、Rank IC均值远优于乱序分递进式和K折。Bootstrap样本外数据集构建的平行世界中得出的研究结论与真实世界中得出的研究结论一致,也和Bootstrap样本内数据集得出的结论一致。

(python的调仓函数)(python的调仓函数)

分层回测法

三组交叉验证方法分层回测法各项指标的分布情况如下图。分组时序交叉验证的多空组合年化收益率优于乱序分递进式和K折;对于多空组合夏普比率、Top组合年化收益率、Top组合夏普比率,分组时序交叉验证具有微弱优势。Bootstrap样本外数据集构建的平行世界中得到的研究结论与真实世界中得到的研究结论基本一致,也和Bootstrap样本内数据集得出的结论基本一致。

(python的调仓函数)(python的调仓函数)

下图展示了三组交叉验证方法100次Bootstrap重采样下收益最高、收益最低的两条多空组合净值以及真实A股市场下的多空组合净值。首先,仍可以观察到分组时序优于另外两组方法,但是乱序分组递进式和K折没有明显差异。其次,我们发现真实净值(实线)位于最优净值(点线)和最差净值(短划线)的中间位置。这说明样本外数据集的小幅扰动对模型表现的影响整体为中性。

(python的调仓函数)(python的调仓函数)

方案3:对回测时间进行Bootstrap重采样

下面我们展示对回测时间进行Bootstrap重采样的结果。对于每一次重采样,我们基于原有的96个回测月份,构建一组新的包含96个回测月份的时间序列;以真实世界中的因子截面数据为样本内数据集,以不同交叉验证方法得到的最优超参数作为模型的超参数,训练XGBoost模型;模型训练完成后,以新的回测月份序列中真实A股市场的因子截面数据为样本外数据集,进行单因子回测,计算各项回测指标。最后统计100次重采样的单因子回测指标,绘制分布,比较三组交叉验证方法的指标分布情况。Bootstrap回测时间的结果回答了如下问题:回测时间的改变是否影响机器学习研究结论?

回归法和IC值分析法

三组交叉验证方法回归法和IC值分析法各项指标的分布情况如下图。分组时序交叉验证的|t|均值、t均值、因子收益率均值、Rank IC均值略优于乱序分递进式和K折,但是优势不如前两种Bootstrap方案明显。Bootstrap回测时间构建的平行世界中得出的研究结论与真实世界中得出的研究结论一致。

(python的调仓函数)(python的调仓函数)(python的调仓函数)(python的调仓函数)

分层回测法

三组交叉验证方法分层回测法各项指标的分布情况如下图所示。分组时序交叉验证的多空组合年化收益率优于乱序分递进式和K折的年化收益率;对于多空组合夏普比率、Top组合年化收益率、Top组合夏普比率,如果仅从分布形态看,分组时序交叉验证没有优势。Bootstrap回测时间构建的平行世界中得到的研究结论与真实世界中得到的研究结论部分一致。

(python的调仓函数)(python的调仓函数)

三种Bootstrap重采样方案的横向比较

除了针对同一种重采样方案下的三组交叉验证方法进行比较外,还可以对同一组交叉验证方法下三种重采样方案得到的指标分布进行横向比较。下面我们以分组时序交叉验证为例展示横向比较结果。横向比较结果回答了如下问题:机器学习选股不同环节随机性的引入,对研究结论的影响程度有何差异?

回归法和IC值分析法

三种重采样方案下的回归法和IC值分析法各项指标的分布情况如下图所示。首先,从分布的宽度看,Bootstrap样本内数据集的分布较窄,即变异程度低;Bootstrap样本外数据集次之;Bootstrap回测时间的分布较宽,即变异程度大。这说明,样本内数据集的小幅变动对研究结论的影响程度不大;回测时间的改变对研究结论的影响程度相对较大,因而在量化策略的开发过程中,需要避免因回测时间选择不当而造成的误判。

其次,从分布的位置看,Bootstrap样本内数据集位于真实值的左侧,Bootstrap样本外数据集和Bootstrap回测时间的中心位置和真实值接近。这说明,样本内数据集的小幅变动可能削弱模型表现,研究者在开发过程中需要密切关注训练数据的质量;而当模型完成训练后,样本外数据集和回测时间的改变对单因子测试各项统计指标的影响方向整体为中性。

(python的调仓函数)(python的调仓函数)

分层回测法

三种重采样方案下的分层回测法多空组合年化收益和夏普比率的分布情况如下图所示。首先,从分布的宽度看,仍然是Bootstrap样本内对结果的影响程度较低,Bootstrap样本则外次之,Bootstrap回测时间对结果的影响程度较高。其次,从分布的位置看,Bootstrap样本内和Bootstrap样本外的多空组合夏普比率分布整体位于真实值的左侧,说明样本内或样本外数据集的小幅变动均可能降低多空组合的夏普比率。与上一小节结果对比可知,t值、因子收益率、Rank IC等统计指标对样本外数据集的变动相对不敏感,但是类似多空组合夏普比率这样的和交易密切相关的指标对样本外数据集的变动较为敏感。

(python的调仓函数)(python的调仓函数)

三种重采样方案下的分层回测法的Top组合年化收益和夏普比率的分布情况如下图所示。Bootstrap回测时间的分布宽度远超另外两种Bootstrap方案,说明Top组合表现对回测时间较为敏感。Top组合指标分布的中心位置在真实值的右侧,原因可能是Top组合的月度收益为正偏态分布,长尾在右侧的正收益部分,Bootstrap重采样时高收益月份有较大概率被抽到,提升了Top组合在平行世界中的表现。

(python的调仓函数)(python的调仓函数)

结果汇总以及回测过拟合风险的定量刻画

将三组交叉验证方法在三种Bootstrap方案下的回测表现进行汇总,结果如下表所示。总的来看,三种Bootstrap方案下得出的研究结论和真实A股市场得出的研究结论一致,即分组时序相对较好,乱序分组递进式次之,K折相对较差。平行世界和真实世界能够互相印证,表明基于真实数据所得出的“分组时序交叉验证优于其余两组方法”的研究结论其回测过拟合风险较低。

(python的调仓函数)(python的调仓函数)

通过平行世界和真实世界中模型不同表现的对比,我们得以定性描述基于真实数据得出研究结论的回测过拟合风险。那么能否定量刻画回测过拟合风险?下面我们尝试两种简单方法。

1. 对于同一种Bootstrap方案下三组交叉验证方法的回测指标分布进行单因素重复测量方差分析(One-way Repeated Measures ANOVA)的统计检验。ANOVA的统计指标F值和P值用以衡量三组分布的差异性,F值越大或对应的P值越小,说明三组分布的差异越大,那么“分组时序交叉验证优于其余两组方法”研究结论其回测过拟合风险可能越小。观察下表可知,除多空组合夏普比率和Top组合夏普比率外,大部分回测指标在三组交叉验证方法之间均存在显著差异,进一步验证了之前的结论。

2. 对于每一次Bootstrap重采样,判断分组时序交叉验证的回测指标是否优于其余两组的方法。统计全部100次重采样下,分组时序交叉验证表现最优的概率。概率值越接近1,说明分组时序交叉验证在平行世界里表现越好,那么基于真实数据得出结论的过拟合风险就越小。观察下表可知,多数指标的概率值等于或接近1,同样印证了之前的结论。

(python的调仓函数)(python的调仓函数)

总结

通过每种Bootstrap方案下三组交叉验证方法比较,以及三种Bootstrap方案下同一组交叉验证方法的横向比较,我们得到下列结论:

1. Bootstrap是一种可行的构建“平行A股市场”的重采样方法,能够模拟机器学习不同环节的随机性,从而检验在真实A股市场中得出的研究结论是否为过拟合。我们分别对样本内数据、样本外数据和回测时间进行Bootstrap重采样,发现在“平行A股市场”中分组时序交叉验证方法的模型性能和单因子回测指标均优于其它两种方法,统计检验结果显著。真实世界的研究结论能够在平行世界中复现,表明该结论为过拟合的可能性较低。我们借助“偶然”的工具,探寻出“必然”的规律。

2. 三种Bootstrap方案对同一组交叉验证方法的影响方向和程度有区别。Bootstrap样本内数据集相当于向训练集因子值添加小幅扰动,可能小幅削弱模型表现;Bootstrap样本外数据集相当于向测试集因子值添加小幅扰动,可能部分增强或削弱模型表现;Bootstrap回测时间即改变模型的回测时间段,可能大幅增强或削弱模型表现。上述结果对研究者的启示是在开发过程中需要密切关注训练数据的质量,同时应避免因回测时间选择不当而造成的误判。

3. 在以往的量化模型开发过程中,通常将历史回测表现视作确定性的结果,而忽略随机性对回测结果的影响。在面临不同量化策略的取舍之时,往往只是简单基于策略的年化收益率、夏普比率、收益回撤比等评价指标。Bootstrap重采样方法提供了一种刻画随机性的思路,使研究者能够基于评价指标的统计分布、而非单个统计量,对模型优劣做出相对客观的判断和决策。本文从方法论的角度,对结合机器学习的多因子选股框架进行反思,针对模型比较和模型评价环节提出创新式的改造,希望对本领域的投资者有所启发。

风险提示

人工智能选股方法是对历史投资规律的挖掘,如若未来市场投资环境发生变化,该方法则存在失效的可能。机器学习选股模型随机性的来源多样,本研究只考虑了有限的三种情况,存在忽略其它更重要随机性来源的可能。Bootstrap重采样方法是对随机性的简单模拟,亦存在过度简化的可能。

免责申明

本公众平台不是华泰证券研究所官方订阅平台。相关观点或信息请以华泰证券官方公众平台为准。根据《证券期货投资者适当性管理办法》的相关要求,本公众号内容仅面向华泰证券客户中的专业投资者,请勿对本公众号内容进行任何形式的转发。若您并非华泰证券客户中的专业投资者,请取消关注本公众号,不再订阅、接收或使用本公众号中的内容。因本公众号难以设置访问权限,若给您造成不便,烦请谅解!本公众号旨在沟通研究信息,交流研究经验,华泰证券不因任何订阅本公众号的行为而将订阅者视为华泰证券的客户。

本公众号研究报告有关内容摘编自已经发布的研究报告的,若因对报告的摘编而产生歧义,应以报告发布当日的完整内容为准。如需了解详细内容,请具体参见华泰证券所发布的完整版报告。

本公众号内容基于作者认为可靠的、已公开的信息编制,但作者对该等信息的准确性及完整性不作任何保证,也不对证券价格的涨跌或市场走势作确定性判断。本公众号所载的意见、评估及预测仅反映发布当日的观点和判断。在不同时期,华泰证券可能会发出与本公众号所载意见、评估及预测不一致的研究报告。

在任何情况下,本公众号中的信息或所表述的意见均不构成对客户私人投资建议。订阅人不应单独依靠本订阅号中的信息而取代自身独立的判断,应自主做出投资决策并自行承担投资风险。普通投资者若使用本资料,有可能会因缺乏解读服务而对内容产生理解上的歧义,进而造成投资损失。对依据或者使用本公众号内容所造成的一切后果,华泰证券及作者均不承担任何法律责任。

本公众号版权仅为华泰证券股份有限公司所有,未经公司书面许可,任何机构或个人不得以翻版、复制、发表、引用或再次分发他人等任何形式侵犯本公众号发布的所有内容的版权。如因侵权行为给华泰证券造成任何直接或间接的损失,华泰证券保留追究一切法律责任的权利。本公司具有中国证监会核准的“证券投资咨询”业务资格,经营许可证编号为:91320000704041011J。

林晓明

执业证书编号:S0570516010001

华泰金工深度报告一览

金融周期系列研究(资产配置)

【华泰金工林晓明团队】二十载昔日重现,三四年周期轮回——2019年中国与全球市场量化资产配置年度观点(下)

【华泰金工林晓明团队】二十载昔日重现,三四年周期轮回——2019年中国与全球市场量化资产配置年度观点(上)

【华泰金工林晓明团队】周期轮动下的BL资产配置策略

【华泰金工林晓明团队】周期理论与机器学习资产收益预测——华泰金工市场周期与资产配置研究

【华泰金工林晓明团队】市场拐点的判断方法

【华泰金工林晓明团队】2018中国与全球市场的机会、风险 · 年度策略报告(上)

【华泰金工林晓明团队】基钦周期的量化测度与历史规律 · 华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(四)——华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(三)——华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(二)——华泰金工周期系列研究

【华泰金工林晓明团队】周期三因子定价与资产配置模型(一)——华泰金工周期系列研究

【华泰金工林晓明团队】华泰金工周期研究系列 · 基于DDM模型的板块轮动探索

【华泰金工林晓明团队】市场周期的量化分解

【华泰金工林晓明团队】周期研究对大类资产的预测观点

【华泰金工林晓明团队】金融经济系统周期的确定(下)——华泰金工周期系列研究

【华泰金工林晓明团队】金融经济系统周期的确定(上)——华泰金工周期系列研究

【华泰金工林晓明团队】全球多市场择时配置初探——华泰周期择时研究系列

行业指数频谱分析及配置模型:市场的周期分析系列之三

【华泰金工林晓明团队】市场的频率——市场轮回,周期重生

【华泰金工林晓明团队】市场的轮回——金融市场周期与经济周期关系初探

FOF与金融创新产品

【华泰金工】生命周期基金Glide Path开发实例——华泰FOF与金融创新产品系列研究报告之一

因子周期(因子择时)

【华泰金工林晓明团队】市值因子收益与经济结构的关系——华泰因子周期研究系列之三

【华泰金工林晓明团队】周期视角下的因子投资时钟--华泰因子周期研究系列之二

【华泰金工林晓明团队】因子收益率的周期性研究初探

择时

【华泰金工林晓明团队】华泰风险收益一致性择时模型

【华泰金工林晓明团队】技术指标与周期量价择时模型的结合

【华泰金工林晓明团队】华泰价量择时模型——市场周期在择时领域的应用

行业轮动

【华泰金工林晓明团队】行业轮动系列之六:“华泰周期轮动”基金组合构建20190312

【华泰金工林晓明团队】估值因子在行业配置中的应用——华泰行业轮动系列报告之五

【华泰金工林晓明团队】动量增强因子在行业配置中的应用--华泰行业轮动系列报告之四

【华泰金工林晓明团队】财务质量因子在行业配置中的应用--华泰行业轮动系列报告之三

【华泰金工林晓明团队】周期视角下的行业轮动实证分析·华泰行业轮动系列之二

【华泰金工林晓明团队】基于通用回归模型的行业轮动策略 · 华泰行业轮动系列之一

Smartbeta

【华泰金工林晓明团队】Smart Beta:乘风破浪趁此时——华泰Smart Beta系列之一

【华泰金工林晓明团队】Smartbeta在资产配置中的优势——华泰金工Smartbeta专题研究之一

多因子选股

【华泰金工林晓明团队】因子合成方法实证分析 ——华泰多因子系列之十

【华泰金工林晓明团队】华泰单因子测试之一致预期因子 ——华泰多因子系列之九

【华泰金工林晓明团队】华泰单因子测试之财务质量因子——华泰多因子系列之八

【华泰金工林晓明团队】华泰单因子测试之资金流向因子——华泰多因子系列之七

【华泰金工林晓明团队】华泰单因子测试之波动率类因子——华泰多因子系列之六

【华泰金工林晓明团队】华泰单因子测试之换手率类因子——华泰多因子系列之五

【华泰金工林晓明团队】华泰单因子测试之动量类因子——华泰多因子系列之四

【华泰金工林晓明团队】华泰单因子测试之成长类因子——华泰多因子系列之三

【华泰金工林晓明团队】华泰单因子测试之估值类因子——华泰多因子系列之二

【华泰金工林晓明团队】华泰多因子模型体系初探——华泰多因子系列之一

【华泰金工林晓明团队】五因子模型A股实证研究

【华泰金工林晓明团队】红利因子的有效性研究——华泰红利指数与红利因子系列研究报告之二

人工智能

【华泰金工林晓明团队】机器学习选股模型的调仓频率实证——华泰人工智能系列之十八

【华泰金工林晓明团队】人工智能选股之数据标注方法实证——华泰人工智能系列之十七

【华泰金工林晓明团队】再论时序交叉验证对抗过拟合——华泰人工智能系列之十六

【华泰金工林晓明团队】人工智能选股之卷积神经网络——华泰人工智能系列之十五

【华泰金工林晓明团队】对抗过拟合:从时序交叉验证谈起

【华泰金工林晓明团队】人工智能选股之损失函数的改进——华泰人工智能系列之十三

【华泰金工林晓明团队】人工智能选股之特征选择——华泰人工智能系列之十二

【华泰金工林晓明团队】人工智能选股之Stacking集成学习——华泰人工智能系列之十一

【华泰金工林晓明团队】宏观周期指标应用于随机森林选股——华泰人工智能系列之十

【华泰金工林晓明团队】人工智能选股之循环神经网络——华泰人工智能系列之九

【华泰金工林晓明团队】人工智能选股之全连接神经网络——华泰人工智能系列之八

【华泰金工林晓明团队】人工智能选股之Python实战——华泰人工智能系列之七

【华泰金工林晓明团队】人工智能选股之Boosting模型——华泰人工智能系列之六

【华泰金工林晓明团队】人工智能选股之随机森林模型——华泰人工智能系列之五

【华泰金工林晓明团队】人工智能选股之朴素贝叶斯模型——华泰人工智能系列之四

【华泰金工林晓明团队】人工智能选股之支持向量机模型— —华泰人工智能系列之三

【华泰金工林晓明团队】人工智能选股之广义线性模型——华泰人工智能系列之二

指数增强基金分析

【华泰金工林晓明团队】再探回归法测算基金持股仓位——华泰基金仓位分析专题报告

【华泰金工林晓明团队】酌古御今:指数增强基金收益分析

【华泰金工林晓明团队】基于回归法的基金持股仓位测算

【华泰金工林晓明团队】指数增强方法汇总及实例——量化多因子指数增强策略实证

基本面选股

【华泰金工林晓明团队】华泰价值选股之相对市盈率港股模型——相对市盈率港股通模型实证研究

【华泰金工林晓明团队】华泰价值选股之FFScore模型

【华泰金工林晓明团队】相对市盈率选股模型A股市场实证研究

【华泰金工林晓明团队】华泰价值选股之现金流因子研究——现金流因子选股策略实证研究

【华泰金工林晓明团队】华泰基本面选股之低市收率模型——小费雪选股法 A 股实证研究

【华泰金工林晓明团队】华泰基本面选股之高股息率模型之奥轩尼斯选股法A股实证研究

基金定投

【华泰金工林晓明团队】大成旗下基金2018定投策略研究

【华泰金工林晓明团队】布林带与股息率择时定投模型——基金定投系列专题研究报告之四

【华泰金工林晓明团队】基金定投3—马科维茨有效性检验

【华泰金工林晓明团队】基金定投2—投资标的与时机的选择方法

【华泰金工林晓明团队】基金定投1—分析方法与理论基础

其它

【华泰金工林晓明团队】A股市场及行业的农历月份效应——月份效应之二

A股市场及行业的月份效应——详解历史数据中的隐藏法则

声明:我要去上班所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,版权归原作者所有,原文出处。若您的权利被侵害,请联系删除。

本文标题:(python的调仓函数)(python的调仓函数)
本文链接:https://www.51qsb.cn/article/2410.html

(0)
打赏微信扫一扫微信扫一扫QQ扫一扫QQ扫一扫
上一篇2022-09-20
下一篇2022-09-20

你可能还想知道

发表回复

登录后才能评论