赞
踩
卷积神经网络(CNN)是目前最为成熟的深度学习模型,是近年来人工智能蓬勃发展的重要推手之一,其主要特点是通过卷积和池化操作进行自动的特征提取和特征降维。本文首先通过原理分析给出了CNN运用于上证指数拐点的验证方法;然后使用拐点预测的结果进行大盘回测,其回测结果超过了基准得到了良好表现,本文还使用线性回归方法进行拐点预测,回测效果相比基准略差,结论是可以对大盘拐点进行预测,但是误差比较大,只能说某个时间段某个参数表现好,因为大盘的周期是变化的。
将卷积神经网络运用于大盘拐点的预测上,通过分析其工作原理,总结出以下经验:
(1)指数特征数据数据可以组织成二维的“图片”形式,这使得CNN具有了时间序列学习的能力。
(2)当卷积核作用于指数特征数据时,本质上是在进行因子合成,本文使用了三层卷积层。
(3)池化层是对因子数据的压缩和提取主要因子。
(4)因子数据在“图片”中的排列顺序会影响到CNN的学习结果。
我们构建了卷积神经网络、线性回归两个模型,在2015至2017的回测区间中分年度进行训练和测试,样本空间2000-2014上证指数数据。回测结果收益高于基准,但是存在随机性,预测误差比较大,很难使用其做交易信号。
卷积神经网络在最近几年得到了长足的发展,是人工智能研究的领头羊,目前主要应用于计算机视觉、自然语言处理等领域,是相关技术最为成熟的神经网络模型。那么卷积神经网络如何应用于上证指数拐点的预测中呢?本文将主要关注以下问题:
什么是非平稳序列?什么是非线性相关?股票价格属于什么序列?
卷积神经网络原理是什么?相比于线性回归有何不同?
如何构建训练模型?这种构建方法的内在含义是什么?
卷积神经网络的参数如何设置?模型的效果如何?
首先要明确一些概念,这样才能做到有理有据。
平稳序列 平稳序列是基本不存在趋势的序列。这类序列中的各观察值基本上在某个固定的水平上波动,虽然在不同时间段波动的程度不同,但并不存在某种规律,其波动可以看成是随机的。
非平稳序列 非平稳序列是包含趋势、季节性或周期性的序列,它可能只含有其中的一种成分,也可能是几种成分的组合。因此,非平稳序列又可以分为有趋势的序列,有趋势和季节性的序列,几种成分混合而成的复合型序列。
线性相关 线性函数即一次函数,其图像为一条直线。
非线性相关 一个系统,如果其输出不与其输入成正比,则它是非线性的。
股票价格序列是一种非线性相关、非平稳的序列。CNN模型能够抓住价格非线性的特点,使用激活函数。非平稳的趋势项和周期性需要CNN去学习。
卷积神经网络的结构模仿了眼睛的视觉神经的工作原理。对于眼睛来说,视觉神经是它和大脑沟通的桥梁,大量的视觉神经分工协作,各自负责一小部分区域的视觉图像,再将图像的各种局部特征抽象组合到高层的视觉概念,使得了人类具有了视觉认知能力。卷积神经网络也是类似,它包含了至少一层卷积层,由多个卷积核对图像的局部区域进行特征提取。我们将以经典的LeNet-5模型为例,介绍卷积神经网络的工作原理。
LeNet-5的原始输入数据(图表1中的input)为二维图像,横轴和纵轴分别是图像的高度和宽度的像素点,为了识别该图像中的字母,LeNet-5依次完成以下步骤:
第一层卷积层(图表1中的conv1)进行卷积运算。该层由若干卷积核组成,每个卷积核的参数都是通过反向传播算法优化得到的。卷积核的目的是通过扫描整张图片提取不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。在卷积层之后都会使用非线性激活函数(如RELU,tanh等)对特征进行非线性变换。
第一层池化层(图表1中的pool1)进行池化运算。通常在卷积层之后会得到维度很大的特征,池化层可以非常有效地缩小参数矩阵的尺寸,从而减少最后全连层中的参数数量。使用池化层既可以加快计算速度也有防止过拟合的作用。一般池化层将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。卷积层和池化层其实都是在对具有高维特征的图片进行特征提取和特征降维(subsample)。
第二层卷积层和第二层池化层(图表1中的conv2和pool2)进行进一步的特征提取和特征降维,得到更加高层和抽象的特征。
全连接层(图表1中的hidden4和full connection)把卷积核池化得到的特征展平为一维特征,用来进行最后的训练和预测。
从LeNet-5的步骤中我们可以看出,CNN之所以能够在计算机视觉领域中发挥越来越重要的作用,是因为其具有强大的特征提取能力,对于一块图片,人为的切割提取特征不仅对图像本身的完整性有害,而且提取的特征有限,不能捕捉到最好的切割效果,而CNN能够很好的完成这份工作,通过不同的卷积核进行特征提取,并结合池化层的降维能力,一方面不会遗漏重要的信息,另一方面数据的复杂度并没有太大的提升,可以得到相比人为提取特征更完美的结果,这也是其他神经网络所不具备的特点。
如下图表所示,为了利用CNN方便处理二维数据的特性,我们将股票因子数据组织成二维形式,涉及大盘有27个因子(考虑12个历史截面期,则对于大盘来说,可以得到一张“因子图片”,该图片对应一个t时间的相对股价位置作为标签。另外,这样的数据处理方式也很自然地利用了个股因子数据的时间序列属性。下图是输入层2D图像。
其中a表示收盘价,b表示开盘价,c表示成交量......t表示当前交易日,t-1表示上一个交易日,t-12表示前第12个交易日。通过上图的排列,能够将股票序列化的数据和因子组成一个大的包含序列特性的因子图。
特征
类别 | 特征值 |
---|---|
宏观经济 | 国内生产总值、PMI、消费者信心指数、景气指数、CPI、PPI |
货币市场 | MO、M1、M2、SHBOR、存贷款利率 |
汇率 | 美元、日元、欧元 |
外围市场 | 深圳指数、恒生指数、标普500、纳斯达克指数 |
技术指标 | MACD、KDJ |
大盘指数本身 | 日开点数、日收盘点数、日最高点数、日最低点数、日成交量、日成交金额、日MACD的BAR值、日KDJ的K/D/J指数、 5/10日均线差值、10/20日均线差值、20/30日均线差值、30/60日均线差值、5/10日成交量差值 |
回测区间:2015年-2017年
数据获取来源:Wind
我们选取27项因子,由于一些重要指标发布时间是延后的(详见下图表),因此在数据使用上一般使用上一季度或上个月的数据。本文是回归问题,需要对预测值进行标注,本文选取t时刻前后30交易日左右观察窗口,计算出当前窗口最低值和最高值,然后对这个窗口收盘价做0~1的位置转化,最终形成预测标签。
特征名称 | 发布时间 | 数据粒度 | 特征使用 |
---|---|---|---|
国内生产总值GDP | 每个季度第一个月15日发布上一季度数据,每年1月20日前后10:00发布上年数据 | 季度 | 使用上个季度数据 |
工业增加值 | 每月11日发布上月数据,3月、6月、9月、12月数据延迟,与季度GDP数据同步发布。 | 月度 | 使用上个月数据 |
采购经理指数PMI | 每月第一个工作日发布上月数据 | 月度 | 使用上个月数据 |
消费物价指数CPI | 每月9日发布上月数据,3月、6月、9月及12月数据发布延迟,与GDP数据同时发布 | 月度 | 使用上个月数据 |
生产者物价指数PPI | 每月11日发布上月数据3月、6月、9月、12月数据与季度GDP数据一起发布 | 月度 | 使用上个月数据 |
消费者信心指数 | 月度 | 使用上个月数据 | |
景气指数 | 月度 | 使用上个月数据 | |
PPI | 月度 | 使用上个月数据 | |
MO | 月度 | 使用上个月数据 | |
M1 | 月度 | 使用上个月数据 | |
M2 | 月度 | 使用上个月数据 | |
美元 | 日度 | 使用上一交易日数据 | |
日元 | 日度 | 使用上一交易日数据 | |
欧元 | 日度 | 使用上一交易日数据 | |
深圳指数 | 日度 | 使用上一交易日数据 | |
恒生指数 | 日度 | 使用上一交易日数据 | |
标普500 | 日度 | 使用上一交易日数据 | |
纳斯达克指数 | 日度 | 使用上一交易日数据 | |
MACD | 日度 | 使用上一交易日数据 | |
KDJ | 日度 | 使用上一交易日数据 | |
日开点数 | 日度 | 使用上一交易日数据 | |
日收盘点数 | 日度 | 使用上一交易日数据 | |
日最高点数 | 日度 | 使用上一交易日数据 | |
日最低点数 | 日度 | 使用上一交易日数据 | |
日成交量 | 日度 | 使用上一交易日数据 | |
日成交金额 | 日度 | 使用上一交易日数据 |
标准化:将序列化因子减去其现在的均值、除以其标准差,得到一个新的近似服从N(0, 1)分布的序列。
要使用卷积神经网络,需要提供二维的特征数据,将大盘多个截面期的因子数据组织成类似于图片的二维数据,总共27行(对应27个因子),12列(对应12个截面期),最终转化成18*18矩阵。
有时候模型的构建过程中需要检验模型,辅助模型构建,所以会将训练数据在分为两个部分:1)训练数据;2)验证数据(Validation Data)。验证数据用于负责模型的构建。典型的例子是用K-Fold Cross Validation裁剪决策树,求出最优叶节点数,防止过渡拟合(Overfitting)。
训练数据(Training Data):用于模型构建
验证数据(Validation Data):可选,用于辅助模型构建,可以重复使用。
测试数据(Test Data):用于检测模型构建,此数据只在模型检验时使用,用于评估模型的准确率。绝对不允许用于模型构建过程,否则会导致过渡拟合。
本文采用年度滚动训练方式,全体样本内外数据共分为3个阶段,如下图所示。例如预测2016年时,将2000-2015年数据合并作为样本内数据集;预测T年时,将T-16至T-1年的72个月合并作为样本内数据。验证数据在训练数据之后,防止数据在标准化时用到未来值带来影响。
使用卷积神经网络对训练集进行训练。
随机取10%样本内的数据作为验证集,在训练的同时观察卷积神经网络在验证集上的表现,当验证集上的loss达到最小时,停止训练。
确定最优参数后,在测试集上进行预测,使用训练集的标准差和均值进行数据标准化,得到预测结果。
我们以分层回测和构建选股策略的结果作为模型评价标准。
为了进行系统的对比,本文将会对比2个模型的测试结果:卷积神经网络和线性回归。其中卷积神经网络主要参数如下:
(1)输入数据:每个股票样本包含27个因子,12个历史截面期,构成18*18的“股票图片”,其标签为周期位置(0~1之间浮点数,0代表底部,1代表顶部)。
(2)卷积层:一层卷积层,包含3个3*3大小的卷积核。卷积核权重使用xavier初始化方法(一种保证激活值和梯度值方差不变的初始化方法,经实证适合于初始化卷积层)。
(3)池化层:3*3 max_pooling池化层。
(4)全连接层:2层全连接层,分别包含256、2个神经元,连接权重使用truncated_normal初始化方法(截断的正态分布初始化方法,最为常用)。
(5)Dropout率(神经元连接随机断开的比例):50%。
(6)优化器和学习速率:GradientDescentOptimizer,0.001。
(7)损失函数:均方根误差(RMSE)。
卷积神经网络结构如下图所示:
使用2000~2013年数据做训练数据,2014年数据做验证数据,2015年数据做测试数据。测试集结果如下,趋势基本相似,预测值loss较大,由于数据标准化使用2000-2013的均值和方差,特征数据用的收盘价和最高价等信息相对历史较高,导致预测结果偏离。但是从2015年下半年趋于拟合。
使用2001~2014年数据做训练数据,2015年数据做验证数据,2016年数据做测试数据。测试集结果如下,趋势拟合比之前要好很多。
使用2002~2015年数据做训练数据,2016年数据做验证数据,2017年数据做测试数据。测试集结果如下,趋势拟合最差。由于标准化使用了2015年数据,可能导致数据标准化后值很小,最终预测值也较小,这也解释了为什么2016年预测拟合度很好的原因。
下表格罗列了与标注值最相关的特征的相关性值,可以看出最相关的是技术性指标。
名称 | 开盘价 | 最高价 | 最低价 | 收盘价 | 成交额 | 成交量 |
---|---|---|---|---|---|---|
标注相关性 | 0.1195 | 0.1189 | 0.1238 | 0.1239 | 0.124 | 0.0991 |
名称 | dma-5-10 | dma-10-20 | dma-20-30 | dma-30-60 | kdj-d | kdj-j | kdj-k |
---|---|---|---|---|---|---|---|
标注相关性 | 0.3401 | 0.4149 | 0.406 | 0.1919 | 0.4952 | 0.352 | 0.4687 |
名称 | 开盘价 | 最高价 | 最低价 | 收盘价 | 成交额 | 成交量 |
---|---|---|---|---|---|---|
训练集 | 929.677054 | 942.333557 | 913.763018 | 930.155631 | 58381.0121 | 5057068580 |
2015年 | 537.892555 | 541.832426 | 515.890967 | 532.973441 | 251994.252 | 15967681700 |
2016年 | 138.067782 | 133.363246 | 139.5746 | 133.366346 | 53231.994 | 4987558510 |
2017年 | 99.1492117 | 97.6739748 | 99.1360628 | 97.6336429 | 41949.8968 | 3971366860 |
名称 | dma-5-10 | dma-10-20 | dma-20-30 | dma-30-60 | kdj-d | kdj-j | kdj-k |
---|---|---|---|---|---|---|---|
训练集 | 42.9943 | 62.1138 | 53.152 | 121.514 | 24.4231 | 39.1298 | 27.0243 |
2015年 | 95.7720 | 140.132 | 115.709 | 255.239 | 20.2853 | 37.1828 | 23.4655 |
2016年 | 40.1524 | 61.0686 | 51.6324 | 108.172 | 22.7231 | 35.3837 | 24.9494 |
2017年 | 14.8428 | 21.307 | 18.9897 | 36.7412 | 18.958 | 32.0331 | 21.2685 |
由上图可知,2016年标注差与训练数据基本相同,可以说明2016年数据与历史数据偏离程度相同,由于模型是训练数据生成的,所以拟合的是训练数据,由于2016年标准差与训练集基本相同导致拟合程度最好,2015年整体数据波动性大,标准差大,导致预测偏离较大,2017年数据标准差小,模型感知不到波动。
实验证明标准化存在问题,导致模型拟合出现比较大的差异,为了对比使用2000到2014年数据做训练数据,2015到2017年数据做测试集,预测的结果如下:
由此看来训练数据标准化很重要,并且需要剔除一些异常值,例如使用中位数剔除法剔除异常值,还可以使用一些特征的同比数据。
回测2015年~2017年的收益,基准是上证指数,交易是沪深300etf,回测结果如下图。
收益虽然超过了基准,但是主要是2016和2017沪深300etf走势趋于走强导致,2015牛市并未抓到,所以回测超基准是偶然性的。
使用2000-2014年训练数据,使用27个特征,2015-2017年做测试数据,预测效果如下:
得分是决定系数,说明预测的结果32%来自输入的参数。预测效果和卷积神经网络效果明显不同。标准化函数相同,主要区别在于卷积神经网络使用了激活函数做非线性变化,和池化层做特征图的降维和压缩以强化特征,但是这一步有可能降低最终准确度。因为我们使用的特征图的每个像素点都是已知的特征,这样操作会降低预测准确程度,降低学习血猎周期性的学习能力。所以为了验证结论,取消了池化层效果如下:
使用股票本身指标,训练模型:
使用汇率和相关股票:
使用货币和宏观经济:
使用技术指标:
卷积神经网络相比线性归回能够提取和合成特征,并且拟合性更好,从预测结果看大盘存在趋势和周期性,但是周期的时间是不确定的,导致模型在某个特定时间拟合很好,能够得到阿尔法。特别是训练数据存在异常值需要剔除,影响模型训练结果,初步认为是政策影响导致A盘数据异常,从而影响训练收敛。另外预测拐点应当使用同比增长值,而非指数或是价格,会影响数据的标准化导致模型预测N年后loss越大。
【华泰金工林晓明团队】人工智能选股之卷积神经网络——华泰人工智能系列之十五
《基于卷积神经网络的股票市场择时模型——以上证综指为例》
代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。