教程 | 从零开始:如何使用LSTM预测汇率变化趋势

百家 作者:机器之心 2017-10-04 06:19:29

选自Stats and Bots

作者:Neelabh Pant

机器之心编译

参与:刘晓坤、蒋思源


在这篇文章中,我们将通过 LSTM 讨论时序预测模型,数据科学家 Neelabh Pant 也会为大家描述他利用循环神经网络预测货币兑换汇率的经验。


作为一个在美国生活的印度人,Neelabh 和家乡之间存在恒定的金钱流动。如果在市场中,美元更加强势,则印度卢比相对贬值,因此从印度购买 1 美元需要更多的卢比。如果美元相对弱势,则购买 1 美元需要的卢比会更少。


如果可以预测第二天的美元的价值,那么可以以此为参考做出更好的决策,最小化风险并最大化收益。了解到神经网络的强大,尤其是循环神经网络,Neelabh 想到了预测美元和卢比的兑换汇率的点子。


通常情况下,预测汇率有很多方法,例如:


  • 购买力平价(PPP)

  • 相对经济实力法

  • 计量经济模型

  • 时间序列模型


在这篇文章中,我们将告诉你如何利用时序分析和机器学习时序模型来预测未来的兑换汇率变化。


序列问题


我们从序列问题的讨论开始,最简单的序列机器学习问题是「一对一」问题。


One to One


在这种问题中,向模型输入一个数据或一个向量,模型会对输入生成一个预测结果。无论是回归、分类还是通过卷积网络的图像分类都属于这个类型。通过扩展这种模式,我们可以将其改造成利用过去的输入和输出进行学习的模型。


一对多问题是一对一问题的扩展,因为一对一问题的模型只有一个输入和输出。而现在模型的输出再馈送到模型作为新的输入,这样模型就会生成多个输出,下面我们将了解一对多为什么又称为循环神经网络。


One to Many


由于连接方式构成有向循环,循环神经网络可以处理序列问题。就是说,循环神经网络可以在每一次的迭代中保持网络形态不变的前提下,将输出作为下一步的输入。从编程的角度上说就像是利用确定的输入和一些隐藏变量,在固定不变的程序上保持运行。最简单的循环神经网络,将时间轴展开之后,可以看成一个全连接神经网络。


RNN Unrolled Time



在这个单变量的例子中,只包括了两个权重。权重 u 和当前输入 x_t 相乘,权重 w 和上一步输出 y_t-1 相乘。这个利用过去输出和当前输入的公式很像指数加权移动平均法(exponential weighted moving average,EWMA)。


只要将网络单元一个接一个堆叠起来,就可以轻易建立一个深度循环神经网络。简单的循环神经网络可以很好的处理短期记忆模型,但是在长时依赖项中,模型将会遇到根本的困难。


长短期记忆神经网络(Long Short-Term Neural Network)


之前说过,简单的循环神经网络无法捕捉长期依赖序列中的特征,是一个根本的困难。这个问题很重要,因为我们希望以后我们的 RNN 可以分析文本和回答问题,在这些任务中很自然的需要分析长序列的文字。


90 年代末,Sepp Hochreiter 和 Jurgen Schmidhuber 提出了 LSTM,这种模型对长期依赖性的处理要比 RNN、隐马尔可夫模型和其他序列学习方法要优秀地多。


LSTM架构


LSTM 模型将各种运算集合在一个单元中,LSTM 有一个内部状态变量,并且该状态变量可以从一个单元传递到另一个 LSTM 单元中,同时通过门运算进行修改。


1. 遗忘门



这是一个 Sigmoid 层,以 t-1 时刻的输出和 t 时刻的当前输入为参量串接到一个单张量中,加上线性变换,最后用 sigmoid 函数变换。由于 sigmoid 函数的性质,这个门的值被限定在 0 和 1 之间,该值与内态的值相乘,这也它会被叫做忘记门的原因。如果 ft=0 那么过去的内态将被忽略,如果 ft=1 那么内态将被完整的传递。


2. 输入门



输入门以过去的输出和当前输入为参量并馈送到一个 sigmoid 层。同样,这个门的输出值也是在 0 和 1 之间,输入门的值将和候选层的输出值相乘。



这个层对当前输入和过去输出应用了双曲正切函数作为变换(激活函数),结果将返回一个与内部状态相加的候选向量。


内态通过这个规则不断更新:



过去的状态和遗忘门的值相乘,然后加上输出门所给出新的候选状态。


3. 输出门



这个门控制多大比率的内部状态将被传递到输出,这和其它门的工作方式类似。


以上描述的三个门有互相独立的权重和偏置,因此,网络将分别学会,保持过去输出的概率、保持当前输入的概率以及将内态传递给输出的概率。


在一个循环神经网络中,不仅需要输入数据,还需要输入网络过去的状态。举例来说,如果我喊「嘿!我开车的时候发生了不得了的事!」这时你的大脑的一部分将把这句话分解成,「噢,Neelabh 正在给我讲一个故事,这个故事的主人公是 Neelabh 并且故事发生在路上。」然后,你需要将我刚才告诉你的话记住一部分。在接下来的故事中,你都必须随时保留部分听过的话的印象,才能逐渐明白整个故事。


另一个例子是关于是关于视频加工的,同样需要用到循环神经网络。大多数情况下,一部电影中,当前画面所描述的内容相当依赖于上一个画面的内容。经过一段时间的训练后,循环神经网络将学会保留过去画面的哪些部分和保留的比率,以及保留当前画面的多少信息,丰富的结构使其拥有比简单前馈神经网络强大得多的性能。


时间序列预测


RNN 的强大功能令我印象深刻,因此我决定使用 RNN 预测美元和卢比的兑换汇率。这个计划中使用的数据集是从 1980 年 1 月 2 日到 2017 年 8 月 10 日的兑换汇率的数据。稍后我将给出链接供你们下载和实验。


表1.数据集样本


数据集展示了 1 美元相对卢比的价值,我们一共拥有总数目为 13 730 条从 1980 年 1 月 2 日到 2017 年 8 月 10 日的数据记录。


美元对印度卢比汇率变化曲线


在这段期间,1 美元的卢比价值总体在上升。不难看到,在 2007-2008 年之间,由于经济大衰退,美国经济经历了一次重大的危机,这个图描绘了从 20 世纪末期到 21 世纪早期世界市场经济衰退的轨迹。


这段期间内,全世界的经济发展状况不是很好,特别是北美和欧洲(包括俄罗斯),都陷入了明显的衰退。不过,与此同时,很多新兴的经济体受到的冲击要小得多,特别是中国和印度,在这场灾难中,他们的经济依然得到了大幅增长。


训练集和测试集的分割


现在,为了训练模型,我们需要将数据集分成测试和训练集。在做时间序列时,以明确的日期为界限将数据集分为训练和测试两部分是很重要的。毕竟,你不会希望你的测试数据的时间排在你的训练数据之前。


在我们的实验中将定义一个日期,比如 2010 年 1 月 1 日,作为分界日期。训练数据的日期从 1980 年 1 月 2 日到 2009 年 12 月 31 日,包括大约 11 000 个数据点。


测试数据的日期从 2010 年 1 月 1 日到 2017 年 8 月 10 日,包括大约 2700 个数据点。


训练-测试


接下来要将数据集归一化,即将训练数据转换格式并将测试数据按同样的格式映射到训练数据上,这样可以避免假定知道测试数据的规模带来的影响。归一化或者数据转换意味着新变量的定义域将限定在 0 和 1 之间。


神经网络模型


一个全连接模型即将一个输入变换成一个输出的简单神经网络,它的构建就如同简单的回归模型那样通过前一天的价格预测第二天的价格。


我们以均方差作为损失函数,并使用随机梯度下降优化算法。经过足够多代的训练,将能开始寻找足够好的局部最优解。下方是全连接层性质的总结。


全连接层


经过 200 个 epoch 的训练,或者 eraly_callbacks 的出现(无论哪个先出现),这个模型就开始尝试学习数据的模式和行为。由于我们区分了训练集和测试集,现在我们可以预测测试数据集并和真实值比较。


真值(蓝色)与预测值(橙色)对比


正如你所看到的,模型的表现并不好。基本上它只是重复过去的值,只有轻微的变化。全连接网络无法从单一的过去值预测未来的值。接下来我们尝试循环神经网络,看看它工作的如何。


长短期记忆


我们使用的周期循环模型是一个单层序列模型,层内使用 6 个 LSTM 节点,输入的维度设为(1,1),即网络的单个输入只含一个特征值。


LSTM模型


最后一层是一个密集层,损失函数为均方误差函数,并且采用随机梯度下降作为优化器。我们将模型训练了 200 个 epoch,并采用了中断训练回调。模型的性质总结在上方展示。


LSTM预测


这个模型几乎学会了将这些年的数据完全重现,并且在一个简单的前馈神经网络的辅助下,不出现延迟。不过,它仍然低估了一些确定的观察值,模型仍然有很大的改进空间。


模型的改进


这个模型还可以做很多的改进,通过改进优化器的方法以改变模型结构的方式可以有很多种。还有另一种很重要的改进方法是来自数据流管理系统的滑动时间窗口法。


这种方法源于只有最近的数据才是最重要的观点,即可以从一年时长的数据中尝试预测下一年第一天的值。就从数据集中获取重要模式并高度依赖于过去观察值而言,滑动时间窗口法是非常有用的。


你们也可以按自己的方式尝试去改进模型,看看模型会如何应答这些变化。


数据集


我已经把数据集公布在 github 项目中,请随意下载,尽情使用吧。


GitHub 地址:https://github.com/neelabhpant/Deep-Learning-in-Python


有用的学习资源


我个人一直追随着几位我最喜欢的数据科学家,比如 Kirill Eremenko,Jose Portilla,Dan Van Boxel(更知名的是 Dan Does Data 这个名号),还有很多。他们大部分都有自己的博客并在上面讨论今天主题的各方面,如 RNN,CNN,LSTM,甚至还有最近出现的新技术,神经图灵机。


尽可能去跟进各种人工智能大会的新闻。顺便提一下,有兴趣的可以关注,Kirill Eremenko 即将带着他优秀的队伍在 San Diego 作关于机器学习,神经网络和数据科学的报告。


结论


通过学习过去行为的主要特征并区分哪些特征才是对预测未来所需,LSTM 模型确实是很强大的工具。已经有几种应用管法广泛使用了 LSTM,比如语音识别、作曲、手写字识别,甚至还有我最近研究中的对人体移动和交通运输的预测实验。


对于我们而言,LSTM 就是一个拥有自己的记忆并能像天才一样做出精准决策的模型。 


原文链接:https://blog.statsbot.co/time-series-prediction-using-recurrent-neural-networks-lstms-807fa6ca7f



本文为机器之心编译,转载请联系本公众号获得授权

✄------------------------------------------------

加入机器之心(全职记者/实习生):hr@jiqizhixin.com

投稿或寻求报道:content@jiqizhixin.com

广告&商务合作:bd@jiqizhixin.com

关注公众号:拾黑(shiheibook)了解更多

[广告]赞助链接:

四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接