DeepAlpha短周期因子系列研究之:CNN在量化选股中的应用
由nolamebrand创建,最终由qxiao 被浏览 380 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发IDE(AIStudio):
https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW
新版模版策略:
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
新版数据平台:
https://bigquant.com/data/home
https://bigquant.com/wiki/doc/dai-PLSbc1SbZX
新版表达式算子:
https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS
新版因子平台:
https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5
\
目录
-
CNN模型原理介绍
- 卷积神经网络介绍
- 一维卷积神经网络
-
ResNet残差网络应用
- 残差学习单元介绍
- ResNet模型结构
- 模型比较与数据集的测试结果
-
实验&结果
- ResNet在时序数据上的应用及模型构造
- 数据准备&实验过程
- 实验步骤和回测结果
- 研究总结和展望
-
参考文献
\
CNN模型原理介绍
卷积神经网络介绍
常见的卷积神经网络在图像识别领域有着突出的表现,CNN模型可以在处理图像识别任务的时候更好的解决常规全连接神经网络带来的易过拟合、信息丢失较多、以及效率低下的问题。
以下以常见的二维图像数据为例来介绍CNN模型的主要结构:
1.输入层 Inputs Layer:
在输入层中,CNN模型和全连接神经网络的不同在于其输入的样本维度。通常,CNN模型的输入数据维度构成为(H高,W宽,C通道数),且常见的通道数比如灰度图片为1,RGB图片为3等。以一张像素为28*28的RGB图片为例,其输入模型的维度则为(28, 28, 3)。
2.卷积层 Convolution Layer:
作为整个CNN模型的核心层,卷积层涵盖了整个模型大部分的计算量。其运作的本质是将输入进去整个图片数据进行特征的提取,并且在CNN模型进行应用的时候,往往会叫我们输入一些参数进行模型的定义,这里就需要引入一些概念:
a. 卷积核数量(filters):所谓的卷积核(kernel)实质上是一种滤波器。其原理就是将卷积核以一个固定的尺寸去对整个输入的数据进行遍历计算,以得到将数据进行维度压缩(或膨胀)的效果,其计算方法是矩阵计算中的元素对应相乘A⊙B然后元素相加。然后对遍历一次之后的结果定义为Convoluted Feature,该滤波器的数量也就是所谓的Feature Map,即用卷积核去对该数据进行多少次地遍历计算就对应有多少Feature Maps
卷积核工作原理效果如下图:
b. 卷积核大小(kernel_size):根据我们对卷积核的定义可以得知我们是需要对这个卷积核的大小进行选择的。如上图就是用的55的数据和33的卷积核进行的遍历计算。我们也可以根据自己的实际数据维度和实际需要的提取效果对卷积核的大小进行相应的调整;
c. 步长(strides):顾名思义就是每一步的长度,即每个卷积核对整个数据进行遍历计算时每次移动的距离,如上图其步长为1;
d. 填充方式(padding):根据上面卷积核运作示例图可以看出,经过卷积层的输入数据和输出数据在维度上是不同的,原因是因为在用卷积核进行计算的时候最边上的维度数据会被压缩掉,这也是为什么示例中输入的55图片数据在输出的时候降维到了33的原因。所以在对于临边维度数据的时候,通常会选择向外填充和不填充的做法,对应的Tensorflow中的参数选择则是"valid"和"same",可以根据自己数据的处理需求做不同的调整。
3.池化层 Pooling Layer:
常见的池化层为MaxPooling Layer和AveragePooling Layer,其运作原理与卷积层中的卷积核很类似,只不过是将卷积核中的元素相乘求和改为了以固定的窗口大小中的元素取最大值或者取均值的计算。其意义在于将整个图像数据进行”模糊化“处理,更具有归纳总结局部特征的能力,也在应对模型过拟合的时候有着显著的意义;
4.其他层:
通常在完整的CNN模型当中也会利用到我们常见的全连接神经网络中所见到的FC层结构,通常是以保证输出维度以及防止过拟合的作用出现
一维卷积神经网络
CNN最主要应用于计算机视觉领域,通过卷积运算,从二维图像中提取特征,最终实现优秀的图像识别功能。对于这样一种优秀的算法,我们自然会思考如何将其运用到时间序列分析中。很容易想到,有两种思路:
将一维的时间序列二维化。考虑历史截面期,将每个样本的特征数据组织成二维形式,尝试构建“特征图片”。如总共有3000个样本,每个样本有10个特征,那就考虑5个截面期,每个样本整合5个截面得到一张“特征图片”,用时间数据作为图片标签。如此,可以得到3000个带时间特征的图片,然后运用二维CNN处理。这种方法的具体实现可参见华泰证券的研报《人工智能选股之卷积神经网络》
探索一维CNN在时间序列上的运用。本篇研究就是基于这个思路。如果将时间理解为图像的长或者宽,其他特征理解为一个维度,那么就可以用一维CNN进行处理。
一维卷积,也就是从序列中按照一定大小的窗口提取局部一维序列段(即子序列),然后与一个权重做点积,然后输出为新序列上的一个部分。我们还是以大小为5的时间窗口为例:
其中,在池化层的处理上,一维CNN中的一维池化层的目的也是为了对卷积的结果进行“模糊化”处理,归纳局部区域内的统计特征,并且通过降维避免过拟合。一维池化是从输入中提取一维序列段(即子序列), 然后输出其最大值(MaxPooling)或平均值(AveragePooling),降低一维输入的长度(Strides)。
ResNet残差网络应用
残差学习单元
在深度学习中,网络的深度对于模型的拟合性能是至关重要的,并且经过经验的总结,研究人员们认为网络越深越能带来理论上更好的结果。但是如下图所示,无论是训练误差还是验证误差,当模型的层数从20层提高到56层时,模型的性能是明显的降低了。
理论上层数的增加能带来模型性能的增加,但是实际上却带来了网络退化(Degradation)的问题。所谓的网络退化,实质上意味着不是所有的模型都能以同样的方式进行优化。在定位解决这种网络退化的问题上,研究人员提出了深层残差学习结构(Deep Residual Learning Framework)的概念,颠覆了大家对传统CNN的认知。
如下图所示,对于一个堆积层结构的模型,当输入为 x 时,定义咱学习得到的特征为。在经历堆积层的映射之后,学习到的特征和 x 之间会存在一定的信息的丢失,也就是上述的网络退化所导致的性能下降,从而引入残差的概念。
这里的F(x)则是我们需要去额外学习到的残差特征,因此这里我们的原始学习特征可以写为。从下图我们可以看出,残差学习实质上就是将经历过非线性堆积训练之后的残差和原始输入数据进行相加来作为整个残差块(Residual Block)的输出。其中,残差学习是相比于原始特征学习更加容易的。当残差接近0的时候,此时的残差结构就相当于做了一个近似的恒等映射,即在原始输入的基础上加上了从堆积层学习到的新特征,并且在残差学习的加入保证了整个网络的学习性能的提高,因此这个公式可以理解为带短路链接的一个FNN(FeedForward Neural Networks)
通俗来讲,深层的神经网络训练通常会带来一定的信息丢失和模型性能的降低,为了让经过深层网络之后的模型能保持训练之前的信息量和性能,将其结果和原始输入数据(或者经过简单近似恒等映射过后的原始输入数据)相加来让模型同时具有训练后和训练前的性能。
ResNet模型结构
ResNet实质上是在VGG-19的基础上进行了改良,并且引入了残差单元。在论文中,作者给出了VGG-19、34层普通堆积层网络和34层带有残差学习单元的堆积层网络的对比图。通过这张对比图我们可以直观地看到三种网络结构的差别,ResNet在普通网络结构的基础上每两层添加了一个短路链接,形成了我们上述的残差学习单元。
我们还可以在此结构的基础上,进行更深层网络模型的构建。
模型比较与数据集的测试结果
在上述最开始我们介绍到了ResNet结构的出现,来源于深层次神经网络在训练时所产生的网络退化问题。将该模型应用到ImageNet项目当中可以得到如下图结果。左图为未加入ResNet残差单元结构之前层数的不同在样本误差上的区别显现出了网络退化的情况;而右图中,在普通堆积层网络结构的基础上加入ResNet结构之后,我们可以明显看出当网络结构的层数增加之后,网络退化问题得到了很好地解决,层数越高,所学习到的特征信息越多,最后得到的样本误差也更低。
残差学习单元结构的引入,不光使得模型在层数增加上的网络退化问题得到了解决,更是让传统CNN结构的模型在对比于其他模型时的性能得到大幅提升。下图为不同的集成模型在ImageNet上的验证误差输出,可以看见ResNet的集成模型可以将验证误差降低至3.57%,而VGG和GoogleNet只能降低到最低6.66%。同样在单个模型进行训练时,152层的ResNet也能将验证误差降低至4.49%。
实验&结果
ResNet在时序数据上的应用及模型构造
CNN模型更多出现于图像识别领域当中,应用到的是二维卷积神经网络。而一维卷积网络只在NLP领域有涉及过,目前也鲜有文章和研究是将一维卷积神经网络应用到金融时序数据预测领域当中的。
然而CNN是一种便于将数据(时序数据、图像数据等)中的高维特征进行降维提取出简单特征的算法。比如,当研究者们对于当前数据中的某一片段特征较为感兴趣的时候,同时这一片段特征又与其所处位置不具备高度的相关性,这时候将一维卷积网络引入到研究当中会有意想不到的效果。一维卷积神经网络无论是在处理传感器类别的时序数据还是NLP中的文本序列任务,甚至是我们将要提到的金融时序数据中,都有其独特的一面。所以现在1D-CNN的思路在竞赛中也是越来越常见,并且效果已经逐渐赶超同类型的DNN甚至TabNet了。
其1D-CNN在金融时序数据上的应用思路,主要是在保留特征信息的前提下,前后利用两个FC层进行数据的输入和输出,先利用FC层输入并展开数据,然后Reshape成图像数据的格式,随后利用ResNet中的残差学习单元进行多层的特征抽取,最后进入到FC层中进行拼接预测。这种框架的ResNet模型在应对所有表格类型数据时都能有效地提取到有用的特征。
大致实现框架如下:
数据准备&实验过程
为了保证研究的客观性,我们采用《DeepAlpha短周期因子系列研究之一:DNN在量化选股中的应用》中同样的方法,利用量价因子预测股票未来5日的收益率。由于模型较之前的DNN更为复杂,为了保证实验运作效率,故在股票池的选择上做了变动,选取了对应回测时间段中的中证500指数成份标的。
我们和之前研究细节一样,使用了开盘价、最高价、最低价、收盘价、换手率、当日收益率、成交量这7个基础数据,在量价行情基础数据中构建了98个因子。如下表所示:
为了加快模型的训练速度,以及减少极端行情对模型的干扰,我们对数据进行了预处理。
- 缺失值处理:缺失值统一填充为0
- 标准化 首先对98个因子进行了标准化,使得因子服从正态分布。同时,由于选股可以认为是对股票的打分,因此对收益率也进行了标准化处理
- 极值处理 对标准化之后的数据进行了处理,Clip(-3, 3)
根据以上的特征和数据获取方式,我们将股票的时序数据进行两个部分的模型实验:
- 以2010年至2017年的A股中证500指数成份股数据作为训练集,以2018年至2021年9月的A股中证500指数成份股数据作为预测集,并作为基准模型 对基准模型进行参数的优化调整,进行对比择优 根据对基准模型的对比测试,选择其中较优的参数,并以每2年为训练集数据的同时以之后1年为预测集数据,从2010年开始滚动进行训练预测
并且我们在进行实验的时候,旨在探究该模型在选股方向上的性能,未在回测框架中做任何关于止盈止损以及趋势过滤等操作,逻辑即为每5天对股票池中的标的进行一次模型预测,选出得分最高的20支股票进行加权购买或者卖出。
1.基准模型
基准模型的参数主要分为以下: