解读:一种金融时间序列预测方法:基于栈式自编码器、小波变换以及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

相关文章

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

一文详解JavaScript中的fetch方法

《一文详解JavaScript中的fetch方法》fetch函数是一个用于在JavaScript中执行HTTP请求的现代API,它提供了一种更简洁、更强大的方式来处理网络请求,:本文主要介绍Jav... 目录前言什么是 fetch 方法基本语法简单的 GET 请求示例代码解释发送 POST 请求示例代码解释

Feign Client超时时间设置不生效的解决方法

《FeignClient超时时间设置不生效的解决方法》这篇文章主要为大家详细介绍了FeignClient超时时间设置不生效的原因与解决方法,具有一定的的参考价值,希望对大家有一定的帮助... 在使用Feign Client时,可以通过两种方式来设置超时时间:1.针对整个Feign Client设置超时时间

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex