Python中TensorFlow的長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)(LSTM)、指數(shù)移動(dòng)平均法預(yù)測(cè)股票市場(chǎng)和可視化
原文鏈接:http://tecdat.cn/?p=23689?
最近我們被客戶要求撰寫關(guān)于長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)的研究報(bào)告,包括一些圖形和統(tǒng)計(jì)輸出。
本文探索Python中的長(zhǎng)短期記憶(LSTM)網(wǎng)絡(luò),以及如何使用它們來進(jìn)行股市預(yù)測(cè)?(?點(diǎn)擊文末“閱讀原文”獲取完整代碼數(shù)據(jù)********?)。
在本文中,你將看到如何使用一個(gè)被稱為長(zhǎng)短時(shí)記憶的時(shí)間序列模型。LSTM模型很強(qiáng)大,特別是在保留長(zhǎng)期記憶方面。在本文中,你將解決以下主題。
理解為什么你需要能夠預(yù)測(cè)股票價(jià)格的變動(dòng)。
下載數(shù)據(jù) - 使用從雅虎財(cái)經(jīng)收集的股市數(shù)據(jù)
分割訓(xùn)練-測(cè)試數(shù)據(jù),并進(jìn)行數(shù)據(jù)歸一化
應(yīng)用單步預(yù)測(cè)技術(shù)。
討論LSTM模型。
用當(dāng)前的數(shù)據(jù)預(yù)測(cè)和可視化未來的股票市場(chǎng)
為什么你需要時(shí)間序列模型?
你希望對(duì)股票價(jià)格進(jìn)行正確的建模,所以作為一個(gè)股票買家,你可以合理地決定何時(shí)買入股票,何時(shí)賣出股票以獲得利潤(rùn)。這就是時(shí)間序列模型的作用。你需要好的機(jī)器學(xué)習(xí)模型,它可以觀察一連串?dāng)?shù)據(jù)的歷史,并正確預(yù)測(cè)該序列的未來數(shù)據(jù)。
提示:股票市場(chǎng)的價(jià)格是高度不可預(yù)測(cè)和波動(dòng)的。這意味著數(shù)據(jù)中沒有一致的模式,使你能夠近乎完美地模擬股票價(jià)格隨時(shí)間變化。
然而,我們不要一味地認(rèn)為這只是一個(gè)隨機(jī)的或者隨機(jī)的過程,機(jī)器學(xué)習(xí)沒有希望。我們至少對(duì)數(shù)據(jù)進(jìn)行建模,做出的預(yù)測(cè)與數(shù)據(jù)的實(shí)際行為相關(guān)。換句話說,你不需要未來確切的股票價(jià)值,而是需要股票價(jià)格的變動(dòng)(也就是說,如果它在不久的將來會(huì)上漲或下跌)。
#?可用的庫(kù)
import?numpy?as?np
import?tensorflow?as?tf
下載數(shù)據(jù)
股票價(jià)格有幾種不同的變量。它們是
開盤:當(dāng)天的開盤股票價(jià)格
收盤價(jià):當(dāng)天的收盤股價(jià)
高點(diǎn):數(shù)據(jù)中最高的股票價(jià)格
低點(diǎn):當(dāng)天的最低股價(jià)
獲取數(shù)據(jù)
你要利用航空公司的股票市場(chǎng)價(jià)格來進(jìn)行預(yù)測(cè),所以你把股票代碼設(shè)置為 "AAL"。此外,你還定義了一個(gè)url_string,它將返回一個(gè)JSON文件,其中包含航空公司過去20年的所有股市數(shù)據(jù),以及一個(gè)file_to_save,它是你保存數(shù)據(jù)的文件。
接下來,指定條件:如果你還沒有保存數(shù)據(jù),從你在url_string中設(shè)置的URL中抓取數(shù)據(jù);把日期、低點(diǎn)、高點(diǎn)、成交量、收盤價(jià)、開盤價(jià)存儲(chǔ)到一個(gè)pandas DataFrame df中,把它保存到file_to_save。
????#?從URL中抓取數(shù)據(jù)
????#?將日期、低點(diǎn)、高點(diǎn)、成交量、收盤價(jià)、開盤價(jià)存儲(chǔ)到Pandas?DataFrame中
????????????#提取股票市場(chǎng)數(shù)據(jù)
????????????df?=?pd.DataFrame(columns=['Date',?'Low',?'High',?'Close',?'?Open'])??????
????????print('數(shù)據(jù)保存到:%s'%file_to_save)????????
????#?如果數(shù)據(jù)已經(jīng)存在,只需從CSV中加載即可
????否則。
????????print('文件已經(jīng)存在,從CSV中加載數(shù)據(jù)')
????????df?=?pd.read_csv(file_to_save)
數(shù)據(jù)探索
在這里你將把收集的數(shù)據(jù)輸出到DataFrame中。你還應(yīng)該確保數(shù)據(jù)是按日期排序的,因?yàn)閿?shù)據(jù)的順序在時(shí)間序列建模中至關(guān)重要。
#?按日期對(duì)數(shù)據(jù)框架進(jìn)行排序
df?=?df.sort_values('Date')
#?仔細(xì)檢查結(jié)果
df.head()
數(shù)據(jù)可視化
現(xiàn)在讓我們來看看是什么樣的數(shù)據(jù)。
plot(range(df.shape[0]),(df)/2.0)
這張圖已經(jīng)說明了很多問題。我選擇這家公司而不是其他公司的原因是,這張圖隨著時(shí)間的推移,股票價(jià)格有不同表現(xiàn)行為。這將使模型學(xué)習(xí)更加穩(wěn)健,并且給你一個(gè)價(jià)格變化來測(cè)試對(duì)各種情況的預(yù)測(cè)有多好。
另一個(gè)需要注意的是,接近2017年的數(shù)值要比接近20世紀(jì)70年代的數(shù)值高得多,而且波動(dòng)也大。因此,你需要確保數(shù)據(jù)在整個(gè)時(shí)間范圍內(nèi)表現(xiàn)為類似的價(jià)格范圍,需要將數(shù)據(jù)標(biāo)準(zhǔn)化。
點(diǎn)擊標(biāo)題查閱相關(guān)內(nèi)容
R語(yǔ)言Keras用RNN、雙向RNNs遞歸神經(jīng)網(wǎng)絡(luò)、LSTM分析預(yù)測(cè)溫度時(shí)間序列、 IMDB電影評(píng)分情感
左右滑動(dòng)查看更多
01
02
03
04
將數(shù)據(jù)分割成訓(xùn)練集和測(cè)試集
你將使用通過取一天中最高和最低價(jià)格的平均值計(jì)算出的中間價(jià)格。
現(xiàn)在你可以把訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)分開。訓(xùn)練數(shù)據(jù)將是時(shí)間序列的前4000個(gè)數(shù)據(jù)點(diǎn),其余的將是測(cè)試數(shù)據(jù)。
train_data?=?mid[:4000]
test_data?=?mid[4000:]
標(biāo)準(zhǔn)化數(shù)據(jù)
現(xiàn)在你需要定義標(biāo)準(zhǔn)化來規(guī)范數(shù)據(jù)。將訓(xùn)練和測(cè)試數(shù)據(jù)變化為[data_size, num_features]的維度。
將測(cè)試數(shù)據(jù)和訓(xùn)練數(shù)據(jù)相對(duì)于訓(xùn)練數(shù)據(jù)歸一。
scaler?=?MinMaxScaler()
由于你先前的觀察,即不同時(shí)間段的數(shù)據(jù)有不同的值范圍,通過將全序列分割成窗口來標(biāo)準(zhǔn)化數(shù)據(jù)。如果你不這樣做,早期的數(shù)據(jù)將接近于0,對(duì)學(xué)習(xí)過程不會(huì)有太大的價(jià)值。這里你選擇了一個(gè)800的窗口大小。
提示:在選擇窗口大小時(shí),不要太小,因?yàn)楫?dāng)你進(jìn)行窗口標(biāo)準(zhǔn)化時(shí),會(huì)在每個(gè)窗口的最末端引入一個(gè)斷點(diǎn),因?yàn)槊總€(gè)窗口都是獨(dú)立標(biāo)準(zhǔn)化的。
#?用訓(xùn)練數(shù)據(jù)和平滑數(shù)據(jù)訓(xùn)練
window_size?=?800
scaler.transform(train_data[di:di+window_size,:])
將數(shù)據(jù)重塑為[data_size]的形狀。
#?重塑訓(xùn)練和測(cè)試數(shù)據(jù)
reshape(-1)
#?對(duì)測(cè)試數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理
scaler.transform(test_data).reshape(-1)
現(xiàn)在你可以使用指數(shù)移動(dòng)平均線對(duì)數(shù)據(jù)進(jìn)行平滑處理。
請(qǐng)注意,你應(yīng)該只平滑訓(xùn)練數(shù)據(jù)。
#?現(xiàn)在進(jìn)行指數(shù)移動(dòng)平均平滑處理
#?所以數(shù)據(jù)會(huì)比原來的鋸齒狀數(shù)據(jù)有一個(gè)更平滑的曲線
??EMA?=?gamma*train[i]?+?(1-gamma)*EMA
??train[i]?=?EMA
通過平均法進(jìn)行單步超前預(yù)測(cè)
平均法允許你通過將未來的股票價(jià)格表示為以前觀察到的股票價(jià)格的平均值來進(jìn)行預(yù)測(cè)(通常是提前一個(gè)時(shí)間步)。下面看兩種平均技術(shù);標(biāo)準(zhǔn)平均法和指數(shù)移動(dòng)平均法。你將對(duì)這兩種算法產(chǎn)生的結(jié)果進(jìn)行定性(目測(cè))和定量(平均平方誤差)的評(píng)估。
平均平方誤差(MSE)的計(jì)算方法是:取前一步的真實(shí)值和預(yù)測(cè)值之間的平方誤差,并對(duì)所有的預(yù)測(cè)值進(jìn)行平均。
標(biāo)準(zhǔn)平均
可以通過首先嘗試將其作為一個(gè)平均計(jì)算問題的模型來理解這個(gè)問題的難度。首先,嘗試預(yù)測(cè)未來的股票市場(chǎng)價(jià)格(例如,xt+1),作為一個(gè)固定大小的窗口(例如,xt-N,...,xt)(例如之前的100天)內(nèi)先前觀察到的股票市場(chǎng)價(jià)格的平均值。此后,嘗試更高級(jí)的 "指數(shù)移動(dòng)平均 "方法,看看它的效果如何。然后,進(jìn)入長(zhǎng)短期記憶模型
首先,正常的平均數(shù)。
換句話說,你說t+1的預(yù)測(cè)是你在t到t-N的窗口內(nèi)觀察到的所有股票價(jià)格的平均值。
????pred.append(np.mean(train[idx-window_size:idx]))
????mse_errors.append((std_avg[-1]-train[pred_idx])**2)
MSE:?0.00418
看一下下面的平均結(jié)果。它與股票的實(shí)際行為相當(dāng)接近。接下來,你將看到一個(gè)更準(zhǔn)確的一步預(yù)測(cè)方法。
plt.plot(std_avg_pred)
plt.legend(fontsize=18)
plt.show()
那么,上面的圖表(和MSE)說明了什么?
似乎對(duì)于非常短的預(yù)測(cè)(提前一天)來說,這個(gè)模型還不算太差。鑒于股票價(jià)格不會(huì)在一夜之間從0變化到100,這種行為是合理的。接下來,使用指數(shù)移動(dòng)平均線。
指數(shù)移動(dòng)平均線
你可能已經(jīng)在互聯(lián)網(wǎng)上看到一些文章,使用非常復(fù)雜的模型,并預(yù)測(cè)了幾乎準(zhǔn)確的股票市場(chǎng)行為。但是請(qǐng)注意! 這些只是視覺上的錯(cuò)覺,并不是由于學(xué)到了有用的東西。你將在下面看到如何用一個(gè)簡(jiǎn)單的平均法來復(fù)制這種行為。
在指數(shù)移動(dòng)平均法中,你計(jì)算xt+1為。
其中?
?和?
?是在一段時(shí)間內(nèi)保持的指數(shù)移動(dòng)平均數(shù)值。.
上述公式基本上是計(jì)算t+1時(shí)間步長(zhǎng)的指數(shù)移動(dòng)平均線,并將其作為超前一步的預(yù)測(cè)。γ決定最近的預(yù)測(cè)對(duì)EMA的貢獻(xiàn)是什么。例如,γ=0.1只能得到當(dāng)前值的10%進(jìn)入EMA。因?yàn)槟阒蝗∽罱囊恍〔糠?,它允許保留你在平均數(shù)中很早看到的更早的值。請(qǐng)看下面用于預(yù)測(cè)向前一步的情況。
for?idx?in?range(1,N):
????mean?=?mean*dec?+?(1.0-de)*train[idx-1]
????pred.append(mean)
MSE:?0.00003
plt.plot(mid_data)
plt.plot(pred)
如果指數(shù)式移動(dòng)平均數(shù)這么好,為什么還需要更好的模型?
擬合結(jié)果很好,遵循真實(shí)的分布(并且由非常低的MSE證明)。實(shí)際上,僅憑第二天的股票市場(chǎng)價(jià)格是沒有意義的。就我個(gè)人而言,我想要的不是第二天的確切股市價(jià)格,而是未來30天的股市價(jià)格是上漲還是下跌。嘗試這樣做,你會(huì)發(fā)現(xiàn)EMA方法的缺陷。
現(xiàn)在嘗試在窗口中進(jìn)行預(yù)測(cè)(比如你預(yù)測(cè)未來2天的窗口,而不是僅僅預(yù)測(cè)未來一天)。然后你會(huì)意識(shí)到EMA會(huì)有多大的誤差。下面是一個(gè)例子。
預(yù)測(cè)超過一步的未來股價(jià)
我們假設(shè)數(shù)值,比如xt=0.4,EMA=0.5,γ=0.5
假設(shè)你得到的輸出有以下公式
所以你有?
所以?
所以下一個(gè)預(yù)測(cè)Xt+2變成了
這就是?
或者在這個(gè)例子中,?
所以,無論你對(duì)未來進(jìn)行多少步預(yù)測(cè),你都會(huì)在所有未來的預(yù)測(cè)步中不斷得到相同的答案。
你有一個(gè)解決方案,可以輸出有用的信息,就是看看基于動(dòng)量的算法。它們根據(jù)過去最近的數(shù)值是上升還是下降(不是準(zhǔn)確的數(shù)值)進(jìn)行預(yù)測(cè)。例如,它們會(huì)說第二天的價(jià)格可能會(huì)降低,如果過去幾天的價(jià)格一直在下降,這聽起來很合理。然而,我們使用一個(gè)更復(fù)雜的模型:LSTM模型。
這些模型已經(jīng)在時(shí)間序列預(yù)測(cè)領(lǐng)域非常熱門,因?yàn)樗鼈冊(cè)跁r(shí)間序列數(shù)據(jù)的建模方面非常出色。你將看到數(shù)據(jù)中是否真的隱藏有你可以利用的模式。
LSTM簡(jiǎn)介:對(duì)股票走勢(shì)進(jìn)行遠(yuǎn)期預(yù)測(cè)
長(zhǎng)短期記憶模型是極其強(qiáng)大的時(shí)間序列模型。它們可以預(yù)測(cè)未來任意步。LSTM模塊(或單元)有5個(gè)基本組成部分,使其能夠?qū)﹂L(zhǎng)期和短期數(shù)據(jù)進(jìn)行建模。
單元狀態(tài)(ct)--這代表了單元的內(nèi)部記憶,它同時(shí)存儲(chǔ)了短期記憶和長(zhǎng)期記憶
隱藏狀態(tài)(ht)--這是根據(jù)當(dāng)前輸入、以前的_隱藏狀態(tài)_和當(dāng)前的單元輸入計(jì)算出來的輸出狀態(tài)信息,你最終會(huì)用它來預(yù)測(cè)未來的股市價(jià)格。此外,隱藏狀態(tài)可以決定只檢索存儲(chǔ)在單元狀態(tài)中的短期或長(zhǎng)期或兩種類型的記憶來進(jìn)行下一次預(yù)測(cè)。
輸入門(it)--決定當(dāng)前輸入的信息有多少流向單元狀態(tài)
遺忘門(ft)--決定有多少來自當(dāng)前輸入和前一個(gè)單元狀態(tài)的信息流入當(dāng)前單元狀態(tài)
輸出門(ot)--決定多少信息從當(dāng)前單元狀態(tài)流入隱藏狀態(tài),因此,如果需要,LSTM可以只挑選長(zhǎng)期記憶或短期記憶和長(zhǎng)期記憶。
TensorFlow為實(shí)現(xiàn)時(shí)間序列模型提供了一個(gè)不錯(cuò)的API(稱為RNN API)。
數(shù)據(jù)生成器
你首先要實(shí)現(xiàn)一個(gè)數(shù)據(jù)生成器來訓(xùn)練你的模型。這個(gè)數(shù)據(jù)生成器將有一個(gè)名為.unroll_batches(...)的方法,它將輸出一組依次獲得的num_unrollings批次的輸入數(shù)據(jù),其中一個(gè)批次的數(shù)據(jù)大小為[batch_size, 1]。那么每一批輸入數(shù)據(jù)都會(huì)有一個(gè)相應(yīng)的輸出數(shù)據(jù)批。
例如,如果num_unrollings=3,batch_size=4,一組unrolled批次。
輸入數(shù)據(jù)
輸出數(shù)據(jù):
數(shù)據(jù)增強(qiáng)(Data?Augmentation)
數(shù)據(jù)增強(qiáng)(Data?Augmentation)又稱為數(shù)據(jù)增廣。另外,為了使你的模型穩(wěn)健,你不會(huì)讓x_t的輸出總是x_t+1。相反,你將從x_t+1,x_t+2,...,xt+N的集合中隨機(jī)抽取一個(gè)輸出,其中N是一個(gè)小窗口大小。
這里你要做以下假設(shè):
x_t+1,x_t+2,...,xt+N不會(huì)彼此相距很遠(yuǎn)。
我個(gè)人認(rèn)為這對(duì)股票走勢(shì)預(yù)測(cè)來說是一個(gè)合理的假設(shè)。
下面你直觀地說明一批數(shù)據(jù)是如何產(chǎn)生的。
定義超參數(shù)
在本節(jié)中,你將定義幾個(gè)超參數(shù)。D是輸入的維度。這很簡(jiǎn)單,因?yàn)槟惆阎暗墓善眱r(jià)格作為輸入,并預(yù)測(cè)下一個(gè)股票價(jià)格,這應(yīng)該是1。
然后你有num_unrollings,這是一個(gè)與用于優(yōu)化LSTM模型的通過時(shí)間的反向傳播(BPTT)有關(guān)的超參數(shù)。這表示你在一個(gè)優(yōu)化步驟中考慮多少個(gè)連續(xù)的時(shí)間步驟??梢哉J(rèn)為,不是通過查看單個(gè)時(shí)間步驟來優(yōu)化模型,而是通過查看num_unrollings時(shí)間步驟來優(yōu)化網(wǎng)絡(luò)。越大越好。
然后,你有batch_size。批量大小是指在一個(gè)時(shí)間步長(zhǎng)中考慮多少個(gè)數(shù)據(jù)樣本。
接下來你定義num_nodes,它代表每個(gè)單元中隱藏神經(jīng)元的數(shù)量。你可以看到,在這個(gè)例子中,有三層LSTMs。
D?=?1?#?數(shù)據(jù)的維度。因?yàn)槟愕臄?shù)據(jù)是一維的,所以是1
unrollings?=?50?#?未來的時(shí)間步數(shù)。
batch_size?=?500?#?一個(gè)批次中的樣本數(shù)
num_nodes?=?[200,200,150]?#?我們所使用的深層LSTM堆棧中每一層的隱藏節(jié)點(diǎn)數(shù)量
n_layers?=?len(num_nodes)?#?層的數(shù)量
dropout?=?0.2?#?丟棄量
定義輸入和輸出
接下來你要為訓(xùn)練輸入和標(biāo)簽定義占位符。你有一個(gè)輸入占位符的列表,其中每個(gè)占位符都包含一個(gè)批次的數(shù)據(jù)。而列表中有num_unrollings占位符,這些占位符將被一次性用于一個(gè)優(yōu)化步驟。
#輸入數(shù)據(jù)
train_inputs,?train_outputs?=?[],[]
定義LSTM和回歸層的參數(shù)
你將有三層LSTM和一個(gè)線性回歸層,用w和b表示,它采取最后一個(gè)長(zhǎng)短期記憶單元的輸出,并輸出下一個(gè)時(shí)間步驟的預(yù)測(cè)。此外,你可以讓dropout實(shí)現(xiàn)LSTM單元,因?yàn)樗鼈兛梢蕴岣咝阅?,減少過擬合。
計(jì)算LSTM輸出并將其傳遞到回歸層以獲得最終預(yù)測(cè)結(jié)果
在這一節(jié)中,你首先創(chuàng)建TensorFlow變量(c和h),這些變量將保持長(zhǎng)短時(shí)記憶單元的狀態(tài)和隱藏狀態(tài)。然后,你將訓(xùn)練輸入的列表轉(zhuǎn)換為[unrollings, batch_size, D]的形狀。然后用ynamic_rnn函數(shù)計(jì)算LSTM輸出,并將輸出分割成num張量列表。
#?創(chuàng)建單元格狀態(tài)和隱藏狀態(tài)變量保持LSTM的狀態(tài)
for?li?in?range(n):
??c.append(tf.Variable(tf.zeros([batch_size,?num_nodes[li]])))
??h.append(tf.Variable(tf.zeros([batch_size,?num_nodes[li]])))
#?做幾次張量轉(zhuǎn)換,因?yàn)楹瘮?shù)dynamic_rnn要求輸出必須是一種特定的格式。
損失計(jì)算和優(yōu)化器
現(xiàn)在,要計(jì)算損失。對(duì)于每一批預(yù)測(cè)和真實(shí)輸出,都要計(jì)算出平均平方誤差。而你把所有這些均方差損失加在一起(不是平均)。最后,定義你要使用的優(yōu)化器來優(yōu)化神經(jīng)網(wǎng)絡(luò)。在這種情況下,你可以使用Adam,它是一個(gè)非常新的、表現(xiàn)良好的優(yōu)化器。
#?在計(jì)算損失時(shí),你需要注意準(zhǔn)確的形式,因?yàn)槟阌?jì)算的是所有未滾動(dòng)的步的損失
#?因此,取每個(gè)批的平均誤差,并得到所有未滾動(dòng)步的總和
range(n)]):
??for?ui?in?range(nums):
????loss?+=?tf.mean(0.5*(splits[ui]-train[ui])**2)
預(yù)測(cè)相關(guān)的計(jì)算
在這里,你定義了預(yù)測(cè)相關(guān)的TensorFlow操作。首先,定義一個(gè)用于輸入的占位符(sample_inputs),然后與訓(xùn)練階段類似,你定義預(yù)測(cè)的狀態(tài)變量(sample_c和sample_h)。最后,你用dynamic_rnn函數(shù)計(jì)算預(yù)測(cè)結(jié)果,然后通過回歸層(w和b)發(fā)送輸出。你還應(yīng)該定義reset_sample_state操作,它可以重置單元狀態(tài)和隱藏狀態(tài)。
#?為預(yù)測(cè)階段保持LSTM狀態(tài)
for?li?in?range(n_layers):
??sample_c.append(tf.Variable(tf.zeros([1,?num_nodes[li]]))
??sample_h.append(tf.Variable(tf.zeros([1,?num_nodes[li]])))
運(yùn)行LSTM
在這里,你將訓(xùn)練并預(yù)測(cè)幾個(gè)歷時(shí)的股票價(jià)格走勢(shì),并觀察預(yù)測(cè)結(jié)果是否隨著時(shí)間的推移而變得更好或更差。
在時(shí)間序列上定義一個(gè)測(cè)試起點(diǎn)集(test_points_seq)來評(píng)估模型。
對(duì)于每個(gè)訓(xùn)練輪數(shù)
對(duì)于訓(xùn)練數(shù)據(jù)的完整序列長(zhǎng)度
通過迭代測(cè)試點(diǎn)之前的num_unrollings數(shù)據(jù)點(diǎn)來更新LSTM狀態(tài)
連續(xù)進(jìn)行n_predict_once步驟的預(yù)測(cè),將之前的預(yù)測(cè)作為當(dāng)前輸入。
計(jì)算預(yù)測(cè)的n_predict_once點(diǎn)與這些時(shí)間戳的真實(shí)股票價(jià)格之間的MSE損失
展開一組num_unrollings的批次
用未滾動(dòng)的批次訓(xùn)練神經(jīng)網(wǎng)絡(luò)
計(jì)算平均訓(xùn)練損失
對(duì)于測(cè)試集的每個(gè)起點(diǎn)
...
預(yù)測(cè)可視化
你可以看到MSE損失是如何隨著訓(xùn)練量的增加而下降的。這是一個(gè)好兆頭,表明模型正在學(xué)習(xí)一些有用的東西。你可以將網(wǎng)絡(luò)的MSE損失與你做標(biāo)準(zhǔn)平均時(shí)得到的MSE損失(0.004)進(jìn)行比較。你可以看到,LSTM比標(biāo)準(zhǔn)平均法做得更好。而且你知道,標(biāo)準(zhǔn)平均法(雖然不完美)合理地遵循了真實(shí)的股票價(jià)格變動(dòng)。
best_epoch?=?28?#?用得到最佳結(jié)果的epoch
#?繪制預(yù)測(cè)值隨時(shí)間變化的情況
#?繪制低α值的舊預(yù)測(cè)和高α值的新預(yù)測(cè)
????????plt.plot(xval,yval)
#?預(yù)測(cè)你得到的最佳測(cè)試預(yù)測(cè)值
plt.plot(range(df.shap),mid_data)
????plt.plot(xval,yval)
雖然不完美,但LSTM似乎能夠在大多數(shù)時(shí)候正確預(yù)測(cè)股票價(jià)格行為。請(qǐng)注意,你所做的預(yù)測(cè)大致在0和1.0的范圍內(nèi)(也就是說,不是真實(shí)的股票價(jià)格)。這沒關(guān)系,因?yàn)槟泐A(yù)測(cè)的是股票價(jià)格的走勢(shì),而不是價(jià)格本身。
總結(jié)
在本教程中,首先介紹了你為什么需要為股票價(jià)格建模的動(dòng)機(jī)。接著是解釋數(shù)據(jù)。然后兩種平均技術(shù),它們?cè)试S你對(duì)未來一步進(jìn)行預(yù)測(cè)。接下來你看到,當(dāng)你需要預(yù)測(cè)超過一步的未來時(shí),這些方法是無用的。此后,討論了如何使用LSTM來進(jìn)行未來多步的預(yù)測(cè)。最后,將結(jié)果可視化,看到模型(雖然不完美)在正確預(yù)測(cè)股票價(jià)格走勢(shì)方面相當(dāng)出色。
在這里,我陳述一下本教程的幾個(gè)收獲。
股票價(jià)格/走勢(shì)預(yù)測(cè)是一項(xiàng)極其困難的任務(wù)。我個(gè)人認(rèn)為,不應(yīng)該把任何一個(gè)股票預(yù)測(cè)模型視為理所當(dāng)然,盲目地依賴它們。然而模型可能在大多數(shù)時(shí)候能夠正確預(yù)測(cè)股票價(jià)格走勢(shì),但不總是如此。
不要被外面那些顯示預(yù)測(cè)曲線與真實(shí)股票價(jià)格完全重合的文章所迷惑。這可以用一個(gè)簡(jiǎn)單的平均技術(shù)來復(fù)制,在實(shí)踐中它是沒有用的。更明智的做法是預(yù)測(cè)股票價(jià)格的變動(dòng)。
該模型的超參數(shù)對(duì)你獲得的結(jié)果非常敏感。因此,要做的一件非常好的事情是對(duì)超參數(shù)運(yùn)行一些超參數(shù)優(yōu)化技術(shù)(例如,網(wǎng)格搜索/隨機(jī)搜索)。下面我列出了一些最關(guān)鍵的超參數(shù)
優(yōu)化器的學(xué)習(xí)率
層數(shù)和每層的隱藏單元的數(shù)量
優(yōu)化器。我發(fā)現(xiàn)Adam的表現(xiàn)最好
模型的類型。你可以嘗試GRU/標(biāo)準(zhǔn)LSTM和評(píng)估性能差異。
本文摘選?《?Python中TensorFlow的長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)(LSTM)、指數(shù)移動(dòng)平均法預(yù)測(cè)股票市場(chǎng)和可視化?》?,點(diǎn)擊“閱讀原文”獲取全文完整資料。
點(diǎn)擊標(biāo)題查閱往期內(nèi)容
RNN循環(huán)神經(jīng)網(wǎng)絡(luò) 、LSTM長(zhǎng)短期記憶網(wǎng)絡(luò)實(shí)現(xiàn)時(shí)間序列長(zhǎng)期利率預(yù)測(cè)
結(jié)合新冠疫情COVID-19股票價(jià)格預(yù)測(cè):ARIMA,KNN和神經(jīng)網(wǎng)絡(luò)時(shí)間序列分析
深度學(xué)習(xí):Keras使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類分析新聞組數(shù)據(jù)
用PyTorch機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)分類預(yù)測(cè)銀行客戶流失模型
PYTHON用LSTM長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)的參數(shù)優(yōu)化方法預(yù)測(cè)時(shí)間序列洗發(fā)水銷售數(shù)據(jù)
Python用Keras神經(jīng)網(wǎng)絡(luò)序列模型回歸擬合預(yù)測(cè)、準(zhǔn)確度檢查和結(jié)果可視化
R語(yǔ)言深度學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò) (CNN)對(duì) CIFAR 圖像進(jìn)行分類:訓(xùn)練與結(jié)果評(píng)估可視化
深度學(xué)習(xí):Keras使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類分析新聞組數(shù)據(jù)
Python用LSTM長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)對(duì)不穩(wěn)定降雨量時(shí)間序列進(jìn)行預(yù)測(cè)分析
R語(yǔ)言深度學(xué)習(xí)Keras循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)模型預(yù)測(cè)多輸出變量時(shí)間序列
R語(yǔ)言KERAS用RNN、雙向RNNS遞歸神經(jīng)網(wǎng)絡(luò)、LSTM分析預(yù)測(cè)溫度時(shí)間序列、 IMDB電影評(píng)分情感
Python用Keras神經(jīng)網(wǎng)絡(luò)序列模型回歸擬合預(yù)測(cè)、準(zhǔn)確度檢查和結(jié)果可視化
Python用LSTM長(zhǎng)短期記憶神經(jīng)網(wǎng)絡(luò)對(duì)不穩(wěn)定降雨量時(shí)間序列進(jìn)行預(yù)測(cè)分析
R語(yǔ)言中的神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)時(shí)間序列:多層感知器(MLP)和極限學(xué)習(xí)機(jī)(ELM)數(shù)據(jù)分析報(bào)告
R語(yǔ)言深度學(xué)習(xí):用keras神經(jīng)網(wǎng)絡(luò)回歸模型預(yù)測(cè)時(shí)間序列數(shù)據(jù)
Matlab用深度學(xué)習(xí)長(zhǎng)短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對(duì)文本數(shù)據(jù)進(jìn)行分類
R語(yǔ)言KERAS深度學(xué)習(xí)CNN卷積神經(jīng)網(wǎng)絡(luò)分類識(shí)別手寫數(shù)字圖像數(shù)據(jù)(MNIST)
MATLAB中用BP神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)人體脂肪百分比數(shù)據(jù)
Python中用PyTorch機(jī)器學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)分類預(yù)測(cè)銀行客戶流失模型
R語(yǔ)言實(shí)現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡(luò))模型進(jìn)行回歸數(shù)據(jù)分析
SAS使用鳶尾花(iris)數(shù)據(jù)集訓(xùn)練人工神經(jīng)網(wǎng)絡(luò)(ANN)模型
【視頻】R語(yǔ)言實(shí)現(xiàn)CNN(卷積神經(jīng)網(wǎng)絡(luò))模型進(jìn)行回歸數(shù)據(jù)分析
Python使用神經(jīng)網(wǎng)絡(luò)進(jìn)行簡(jiǎn)單文本分類
R語(yǔ)言用神經(jīng)網(wǎng)絡(luò)改進(jìn)Nelson-Siegel模型擬合收益率曲線分析
R語(yǔ)言基于遞歸神經(jīng)網(wǎng)絡(luò)RNN的溫度時(shí)間序列預(yù)測(cè)
R語(yǔ)言神經(jīng)網(wǎng)絡(luò)模型預(yù)測(cè)車輛數(shù)量時(shí)間序列
R語(yǔ)言中的BP神經(jīng)網(wǎng)絡(luò)模型分析學(xué)生成績(jī)
matlab使用長(zhǎng)短期記憶(LSTM)神經(jīng)網(wǎng)絡(luò)對(duì)序列數(shù)據(jù)進(jìn)行分類
R語(yǔ)言實(shí)現(xiàn)擬合神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)和結(jié)果可視化
用R語(yǔ)言實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)股票實(shí)例
使用PYTHON中KERAS的LSTM遞歸神經(jīng)網(wǎng)絡(luò)進(jìn)行時(shí)間序列預(yù)測(cè)
python用于NLP的seq2seq模型實(shí)例:用Keras實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)機(jī)器翻譯
用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)分類