登錄
微信登錄
打開手機微信,掃描二維碼
掃描成功
請勿刷新本頁面,按手機提示操作
中科曙光不會以任何理由要求您轉賬匯款,謹防詐騙
您的微信還未注冊
中科曙光不會以任何理由要求您轉賬匯款,謹防詐騙
您可以同時關注中科曙光微信公眾號
使用微信掃一掃即可登錄! 查閱資料更方便、 快捷!
您已經注冊賬號和
關注微信公眾號
2025年1月
服務熱線:400-810-0466
發布時間: 2017-09-05
文章作者曲星明,天津大學大四學生,來曙光實習兩個月了。且看小帥鍋如何現學現用,使用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”,關注曙光公司官方微信。