购买与服务热线:400-810-0466

服务邮箱:Support@sugon.com

文章作者曲星明,天津大学大四学生,来曙光实习两个月了。且看小帅锅如何现学现用,使用LSTM预测美元汇率。成文时间:2017年08月31日。

中午拿起手机刷微博,看到这样一条消息:

什么!!!为什么突然跌下来这么多……出国党换美金伤不起啊,老爸之前换的时候没告诉我,今天看到消息心疼钱在蒸发。

要是我们能提前预知汇率的变动就好了,这样就能在汇率低的时候兑换,可以省不少钱。作为一名天津大学的工科学生,遇到问题,一定要动手去解决问题,我们要以实事求是的态度,用实验和数据说话!

那今天我们就用通俗的语言来说说,怎么才能预测汇率?

目前深度学习作为机器学习异常火爆的一个分支,其中长短时记忆网络(Long Short Term Memory Network, LSTM)模型非常适合用于时间序列预测。

通俗解释LSTM,不感兴趣的朋友可以自行跳过。(引用自http://www.dataguru.cn/article-11339-1.html)

人们的每次思考并不都是从零开始的。比如说你在阅读这篇文章时,你基于对前面的文字的理解来理解你目前阅读到的文字,而不是每读到一个文字时,都抛弃掉前面的思考,从头开始。你的记忆是有持久性的。

传统的神经网络并不能如此,这似乎是一个主要的缺点。例如,假设你在看一场电影,你想对电影里的每一个场景进行分类。传统的神经网络不能够基于前面的已分类场景来推断接下来的场景分类。

循环神经网络(RNN, Recurrent Neural Networks)解决了这个问题。我们只需要知道这种神经网络带有环,可将信息持久化。

LSTM,全称为长短时记忆网络 (Long Short Term Memory networks) ,是一种特殊的RNN,能够学习到长期依赖关系。LSTM由Hochreiter & Schmidhuber (1997)提出,许多研究者进行了一系列的工作对其改进并使之发扬光大。LSTM在许多问题上效果非常好,现在被广泛使用。

那什么是时间序列呢?又是一堆术语,熟悉或者不感兴趣的朋友可以自行跳过。

时间序列,也叫时间数列、历史复数或动态数列。它是将某种统计指标的数值,按时间先后顺序排到所形成的数列。时间序列预测法就是通过编制和分析时间序列,根据时间序列所反映出来的发展过程、方向和趋势,进行类推或延伸,借以预测下一段时间或以后若干年内可能达到的水平。其内容包括:收集与整理某种社会现象的历史资料;对这些资料进行检查鉴别,排成数列;分析时间数列,从中寻找该社会现象随时间变化而变化的规律,得出一定的模式;以此模式去预测该社会现象将来的情况。

假如我们有2000天的汇率数据,按照50天划分为一个时间序列,每隔10天取一次,这就有了(2000-50)/10 +1=196个时间序列,我们可以利用这些时间序列去预测下一个或者多个时间序列。

接下来让我们从最基本的事情开始----先让LSTM学习预测一下简单的余弦函数。


我们都知道余弦函数是很规律的周期函数,应该很好学习。首先用Matlab产生余弦函数的1900多个点,做成CSV,输入给LSTM进行学习,使用前1710个点训练,让他预测一下后190步左右的输出。也就是说,我们要通过前90%的波形,预测后面10%,现在让我们来观察一下结果。

漂亮!因为余弦波很规律啊,所以训练只用一个epoch就已经能看到预测结果和实际结果差的不多了!

那我们来试试训练50个周期,看看之后会发生什么事情!


太神奇了,LSTM学的越来越好了!可以想象,如果训练更长时间,那么输出将会和真实值基本没有差别!

看到这里大家有没有很激动呢,是不是感觉自己马上能走上发家致富的道路?(开玩笑别当真)

当然,实际情况往往不会像我们预料的怎么简单,汇率的变化是一个十分不规律、毫无周期可言的事情,但是我们并不能被他吓到,我们需要进一步实验!

我们上网下载2007年8月1日到2017年8月31日美元对人民币的汇率。共2638条数据,其格式如下:

对这些数据进行可视化

接下来我们继续搞事情!

我们需要对数据做一个微小的改变,因为余弦波是一个很规范的重复模式,但汇率数据是不规范的。为了应对这种情况,我们需要使训练/测试数据的每个n大小的窗口进行标准化。简单来讲标准化的作用就是能提升模型性能,使结果更准确一些。

好了,我们按照9:1的比例划分训练和测试集,假设现在处于2017年5月份:

我们先跑一个epoch看看结果

emmm……这也差得太多了吧,不过不要担心,毕竟我们才刚训练一轮,模型现在应该还处于欠拟合状态。接下来我们先用少量数据,进行一下玄学调参,主要是窗口长度,LSTM层神经元个数,还有dropout强度。调的差不多之后,增加迭代次数,下面我们来看结果。

我们的预测趋势和实际比较符合!但是不可避免的,也会有一些预测错误(比如在240左右,模型居然给出了相反的结论)。接下来我们需要使用全部的数据进行训练,让他去预测未来几个星期的趋势。

发家致富道路就在眼前!

但是,我们单个逐点预测上虽然与实际相当接近。但这是欺骗性的!为什么?如果你仔细看,预测线由单一的预测点组成,这些点知道他们前面的真实值。因此,网络并不依赖时间序列本身,下一个点可能不会离上一点太远。假如LSTM得到了一个错误预测的点,下一个预测可在考虑真实历史后忽略不正确的预测,并允许再次出现错误。

错误逐渐积累,我们还是得倾家荡产!

我们现在需要改变策略,去寻找是否在汇率变化中真的有一些潜在的模式,让网络预测未来的序列而不是下一个点。我们先训练一个epoch往后预测一段时间看看:

神奇!我们的预测很快就达到了收敛!证明在0这个点,我们预测汇率在未来有下降趋势。

让我们进一步研究回归收敛,将我们的预测序列限制到30,也就是一个月,然后每次将启动窗口移动50单位(每50天预测一次),先跑一个epoch试试:

可以看到预测的5条线里面只有红色的那条不太准,但是这才一个周期。接下来,我们多迭代几轮看看,并多尝试不同的参数,这应该使模型模式更准确。最后我们把预测周期缩短为每3天预测一次。

我们看到,实际上它现在只是试图预测每个时间段汇率变化的趋势。注意,这里的趋势,可以用物理上的加速度做比方。

比如说一个物体正向下运动(美元汇率下降了),但是他拥有向上的加速度(他有上升的趋势),我们知道他会做一个减速运动(美元还会跌,但是跌的慢了),但是什么时候能向上运动我们不知道(但是什么时候能涨我们不知道)。

仔细观察确实有一些点的预测趋势是错误的。但别难为模型,他就是个本科生的渣渣作品。

下面我们对最近几天放大来看看!

激动人心的时刻到了!我们的模型显示未来9天内汇率会有小幅的上涨!

不多说了,现在我要赶紧拿着数据去找我老爸,告诉他,最近美元汇率跌的厉害,这两天马上就要跌到谷底,现在是换汇的最好时机!

本文纯属作者自娱自乐,切勿盲目投资!


更多曙光相关资讯,欢迎搜索微信公众号“中科曙光/sugoncn”,关注曙光公司官方微信。

上一篇:焕然一新,启航未来丨揭秘曙光I620-G30之三:智能易用

下一篇:熬夜秒杀宝贝时页面出错是一种怎样的体验?

联系我们