深度学习RNN实现股票预测实战(附数据、代码)
背景知識(shí)
最近再看一些量化交易相關(guān)的材料,偶然在網(wǎng)上看到了一個(gè)關(guān)于用RNN實(shí)現(xiàn)股票預(yù)測(cè)的文章,出于好奇心把文章中介紹的代碼在本地跑了一遍,發(fā)現(xiàn)可以work。于是就花了兩個(gè)晚上的時(shí)間學(xué)習(xí)了下代碼,順便把核心的內(nèi)容翻譯成中文分享給大家。
?
首先講講對(duì)于股票預(yù)測(cè)的理解,股票是一種可以輕易用數(shù)字表現(xiàn)律動(dòng)的交易形式。因?yàn)榇髷?shù)定理的存在,定義了世間所有的行為都可以通過(guò)數(shù)字表示,并且存在一定的客觀規(guī)律。股票也不例外,量化交易要做的就是通過(guò)數(shù)學(xué)模型發(fā)現(xiàn)股票的走勢(shì)趨勢(shì)。“趨勢(shì)”要這樣理解:對(duì)于股票的預(yù)測(cè),不是說(shuō)我知道這個(gè)股票昨天指數(shù)是多少,然后預(yù)測(cè)今天他的指數(shù)能漲到多少。而是,我們通過(guò)過(guò)去一段時(shí)間股票的跌或者漲,總結(jié)出當(dāng)出現(xiàn)某種波動(dòng)的時(shí)候股票會(huì)有相應(yīng)的漲或者跌的趨勢(shì)。于是就引出了RNN的概念。
RNN是一種深度學(xué)習(xí)的網(wǎng)絡(luò)結(jié)構(gòu),RNN的優(yōu)勢(shì)是它在訓(xùn)練的過(guò)程中會(huì)考慮數(shù)據(jù)的上下文聯(lián)系,非常適合股票的場(chǎng)景,因?yàn)槟骋粫r(shí)刻的波動(dòng)往往跟之前的走勢(shì)蘊(yùn)含某種聯(lián)系。RNN是由一個(gè)個(gè)神經(jīng)元cell組成,然而傳統(tǒng)的RNN當(dāng)網(wǎng)絡(luò)過(guò)于復(fù)雜的時(shí)候,后方節(jié)點(diǎn)對(duì)于前方的感知力會(huì)下降,LSTM(Long-short Term Memory)是一種變型,從名字就可以看出來(lái),LSTM可以增加記憶力,解決上面提到的問(wèn)題。對(duì)于股票這個(gè)場(chǎng)景,我們就可以通過(guò)LSTM來(lái)實(shí)現(xiàn)股票的走勢(shì)的預(yù)測(cè)。
在股票這個(gè)場(chǎng)景下,通過(guò)上面這個(gè)圖可以看出來(lái),輸入的是時(shí)間t、t+1、t+2的股票信息,可以返回t+1、t+2、t+3的股票信息,而且上下節(jié)點(diǎn)前后依賴,通過(guò)LSTM模型對(duì)于這樣的股票序列進(jìn)行預(yù)測(cè),所以股票預(yù)測(cè)的關(guān)鍵就是首先構(gòu)建股票序列化數(shù)據(jù),然后訓(xùn)練LSTM模型,最終通過(guò)這個(gè)模型對(duì)于股票進(jìn)行預(yù)測(cè),以上就是大體的一些思路。
數(shù)據(jù)說(shuō)明
本次實(shí)驗(yàn)使用的是一只叫SP500的股票,可以從雅虎下載這只股從50年到現(xiàn)在每天的走勢(shì)情況,這里只需要關(guān)心每次收盤價(jià)格,也就是close字段即可。數(shù)據(jù)截圖:
代碼
代碼文件有以下四部分:
其中SP500的股票數(shù)據(jù)需要放在data文件夾下。依賴的庫(kù)包括,
numpy==1.13.1pandas==0.16.2 scikit-learn==0.16.1 scipy==0.19.1 tensorflow==1.2.1
在項(xiàng)目目錄下執(zhí)行以下shell即可開始訓(xùn)練:
python main.py --stock_symbol=SP500 --train --input_size=1 --lstm_size=128 --max_epoch=50
分別介紹下每個(gè)代碼:
data_model.py
這個(gè)文件是構(gòu)建訓(xùn)練數(shù)據(jù),通過(guò)pandas庫(kù)去讀數(shù)據(jù)SP500.csv文件,然后只取close這個(gè)字段,將每天的close數(shù)據(jù)作為代表當(dāng)天股票的市值,如下圖所示。
這里做了一次歸一化,因?yàn)楣善痹?/span>50年的市值是每股19塊左右,到了2017年漲到了2600多塊,分布很不均勻,于是通過(guò)把每天股票close值除以歷史股票最高值,將所有數(shù)據(jù)的定義域限定在0到1之間。接著構(gòu)建預(yù)測(cè)集,涉及到兩個(gè)參數(shù)input_size和num_steps,當(dāng)input_size=3 and num_steps=2時(shí)會(huì)構(gòu)建以下數(shù)據(jù)集。
第0、1、2天的股票和第3、4、5天的股票為訓(xùn)練集,第6、7、8天的股票是目標(biāo)列,就構(gòu)成了監(jiān)督學(xué)習(xí)數(shù)據(jù)。以此類推,將所有數(shù)據(jù)構(gòu)成訓(xùn)練數(shù)據(jù)集。
model_rnn.py
構(gòu)建模型的文件,通過(guò)build_graph函數(shù)去構(gòu)建整個(gè)的LSTM網(wǎng)絡(luò),同時(shí)定義最優(yōu)化求法的optimizer。通過(guò)train函數(shù)定義數(shù)據(jù)如何在graph中訓(xùn)練,包括model參數(shù)的存儲(chǔ)。plot_samples會(huì)在訓(xùn)練過(guò)程中將測(cè)試集數(shù)據(jù)和訓(xùn)練數(shù)據(jù)的比較打印成圖片輸出。
?
main.py
入口代碼,定義運(yùn)行參數(shù),包括epoch的輪數(shù)、learning_rate等等。
?
結(jié)果評(píng)估
其實(shí),在測(cè)試的時(shí)候,整個(gè)工程就將生成的預(yù)測(cè)數(shù)據(jù)和真實(shí)數(shù)據(jù)進(jìn)行比較并且在images文件夾下生成圖片。我們通過(guò)圖片直觀的可以看下隨著訓(xùn)練的進(jìn)行,是否真正可以模擬出股票曲線,首先是epoch=5的時(shí)候,也就是訓(xùn)練第5輪的時(shí)候,我們看到綠色的predict曲線和藍(lán)色的truth曲線擬合的并不好。
?
再來(lái)看下又過(guò)了40多輪訓(xùn)練生成的圖片:
我們看到股票的曲線擬合程度已經(jīng)進(jìn)步非常多,相信隨著數(shù)據(jù)和訓(xùn)練輪次的增加,預(yù)測(cè)值會(huì)越來(lái)越精確。
?PS:總結(jié)完了,建議大家想學(xué)習(xí)的自己跟一遍代碼,我自己看了2個(gè)晚上,加起來(lái)4個(gè)小時(shí)左右。我整理的代碼和數(shù)據(jù)下載鏈接在下面已經(jīng)給出。另外誰(shuí)認(rèn)識(shí)北京的做量化交易相關(guān)的同學(xué),請(qǐng)幫忙引薦,最近在工作之余自學(xué)量化交易相關(guān)的內(nèi)容,希望可以有業(yè)內(nèi)同學(xué)當(dāng)面交流一下,多謝。
參考
項(xiàng)目地址:https://github.com/lilianweng/stock-rnn
作者寫的介紹博文,很詳細(xì),學(xué)到很多:
https://lilianweng.github.io/lil-log/2017/07/08/predict-stock-prices-using-RNN-part-1.html
?另外我基于lilianweng的工作,精簡(jiǎn)了一部分代碼,并且修改了部分版本不兼容的第三方庫(kù)函數(shù),并且在工程中提供了從雅虎股票下載好的數(shù)據(jù),可以直接運(yùn)行,項(xiàng)目地址:https://github.com/jimenbian/stock-rnn
總結(jié)
以上是生活随笔為你收集整理的深度学习RNN实现股票预测实战(附数据、代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 为什么要写《机器学习实践应用》这本书
- 下一篇: 机器学习深度学习