结合jqdata数据源的基于滤波降噪和LSTM期货量化研究

转自(https://www.joinquant.com/view/community/detail/25917)

近年来,机器学习技术发展迅速,已经在视觉图像等领域取得很大突破,同时,也有越来越多的人着眼使用机器学习方法研究金融领域的问题,本文主要基于机器学习算法对金融时间序列进行预测分析,具体步骤为,先对期货主力合约价格数据使用去噪自编码器过滤掉随机噪声波动,再用一维卷积对滤波后的数据降维,提取主要信息,再将滤波降噪后的价格数据输入到LSTM神经网络,之后将LSTM网络的输出作为全连接网络的输入,使用交叉验证的方法训练出一个可以捕捉期货价格大幅波动前的特征的模型,再通过这个模型在实时价格序列上预测价格大幅波动的可能性以及波动的方向,接下来在预测准确率较高的时刻下单交易。
本文的实证结果表明使用自编码器和卷积对金融数据滤波降噪,再结合LSTM神经网络的模型具有一定的预测效果,证明了机器学习算法确实可以发掘金融序列的内在特征规律。
模型训练数据来自jqdata
一.模型的建立
1.1 模型框架
模型的框架是这样的:获取数据后,先使用去噪自编码器滤去数据中的噪音干扰,再用卷积提取数据中的特征,由于提取出的特征序列长度较长,之后用池化操作对提取出的特征数据降维,由于原始数据序列是一个时间序列,具有时序特征,因此将降维后的数据输入LSTM神经网络提取其中的时序特征,之后LSTM神经网络会输出一组综合了前面各网络层提取到的信息和LSTM层提取的时序特征的一个100维的特征向量,将这个100维的向量接入全连接层得到预测结果再输出。
结合jqdata数据源的基于滤波降噪和LSTM期货量化研究

1.2 为什么要用CNN-LSTM
LSTM模型的提出帮助人们更好的发现序列数据中隐含的规律,同时通过前面阅读其他学者的论文发现往往结合其他方法的LSTM模型效果会更好,再由于CNN的提出极大程度的推进了计算机视觉的发展,是一个很有效的模型。
有了卷积神经网络后,通过卷积神经网络识别图像很容易就超过了之前存在的传统图像识别算法,并且在Convolutional Neural Networks for Sentence Classification这篇论文中也指出卷积神经网络不止可以处理图像,也可以用于自然语言处理,并且从作者的实验结果上看,在数个数据集上实验效果都比较好,甚至好于之前存在的分本分类方法。也就是说卷积神经网络可以有效的用于序列分析。
1.3 数据获取
该模型主要用于主力期货价格的预测分析,本文选用的数据是螺纹钢主力期货5分钟数据,使用jqdata的API接口获取过去5年时间里的开盘价,收盘价,最高价,最低价及成交量数据用于分析,之后选出大幅度波动前的360份5分钟k线数据作为训练样本,大幅波动的方向作为训练样本的标记。
1.4 数据降噪
本文中使用去噪自编码器来滤除获取的螺纹钢期货数据中的微小噪音,使得在后面的操作中,数据更加纯净,更容易提取其中隐藏的有用特征。
自编码器是一类输入与输出相等的神经网络,结构包括编码器(encoder),解码器(decoder)两部分,在训练的时候编码器和解码器是连接在一起当作一个整体训练的,去噪自编码器是对普通自编码器的一个改进,利用普通自编码器输入等于输出的特性。
二. 交易策略
最终目的是设计用来预测大涨和大跌可能性的模型。先从数据接口下载好数据后,找到大幅涨跌之前的一段历史数据,为这些数据进行简单的标准化处理后,使用去噪自编码器滤去数据中的无用噪声,之后再用卷积核提取其中的有用特征,再将数据使用池化层处理一遍,起到压缩数据和突出重点特征的作用,等到前面这部分处理数据的过程完成后,将数据放入LSTM神经网路来找出数据中的时序特征,之后,将最终的输出结果通过全连接神经网络得到分类结果,再在模型预测上涨可能性较大的时候买多,在模型预测下跌可能性较大的时候卖空,在合适的时候平仓,反复执行此操作直到回测期结束。
2.1 具体实现细节
先获取包含开盘价,收盘价,最高价,最低价,成交量在内的螺纹钢主力期货5分钟k线历史数据,再利用一个可以获取大幅涨跌之前一段固定时长数据的算法来对数据切分,取出符合要求的一部分数据,将他们作为原始样本数据,每一份样本的标记是根据这份样本所处日期后的一段时间价格波动的情况来进行标记,大涨标为1,大跌标为-1,将原始样本数据通过MinMaxScaler将其限制在0到1之间,再加入均值为0,方差为0.01的随机噪声,传入去噪自编码器里,由于输入的数据中成交量和其他三个部分数量级和代表的特征类别不同,因此再将解码器的输出分为两部分,第一部分是原先在开盘价,收盘价,最高价,最低价位置的那部分数据,第二部分是成交量数据,数据处理完成之后将两部分数据分别经过以下的卷积池化处理:
1.使用步长为1的1×2卷积核处理,再通过步长为1的1×2的池化层处理。
2.使用步长为1的1×2卷积核处理,再通过步长为1的1×2的池化层处理。
3.使用步长为1的1×2卷积核处理,再通过步长为2的1×2的池化层处理。
将得到的两部分数据使用concatenate合并起来,之后传入LSTM神经网络,再将LSTM的输出传入全连接神经网络进行分类,输出值越接近-1越表示上涨的可能性越小,越接近1代表上涨的可能性越大。
结合jqdata数据源的基于滤波降噪和LSTM期货量化研究
结合jqdata数据源的基于滤波降噪和LSTM期货量化研究

结合jqdata数据源的基于滤波降噪和LSTM期货量化研究

2.3 提高模型的训练效果
在模型搭建中,发现在训练epochs比较大的时候使用Adam优化器能够比SGD优化器带来更好的效果,误差减小的速度比SGD更快,在卷积层后面加入batch normalization层后,训练的速度也有显著的提升,在实验的过程中一开始模型训练epochs还很小的时候就出现了在训练样本集合中误差随着优化的进行不断减小,而验证集的误差却有增大的迹象,说明模型开始出现过拟合,这时在卷积核和LSTM细胞中加入了L1正则化项,并且把卷积核大小增加,LSTM细胞隐含层变量的维度也调大,还在最后输出神经元之前加入Dropout和Early stopping机制,再次重新训练,模型过拟合的现象得到缓解。
代价函数的值在训练集上的变化曲线:
结合jqdata数据源的基于滤波降噪和LSTM期货量化研究

测试集代价函数值变化情况
结合jqdata数据源的基于滤波降噪和LSTM期货量化研究

三. 模型结果
该量化交易策略主要侧重价格的预测,尝试使用更加合理的模型对价格波动进行解释及预测,在交易策略部分使用了比较简单的设置,即在模型训练好后,在预测上涨的可能性较大的时候下多单,或者在模型预测的下跌可能性较大的时候下空单,之后持有10个单位时间,并设有止损机制,若在10个单位时间之前没有达到止损线就不平仓,持有时间达到10个单位时间后再平仓,反之,提前平仓。
下图是在20180902-20190425这段时间在螺纹钢期货上回测的净值曲线:
结合jqdata数据源的基于滤波降噪和LSTM期货量化研究

可以看到一开始净值为1000000,到了回测结束的时候有1370000左右,回测期间收益达到百分之37%,并且期间的最大回撤也处于可以接受的范围,总体预测准确度达到百分之61.2%,在新数据集上的表现比前面所讲的三种对比模型都要好,且更稳定,实证了模型的有效性。由于本文主要侧重于预测模型的搭建,选用的数据只包含开盘价,收盘价,最高价,最低价,成交量这五个特征,如果需要进一步研究的话,可以在数据方面加入更多特征,来支持模型学习到更多的规则。

上一篇:读 Trajectron++: Dynamically-Feasible TrajectoryForecasting With Heterogeneous Data


下一篇:0127 python学习