解读:一种金融时间序列预测方法:基于栈式自编码器、小波变换以及LSTM的深度学习框架...

本文主要是介绍解读:一种金融时间序列预测方法:基于栈式自编码器、小波变换以及LSTM的深度学习框架...,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

写在前面

下面这篇文章的内容主要是来自发表于Plos One的一篇文章《A deep learning framework for financial time series using stacked autoencoders and long-short term memory》。这篇文章提出了一种基于深度学习技术的金融时间序列预测方法,其中,小波变换(wavelet transforms)用于对金融数据去噪,栈式自编码器用于进一步特征提取,最后,经过去噪和栈式自编码器得到的特征用于LSTM模型的训练。实验验证了提出的模型相较于其他类似模型要有更好的预测效果和盈利能力。原论文在文末进行获取。

1

摘要

金融时间序列预测通常被认为是时间序列预测中最具挑战性的问题之一,由于其中包含噪声和具有多变的特征,因此,如何准确地预测股票的走势,对于现代的一系列研究来说,仍然是一个有待解决的问题。虽然,如今已经有很多机器学习以及深度学习模型在金融时间序列有所应用,像SVR、ANNs、CNN、LSTM等,但是,考虑到金融时间序列的复杂性,将深度学习与金融市场预测相结合仍被认为是最具吸引力的课题之一。

为了解决上面的问题,在这篇文章中,作者首次将栈式编码器(Stacked Autoencoders,SAEs)方法被应用于金融市场预测中,并结合小波变换以及LSTM用于金融时间序列的预测。因此,该模型由小波变换(WT)、栈式编码器(SAEs)和长短期记忆(LSTM)三部分组成。其中,SAEs是模型的主要组成部分,用于无监督学习金融时间序列的深层特征。具体来说,SAEs是一个由多个单层自编码器组成的神经网络,其中每一层的输出特征被连接到连续层的输入。在无监督的训练中,通过最小化输出数据和输入数据之间的误差,来一次一个单层自编码器的训练。因此,SAEs模型能够成功地学习抽象特征。除此之外,小波变换是一种广泛应用的滤波和挖掘一维信号的技术,所以它被用来修复包含噪声的时间序列。最后,为了提高预测的准确性,LSTM被用于后续的模型训练。在这篇文章中,作者提出的模型简称为WSAEs-LSTM。

2

模型介绍

文章提出的one-step-ahead预测模型主要由三部分组成,分别是用于数据预处理的小波变换,用于提取抽象特征的栈式自编码器以及用于预测的LSTM,整个模型的框架如下图所示:

小波变换

由于小波变换具有处理非平稳金融时间序列数据的能力,因此本文采用小波变换进行数据去噪。与傅里叶变换相比,小波变换的关键特性是可以同时分析特定时间序列的频率分量。因此,小波在处理高度不规则的金融时间序列时很有用。

在这篇文章中,哈尔基函数(Haar basis function)被用来作为小波变换的基函数,因为它不仅能将金融时间序列分解为时域和频域,而且能显著地减少处理时间。

连续小波变换(Continuous Wavelet Transform, CWT)的系数中包含了大量的冗余信息,因此,可以通过采样的方式来减少冗余信息。将时间序列分解为一组正交分量可以得到离散小波变换(Discrete Wavelet Transform, DWT)。Mallat提出了用一对高通和低通滤波器对时间序列进行滤波,作为离散小波变换的实现。其中的两种小波被称作父小波和母小波,它们的积分分别为1和0,即:

其中,母小波描述时间序列的高频部分,而父小波描述时间序列的低频部分。进一步地,j阶的父小波和母小波的形式如下:

而金融时间序列则可以通过对父小波和母小波的一系列投影进行多级分析来重建。因此,通过正交波来近似一个段时间序列可以表示为:

其中的拓展出的系数表示为:

最后,简化的正交波近似进行如下所示:

其中,   是对原输入序列   的最粗粒度估计。   则是原序列不同分辨率下的结果,即小波在不同频段下的表现形式。在金融时间序列非常粗糙的情况下,可以反复应用离散小波变换,来降低过拟合的风险。在本文中,采用两次小波变换进行数据预处理。

栈式自编码器

最简单的单层自编码器即是一个三层的神经网络模型,如下图所示。训练单层自编码器的目的是使输入向量与重建向量之间的误差最小。


单层自编码器正向传播的第一步是将输入向量映射到隐含层,而第二步是通过将隐含向量映射到重构层来重构输入向量。这两个步骤可以表述为:

栈式自编码器则是由多个自编码器堆叠而成,下图展示了一个具有5层的栈式自编码器,其中包含了四个自编码器:

对于栈式自编码器的训练过程即是将单层自编码器变成多层,然后一层一层进行训练。其中过程是,单层自编码器映射输入的变量到第一个隐层向量,训练第一单层自编码器后,去掉第一单层自编码器的重构层,然后保留隐含层作为第二单层自编码器的输入层,然后一直重复这个过程。一般来说,后续的自编码器的输入层就是之前自编码器的隐含层。每一层使用相同的梯度下降算法进行训练。

LSTM

RNN是一种深度神经网络结构,在时间维度上具有深层结构。因此,它常被广泛应用于时间序列建模中。传统神经网络假设输入向量的所有单位都是相互独立的,因此,传统的神经网络不能很好地利用序列信息。相比之下,RNN模型增加了一个由时间序列的序列信息生成的隐藏状态,以及依赖于隐层状态的输出。通常的RNN结构如下图所示:

虽然RNN能很好地对时间序列建模,但由于梯度消失问题的存在,很难学习长期依赖关系。LSTM通过利用记忆单元来对抗消失梯度的问题。其中,记忆单元由输入门、输出门、遗忘门和自循环神经元组成。这些门控制邻近的记忆细胞和记忆细胞本身之间的相互作用,而输入信号是否能改变存储单元的状态则由输入门控制。另一方面,输出门可以通过改变记忆单元的状态来控制记忆单元的状态。此外,遗忘门则可以选择记住或忘记它的前一时刻状态。下面是LSTM和记忆单元的基本结构:

在这篇文章中,LSTM网络的架构包括隐藏层数和延迟数,延迟数指的是用于训练和测试的时候用到的过去数据的数量,即时间窗口的大小。目前,没有经验法则来选择延迟和隐藏层的数量。在本工作中,通过将隐含层数和延迟数设置为5和4。金融时间序列分为三个子集:即训练集、验证集和测试集,训练占80%,验证占10%,测试占10%。模型采用反向传播算法进行训练,以及实验对照方法用到了WLSTM(结合了小波变换和LSTM)、LSTM和RNN模型。训练批次的大小为60,批次数为5000。收敛速度由学习速率控制,学习速率是时间的递减函数,学习率初始值为0.05。

3

实验验证

这部分将介绍实验用到的数据集,和用到的数据特征以及实验结果。不同市场的市场状况可能会影响模型的潜在有效性,因此选取来自多种市场的样本数据能有助于缓解这个问题。其中,数据集用到了六种股票指数,分别是沪深300,印度Nifty 50,香港恒生指数,东京日经225指数,标准普尔500以及道琼工业指数。

数据的输入特征除了基本的价格,成交量,持仓量数据之外,还包括一些像MACD,ATR等技术指标和一些宏观变量指标,具体如下表所示:

模型的预测包括三个部分,第一个部分即是通过训练集来训练模型并更新模型参数,第二部分是通过验证集进行参数调优,第三部分则是通过测试集进行模型测试,测试时通过模型预测每个季度的表现,过程持续六年,过程如下图所示:

为了衡量预测的结果,用到了下面的预测指标:

下面是部分的预测结果:

下图直观展示了提出的模型与对比模型在六种市场中在2010.10.01到2011.09.30这段时间的预测结果:

除了通过基本的预测指标进行模型验证之外,文中还通过了一种buy-sell策略来验证模型的盈利能力。其中,当模型的预测结果大于当前值时就进行买入,低于时则进行卖出。策略的收益计算方式如下,其中,B和S表示买入和卖出的手续费。

通过上面这个规则和收益指标得到的统计结果如下表所示,可以看出提出的模型具有一定的收益能力。

4

总结

本文建立了一个基于深度学习预测框架,并对不同金融市场交易的六种股票指数进行了收盘价预测。该预测框架的构建过程如下,首先,采用Haar离散小波变换生成去噪后的时间序列;其次,通过SAEs在无监督的情况下提取深层特征;第三,LSTM被用来以监督的方式产生下一时刻的输出。输入的特征变量包括每日开高低收价格、技术指标和宏观经济变量。这项工作的主要贡献是首次尝试引入SAEs方法来提取金融时间序列的深层特征。此外,文章提出了带有一套完整模块的深度学习框架,包括去噪、深度特征提取代替传统选择以及金融时间序列拟合。在此框架下,可以将去噪、深度特征提取和时间序列拟合的几个部分采用最新的方法进行替代,从而建立新的预测模型。

参考文献:

Bao W, Yue J, Rao Y (2017) A deep learning framework for financial time series using stacked autoencoders and long-short term

memory. PLoS ONE 12(7): e0180944

关注《人工智能量化实验室》公众号,后台发送040可获取原论文。

了解更多人工智能与
量化金融知识

<-请扫码关注

让我知道你在看

这篇关于解读:一种金融时间序列预测方法:基于栈式自编码器、小波变换以及LSTM的深度学习框架...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/186828

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库