新浪财经

基于机器学习的短期择时

XYQUANT

关注

来源:XYQUANT

本篇是系统化资产配置系列报告的第三篇,对如何利用机器学习算法进行短期市场择时进行了系统介绍。本报告中,我们将股市未来的涨和跌定义为一个分类问题,利用机器学习算法来对Wind全A指数的未来涨跌建模。基于决策树的AdaBoost算法解决了构建择时模型面临的多个问题,它实现了:

1.有效因子的自动筛选。

2.非线性因子的建模。

3.通过自适应调整样本权重解决因子相关性问题。

4.不易过拟合,模型较稳健。

最后,我们通过叠加水晶球择时模型,充分利用期权市场信息,形成了表现更加出色的双塔奇兵择时模型。

本篇是系统化资产配置系列报告的第三篇,对如何利用机器学习算法进行短期市场择时进行了系统介绍。全球金融市场每天产生海量的各类数据,如何筛选并有效利用这些数据来预测股票市场走势一直是一个重要但棘手的问题。短期择时面临的主要困难包括:1.短期市场走势受情绪等因素影响较大;2.如何筛选有效因子;3.非线性因子如何建模;4.因子相关性问题如何解决;5.因子较多时如何避免过拟合等。幸运的是,机器学习技术的发展给我们提供了一条有效利用并筛选大量因子数据的途径。本报告中,我们将股市未来的涨和跌定义为一个分类问题,利用机器学习算法来对Wind全A指数的未来涨跌建模。

我们利用51种日频因子数据构建基于决策树的AdaBoost分类器,从而对下一交易日Wind全A指数的涨(1)跌(-1)做出预测。51种因子中包含回购利率,信用利差、南华商品指数收益率、金油比、标普500指数等多种类型的市场信息。回测结果显示,若不考虑交易成本,AdaBoost多空择时策略在2014年10月27日至2019年8月30日获得了41.31%的年化收益率和1.41的收益风险比,纯多头策略的年化收益率达到24.67%,收益风险比达到0.98,而同期简单持有策略的年化收益率和收益风险比仅有7.66%和0.26。

基于决策树的AdaBoost算法解决了构建择时模型面临的多个问题,它实现了:1.有效因子的自动筛选。2.非线性因子的建模。3.通过自适应调整样本权重解决因子相关性问题。4.不易过拟合,模型较稳健。

最后,我们通过叠加水晶球择时模型,充分利用期权市场信息,形成了表现更加出色的双塔奇兵择时模型。在万五的交易成本假设下,多空策略在2015年6月1日至2019年8月30日实现了15.90%的年化收益率和0.72的收益风险比,纯多头策略年化收益率和收益风险比也分别达到13.16%和0.70,而同期Wind全A收益率仅有-11.18%。

报告正文

1

基于决策树的择时模型

1.1 决策树简介

决策树(Decision Trees)是一种常用的非参数监督学习模型(Nonparametric Supervised Learning)。它是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类或回归结果。一般来说,我们将目标变量为一系列离散值的决策树称为分类树(Classification Trees),将目标变量为连续值的决策树称为回归树(Regression Trees)。下图给出了一个银行根据客户信息判断是否批准贷款的决策树示例。

我们以著名的CART(Classification and Regression Trees)算法为例来说明如何构建分类树, python的sklearn包就是使用优化后的CART算法来实现分类树和回归树模型。我们首先定义基尼系数,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,模型的分类能力越强。假设在分类问题中有K个类别,第k个类别的概率为Pk,则基尼系数表达式为:

对于给定的样本D,假设第k个类别的数量为Ck,则样本的基尼系数表达式为:

特别的,对于二分类问题的样本D,如果根据特征A的某个值a,把D分成D1和D2两部分,则在特征A的条件下,D的基尼系数为:

其中D、D1和 D2表示样本的数量。

CART分类树构建流程:

输入:训练集,基尼系数阈值,样本个数阈值。

输出:分类树T

从根节点开始,我们用训练集递归的建立分类树。

对于当前节点的数据集D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。

计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。

计算当前节点现有各个特征A的每个特征值a对数据集D的条件基尼系数。

在计算得到的所有特征的各个特征值对应的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分为D1和D2 。

对左右子节点递归的调用1-4步,生成决策树。

使用生成的决策树做预测时,假如测试集里的样本X落到了某个叶节点,而节点里有多个训练样本,则对于X的类别预测采用的是这个叶节点里概率最大的类别。

在sklearn的决策树实现中,除了基尼系数外,也提供了使用信息熵(Entropy)作为不纯度度量来生成决策树的选项,即在每个节点选择样本分裂后信息增益(Information Gain)最大也就是熵减最多的属性。假设在分类问题中有K个类别,样本D中第k个类别的概率为pk,则信息熵定义为:

特别的,对于二分类问题,我们有:

样本D关于属性A的条件信息熵为:

属性A带来的信息增益为:

其中D、D1和 D2表示样本的数量。

1.2 数据说明

本报告择时模型的预测标的为Wind全A指数,使用了包含资金流动性、风险偏好、技术指标等51种因子数据。数据的时间范围是2007年6月1日至2019年8月30日。因子具体定义见下表:

1.3 决策树择时模型

使用决策树模型来构建择时策略有很多优势。首先,决策树模型可以选择多个因子作为预测节点,具有结合多个因子信息的能力。其次,决策树模型具有拟合非线性因子的能力。最后,决策树的算法保证了它会优先选取预测能力强的因子作为节点,实现因子的自动筛选。

1.3.1 决策树择时模型回测流程

下面我们给出本文的第一个择时模型:决策树择时模型。本模型基于51种短期因子,通过多层决策树来预测标的下一交易日的涨跌并构建交易策略。多层决策树模型的构建流程见下图。

基于多层决策树的决策树择时模型回测流程如下:

回测数据的时间范围是2007年6月1日至2019年8月30日,使用扩展窗口法(Expanding):

取得至少1800天的样本数据作为训练集。利用训练集进行分层KFold交叉验证(k=5)以选取预测准确率最高的决策树模型。超参数的搜索范围为:

  决策树不纯度度量:{信息熵,基尼系数} 

  决策树深度:{5,10,…,25,30}

利用第一步得到的最优模型预测Wind全A指数下一交易日的涨跌。若预测信号为涨,则假设在当日收盘买入Wind全A;若预测信号为跌,则在当日收盘做空Wind全A。

连续使用2中的最优模型20个交易日后再次进入步骤1,并将此20个交易日数据加入训练集。

注意到由于首次训练模型时使用了1800个样本数据,因此实际的交易信号是在2014年10月27日首次给出。

1.3.2 决策树择时模型回测结果

假设在换仓信号发出当日收盘时进行交易且无交易成本,我们给出决策树择时模型多空策略和纯多头策略的表现。从下图看,单纯使用决策树作为预测模型效果较差,策略收益甚至显著低于简单持有策略的表现。多空策略年化收益率仅有-18.72%,多头策略为-5.56%,远小于简单持有策略7.66%的年化收益率。

模型样本外表现较差可能是多层决策树极易出现过拟合的特性导致的。下图给出了每次训练得到的决策树样本内预测准确率。可以看到,多层决策树模型的样本内预测准确率相当高,平均达到72.35%,远远高于其样本外50%左右的胜率。这意味着模型出现了一定程度的过拟合。

1.4 优选决策树择时模型

1.4.1 优选决策树择时模型回测流程

前文介绍的基于多层决策树的择时模型表现非常不理想,这可能是由于多层决策树极易出现过拟合现象,从多层决策树的算法来看,该算法样本内输入的因子较多,缺乏对因子进行优选的过程,这也许是过拟合存在的原因。为了解决这个问题,我们尝试基于多个单层决策树构建择时模型,即优选决策树择时模型。

简单来说,优选决策树择时模型通过等权叠加多个单层决策树的预测值来获得最终交易信号。具体来说,我们首先分别对51种因子构建单层决策树,筛选出在样本内能够带来显著超额收益的因子及其决策树。然后使用筛选后的决策树预测未来市场涨跌,最后将多个决策树预测结果叠加,构建交易策略。

基于多个单层决策树的择时模型回测流程如下:

回测数据的时间范围是2007年6月1日至2019年8月30日,同样使用扩展窗口法(Expanding)。

取得至少1800天的样本数据作为训练集。对训练集中的51个因子分别构建单层决策树。

计算51个单层决策树对应的样本内择时策略收益率序列。对每一组策略收益率序列和简单持有策略的超额收益序列做t检验,筛选其中在5%显著性水平上显著的决策树。

利用筛选出的若干决策树预测Wind全A指数下一交易日的涨跌,对所有决策树预测结果取均值,均值大于0则做多,小于0则多空,等于0则平仓。若未筛选出任何一个决策树,则直接给出做多信号。

连续使用2中的模型20个交易日后再次进入步骤1,并将此20个交易日数据加入训练集。

1.4.2 优选决策树择时模型回测结果

假设在换仓信号发出当日收盘时进行交易且无交易成本,我们给出优选决策树择时模型多空策略和纯多头策略表现。从下图看,结合多个单层决策树的择时模型效果比单个多层决策树择时模型要好。多空策略年化收益率达到12.47%,多头策略达到12.31%,显著高于简单持有的7.66%年化收益率,收益风险比,最大回撤等指标也优于简单持有策略。

下图给出了本模型每次训练时筛选出的有效因子数量。可以看出,除了2015年初,大部分时间只有1个因子能带来显著样本内超额收益,这说明单个因子的预测能力并不理想。另外,单层决策树也难以解决因子与收益的非线性问题,所以我们需要进一步改进模型,考虑将单因子按照某种结合方式形成多因子模型。

2

AdaBoost择时模型

2.1 AdaBoost算法简介

决策树择时模型基于多层决策树,容易出现过拟合问题。优选决策树择时模型基于多个单层决策树虽不易过拟合,但它过于简单,无法充分利用因子信息以及捕捉因子的非线性性质。幸运的是,以上这些问题可以被AdaBoost算法完美解决。简要来说,基于AdaBoost算法的择时模型具有以下特点:

结合多个弱分类器,具有较高精度。

不易出现过拟合现象,模型较稳健。

具有处理非线性因子能力。

通过自适应改变样本权重实现高相关性因子的自动剔除。

不需要对特征进行人工筛选,可以在模型中纳入大量因子。

Boosting是集成学习方法(Ensemble Method)的一种,在实践中有着广泛的应用,而AdaBoost模型则是其最为流行的一种实现,最早由Yoav Freund和Robert Schapire在1995年提出。AdaBoost提供了一种框架,在框架内可以使用多种弱分类器,理论上不需要对特征进行人工筛选,训练得到的模型也不易出现过拟合现象。AdaBoost是“Adaptive Boosting”(自适应增强)的缩写,它的自适应性体现在当前基分类器分类错误的样本权重会增大,而正确分类的样本权重会减小,从而在训练下一个基分类器时会着重拟合之前分类错误的样本。AdaBoost算法流程如下:

2.2 AdaBoost择时模型回测流程

我们利用51种日频因子数据构建基于决策树的AdaBoost分类器,对下一交易日Wind全A指数的涨(1)跌(-1)做出预测。为了模型的泛化性能,我们将决策树的深度设置为1,也就是仅有一个根节点和两个叶节点。

在这种模型设定下,AdaBoost的每一个基分类器都只会选择51种因子中的某一个作为决策树节点来对Wind全A下一交易日涨跌做出预测。图表15给出了AdaBoost算法可能选取的两个基分类器(基于2007年6月1日-2019年8月22日的数据)。举例来说,AdaBoost的某个基分类器可能选择7日回购利率作为节点,当7日回购利率低于某一阈值给出涨的预测,7日回购利率高于某一阈值则给出跌的预测。另一个基分类器可能选取标普500指数过去5日收益率作为节点,当5日收益率高于某一阈值给出涨的预测,否则给出跌的预测。而下个交易日的最终预测结果由所有基分类器共同决定。

AdaBoost择时模型回测流程如下:

回测数据的时间范围是2007年6月1日至2019年8月30日,我们同样使用扩展窗口法(Expanding)来训练和交叉验证模型并发出交易信号。具体来说,步骤如下:

取得至少1800天的样本数据作为训练集。利用训练集进行分层KFold交叉验证(k=5)以选取预测正确率最高的模型超参数。超参数的搜索范围为:

决策树不纯度度量:{信息熵,基尼系数} 

AdaBoost基分类器数量:{20,25,30}

利用第一步得到的最优模型预测Wind全A指数下一交易日的涨跌。若下一交易日预测信号为涨,则假设在当日收盘买入Wind全A,若下一交易日预测信号为跌,则在当日收盘做空Wind全A。

连续使用2中的模型20个交易日后再次进入步骤1,并将此20个交易日数据加入训练集。

注意到由于首次训练模型时使用了1800个样本数据,因此实际的交易信号是在2014年10月27日首次给出。

2.3 AdaBoost择时模型回测结果

同样假设在换仓信号发出当日收盘时进行交易且无交易成本,我们给出AdaBoost择时模型多空策略和纯多头策略的表现。从下图看,多空策略表现>纯多头策略表现>简单持有策略表现。纯多头的年化收益率接近25%,收益风险比达到0.97,远远高于简单持有Wind全A指数获得的7.6%的年化收益率和0.26的收益风险比。AdaBoost模型的表现也远远优于决策树和优选决策树模型。从换手率看,纯多头策略年均交易43次,平均1周多1次,交易频率比较适中。

为了让回测结果更贴近现实,我们进一步假设在换仓信号发出次日开盘时进入新的仓位以及万分之五的交易成本。在新的假设下,我们的择时策略表现略有下降,但依然远远优于简单持有策略和优选决策树择时策略的表现。AdaBoost择时模型纯多头年化收益率依然在22%以上,收益风险比接近0.9。这进一步验证了我们AdaBoost模型择时策略的有效性和稳健性。

3

双塔奇兵择时模型

3.1 双塔奇兵择时模型介绍

由于我国上证50ETF期权数据历史较短,因此前文介绍的机器学习择时模型并没有使用期权相关的择时因子。而兴业期权水晶球择时模型通过挖掘期权市场隐含的市场预期,充分利用期权相关信息,取得了极佳的历史择时表现(关于水晶球模型的详细介绍请参考《抽丝剥茧,去芜存菁:水晶球择时模型之3.0》)。另外,水晶球择时策略收益率与AdaBoost择时策略收益率相关性较低,仅有0.02。因此我们尝试将AdaBoost择时模型与水晶球择时模型结合,形成新的双塔奇兵择时模型。

双塔奇兵择时模型的信号生成方式和回测流程如下:

水晶球择时信号在2015年6月1日首次发出,因此我们回测的时间范围为2015年6月1日至2019年8月30日。

获取水晶球择时模型多空策略信号A。

获取AdaBoost择时模型多空策略信号B。

令C=A+B。若C>0,则发出做多Wind全A的信号;若C<0,则发出做空信号;若C=0,则发出平仓信号。

3.2 水晶球择时模型用于Wind全A指数

原水晶球择时模型的标的为上证50ETF,我们给出将其发出的交易信号直接用于Wind全A指数的策略表现。假设在换仓信号发出次日开盘时进入新仓位以及万分之五的交易成本,下文给出了2015年6月1日至2019年8月30日的水晶球择时策略表现。

从下图看,水晶球择时模型表现远远优于简单持有策略。纯多头策略年化收益率达到4.58%,收益风险比达到0.24,而同期简单持有策略收益率仅为-11.18%,收益风险比为-0.38。

3.3 AdaBoost择时模型同期表现

为了便于后续比较,我们这里也给出AdaBoost择时模型在2015年6月1日至2019年8月30日的表现。同样假设在换仓信号发出次日开盘时进入新仓位以及万分之五的交易成本。从下表看,AdaBoost模型纯多头策略在2015年6月1日以来实现3.49%的年化收益率和0.14的收益风险比。其表现优于简单持有策略,但比水晶球择时模型纯多头策略4.58%的年化收益率和0.24的收益风险比略差。

3.4 双塔奇兵择时模型回测结果

最终我们给出结合AdaBoost与水晶球择时模型的双塔奇兵择时模型2015年6月1日以来的策略表现。同样假设在换仓信号发出次日开盘时进入新仓位以及万分之五的交易成本。从图表27看,双塔奇兵择时模型的纯多头策略净值曲线持续高于另外两种模型。本策略在2015年6月1日以来实现了13.16%的年化收益率,收益风险比达到0.7,不仅远优于简单持有策略,也优于水晶球和AdaBoost择时模型的表现。

4

结论

本报告试图将机器学习用于市场短期择时,先后尝试了多层决策树、优选决策树以及AdaBoost择时模型。其中,基于决策树的AdaBoost算法从理论和实证上解决了构建择时模型面临的多个问题,降低了过拟合的可能性,样本外择时表现亮眼。更值得一提的是AdaBoost择时模型的表现与基于期权市场择时的水晶球模型相关性很低,于是我们通过叠加水晶球择时模型,充分利用期权市场信息,形成了表现更加出色的双塔奇兵择时模型,大幅提高了短期择时的胜率和稳健性。

加载中...