DeepAlpha短周期因子系列研究之:TabNet在量化选股中的应用 (副本)
由small_q创建,最终由small_q 被浏览 5 用户
本文基于BigQuant平台,探索了TabNet(Google, 2020)模型在量化选股中的应用。
我们使用了A股全市场2010年到2021年的日线行情数据,抽取了98个量价因子。采用5年训练1年验证1年的方法进行了滚动回测,回测期(2015年到2021年9月)内累计收益率387.81%,年化收益率 27.57%,夏普比率 0.83。
一、前言
1.1 DeepAlpha
Deep Alpha是借鉴深度学习模型应用于金融量化投资领域的系列AI模型,包括全连接深度网络(DNN)、卷积神经网络(CNN)、长短期记忆网络(LSTM)、对抗生成网络(GAN)、ResNet、TabNet等。
1.2 深度学习的研究现状
深度学习神经网络在自然语言处理、图像处理和语音等领域取得了非常显著的效果。
CNN在图像处理任务中的特定领域应用已经达到了超过人类基准的水平,例如人脸识别、视频分析和目标检测等。
RNN在自然语言处理和语音识别的应用也非常广泛,例如Google的机器翻译、垃圾邮件识别和广告推荐等。
二、TabNet介绍
随着深度学习的发展,神经网络在文本、图像和语音等领域都取得了广泛的应用。但是,在表格数据的任务上,基于深度学习神经网络并没有取得非常显著的成效,反而是基于决策树的模型(XGBoost、LightGBM等,下文统称为DTs)取得了不错的成绩。
为什么神经网络在表格类型的数据集上表现不如DTs模型这么亮眼?主要原因在于表格类型数据的分布更加像是一个超平面的划分任务,在这类型的人物中,DTs模型的表现是更加优秀的。因此,可以通过设计神经网络的结构,让神经网络同样具有DTs的特性。
2020年,Google提出了TabNet,利用DNN构建了类决策树的DT-like blocks,使得TabNet能够同时具有DNN和DTs的优点,在多个表格类型数据集中都取得了优秀的表现。
2.1 模型结构
如图所示,TabNet是比较流行的Encoder-Decoder结构。
(a) Encoder模块,由:feature transformer, attentive transformer and feature masking构成。
(b) Decoder模块,由:feature transformer和FC构成。
(c) feature transformer
由FC→ BN → GLU这样的模块组成,其中GLU(Gated Linear Unit)是广义线性单元,其完成的变换为:
(d) attentive transformer
为每一步学习到一个mask,用于特征的选择。
核心为Sparsemax层,集中输出[0, 1]附近的数值。
图 sparsemax 对比softmax
2.2 DNN构建DT-like blocks
既然想要让DNN具有树模型的优点,那么我们首先需要构建一个与树模型具有相似决策流形的神经网络,下图是一个决策树流程的简单示例。
这个决策流程很容易理解,输入两个特征x1和 x2,决策树分别以a和b为阈值来对他们进行划分,这样就得到了图中所示的决策流形。那么我们如何用神经网络来构建出一个类似的决策流形呢?论文给出了一种方法,如下图所示。
分析一下这个神经网络的流程,输入是特征向量[x1, x2],首先分别通过两个Mask层来将x1和x2单独筛选出来,然后通过一个weight和bias都被专门设定过的全连接层,并将两个FC层的输出通过ReLU激活函数后相加起来,最后经过一个Softmax激活函数作为最终输出。如果与决策树的流程进行对比,我们可以发现其实这个神经网络的每一层都对应着决策树的相应步骤:Mask层对应的是决策树中的特征选择,这个很好理解;FC层+RelU对应阈值判断,以x1为例,通过一个特定的FC层+ReLU之后,可以保证输出的向量里面只有一个是正值,其余全为0,而这就对应着决策树的条件判断;最后将所有条件判断的结果加起来,再通过一个Softmax层得到最终的输出。 \n
2.3 TabNet的优点
TabNet的设计使用DNN的一些组件来达到树模型通过特征分裂,得到分类超平面的效果,因此在模型中引入了sparsemax来进行特征选择,引入多个Step来达到生成类似多颗树的效果。因此能够结合DNN和树模型的优点:
(1)DNN的拟合能力
众所周知,DNN可以利用海量的数据学习到非常复杂的知识,特别是在图像识别、机器翻译和语言识别等领域,基于DNN的神经网络取得的成绩已经远远超过传统的机器学习算法。
(2)DT-like的可解释性
对于传统的DNN来说,可解释性差是制约DNN在更多领域应用的一个重要难题。TabNet通过巧妙的设计,使得TabNet在拥有DNN优点的同时,获得树模型的可解释性。
2.4 数据集的测试结果
Forest Cover Type:这个数据集是一个分类任务——根据cartographic变量来对森林覆盖类型进行分类,实验的baseline采用了如XGBoost等目前主流的树模型、可以自动构造高阶特征的AutoInt、以及AutoML Tables这种用了神经网络结构搜索 (Neural Architecture Search)的强力模型(node hours的数量反映了模型的复杂性),对比结果如下:
三、实验
本文基于BigQuant人工智能量化投资平台(https://bigquant.com/),对TabNet在量化选股中的应用进行了研究。
3.1 实验方法
为了保证研究的客观性,我们采用《DeepAlpha短周期因子系列研究之一:DNN在量化选股中的应用》中同样的方法,利用量价因子预测股票未来5日的收益率。
3.2 数据准备
(1)数据
选择2010年1月1日到2021年1月1日A股全市场的日线股票数据作为训练数据,股票未来5日的收益率为训练的Label。
(2)因子
我们使用了开盘价、最高价、最低价、收盘价、换手率、当日收益率、成交量这7个基础数据,在量价行情基础数据中构建了98个因子。如下表所示:
共计98个 (7*6+21+35)
为了加快模型的训练速度,以及减少极端行情对模型的干扰,我们对数据进行了预处理。
-
缺失值处理
- 缺失值统一填充为0
-
标准化
- 首先对98个因子进行了标准化,使得因子服从正态分布。
- 同时,由于选股可以认为是对股票的打分,因此对收益率也进行了标注化处理。
-
极值处理 对标准化之后的数据进行了处理,Clip(-3, 3)。
\
3.3 模型训练
我们将2010年到2017年的数据作为训练集,2018年到2021年的数据作为验证集,进行参数搜素。
(1)基准模型
基准模型的参数为:
n_d: 8 n_a: 8 num_step: 3 lr: 2e-2 batch_size: 1024
https://bigquant.com/experimentshare/cc6bc9af04d941378b48a7a81b5ffb9e
(2)参数优化
TabNet的超参主要有:
num_d: 参数的范围{8, 16, 32, 64} num_a: 参数的范围{8, 16, 32, 64} num_step: {3, 5, 7, 9} batch_size: {256, 512, 1024, 2048} 参数 值 总收益 年化收益率 最大回撤 夏普比率 收益波动率 notebook 回测结果图 基准 {'n_d': 8, 'n_a':8, 'num_step': 3, 'batch_size': 1024}
根据验证集的表现,我们选择了以下的参数{n_a=32, n_d=32, num_step=3,batch_size=20480}进行滚动回测:
(3)因子重要性分析
TabNet最大的改进就在于神经网络也可以查看因子的重要性,为因子选择提供了依据。
2.4 回测
我们将TabNet的滚动训练的预测结果选股策略的依据,并在BigQuant进行了模拟回测。
滚动回测中,数据集划分比例为:5年训练,1年验证,1年测试。利用前5年的数据训练模型,取在验证集中表现最好的模型,在1年测试集上进行预测,滚动训练完成后,将预测的结果进行拼接回测。
策略核心思路:选择未来5日预测收益率最高的20支股票,买入并持有5日,每5天根据当日的预测结果进行换仓。
https://bigquant.com/experimentshare/b79adb59aec34c81ae4985124ce427d2
\
四、总结
我们基于BigQuant人工智能量化投资交易平台复现了Google提出的TabNet算法,探索了TabNet在量化选股中的应用可行性。利用平台的因子抽取模块,构建了98个量价因子,并进行滚动训练和回测,实现了年化27%的选股策略。
从回测得结果来看,在2015年到2021年,TabNet模型获得了比较稳定的收益表现。
未来的工作:(1)探索滚动回测周期对模型收益的影响;(2)尝试调整模型的超参数,通过增加模型的复杂度,尝试对数据进行更深层次的学习;(3)利用模型的特征重要性分析模块,挖掘更有效的因子。
Reference
- TabNet: Attentive Interpretable Tabular Learning
- From Softmax to Sparsemax: A Sparse Model of Attention and Multi-Label Classification
- https://github.com/google-research/google-research/blob/master/tabnet/tabnet_model.py
\