MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测
MATLAB-基于長短期記憶網絡(LSTM)的SP500的股票價格預測 股價預測 matlab實戰 數據分析 數據可視化 時序數據預測 變種RNN 股票預測
摘要
近些年,隨著計算機技術的不斷發展,神經網絡在預測方面的應用愈加廣泛,尤其是長短期記憶人工神經網絡(Long Short-Term Memory,LSTM)在各領域、各學科都有應用。它是一種時間循環神經網絡,是為了解決一般的RNN(循環神經網絡)存在的長期依賴問題而專門設計出來的,非常適合處理長周期時間序列預測問題,并且預測速度快,準確度高。因此LSTM預測方法被廣泛應用在天氣預報、股票預測、行為預測等眾多領域。基于這些優點,本文采用LSTM建立預測模型,根據美國標準普爾500股票指數的歷史收盤價來預測未來收盤價的變化趨勢。
關鍵詞:LSTM長短期記憶人工神經網絡,時間序列分析,股票預測
文章目錄
- 摘要
- 第一章 前言
- 1.1 研究背景
- 1.2 研究現狀
- 1.3 研究意義
- 第二章 基本模型論述
- 2.1 LSTM模型的理論概述
- 2.2 LSTM的三個主要結構
- 2.2.1 遺忘門
- 2.2.2 輸入門
- 2.2.3 輸出門
- 2.3 改進模型
- 第三章 數據處理
- 3.1 數據讀取與可視化展示
- 3.2 數據預處理
- 3.2.1 數據分區
- 3.2.2 標準化數據
- 3.2.3 準備預測變量以及響應變量
- 3.3 訓練模型
- 3.3.1 定義 LSTM 網絡結構以及訓練選項
- 3.3.2 訓練LSTM網絡
- 3.3.3 對檢驗數據集進行標準化處理
- 3.4 模型預測
- 3.4.1 預測將來的時間步
- 3.4.2 反標準化
- 3.4.3 計算誤差指標
- 3.4.4 對檢驗數據進行可視化展示
- 3.4.5 標準化預測數據
- 3.4.6 預測將來的時間步
- 3.4.7 反標準化預測數據并獲取預測數據的真實值
- 3.4.8 對預測數據進行可視化展示
- 3.5 構建預測誤差表
- 第四章 結論
- 參考文獻
- 代碼附錄
第一章 前言
1.1 研究背景
股票市場具有高收益與高風險并存的特性,預測股市走勢一直被普通股民和投資機構所關注。股票市場是一個很復雜的動態系統,受多方面因素的影響,例如國家金融政策的調整、公司內部結構的調整以及媒體輿論的渲染。針對股票預測,人們在長期實踐和研究的基礎上總結出一套股票預測方法,并進行了基本的統計分析,但這種傳統的股票預測方法很難準確地揭示股票的變化規律。金融領域一直是機器學習算法應用較為活躍的領域,由于新的算法可能會給金融領域帶來顯著的經濟利益,在人工智能和機器學習不斷發展的背景下,金融領域的機器學習以及深度學習應用也得到了人們的關注。所以本文使用長短期記憶人工神經網絡(LSTM),一種在時間序列分析中有較好效果的深度學習模型,對美國標準普爾500股票指數的歷史數據進行分析以及預測,試圖探尋股票趨勢之間的變化規律,并對股票市場的預測效果進行探索,幫助股民以及投資機構能更好地預測股市的走勢。
1.2 研究現狀
隨著股票市場壯大,時間序列分析相應迎來崛起,時間序列的基本思想是利用序列變量與時間的關系建立統計模型來做預測。迄今為止,時間序列方法成果頗豐,相應誕生ARIMA差分整合移動自回歸模型算法、滑動平均、指數平滑法、簡單移動平均法、加權移動平均法、自回歸滑動平均、廣義自回歸條件異方差以及蒙特卡洛模擬等時間序列模型。由于股票數據這種金融時間序列對象受到多種因素的影響,往往是非平穩的、非線性的以及高噪聲的,不同于以往時間序列方法只涉及時間這個單方面影響因素,所以傳統時間序列方法往往不適合股票數據,預測性能不夠理想。而隨著互聯網與計算機技術的突破,數據存儲技術的發展,迎來大數據時代,人們從電腦端和手機端不斷地接觸到大量的數據以及信息,對于龐大的數據,如何從中獲得有用且人類想要的信息變為研究重點。由于股票市場的時效性,每天大批量數據的產生,迄今為止,股票市場已經累積了足量的歷史數據,所以我們可以很好地利用以往的歷史數據,通過分析這些數據,探尋其中的股票走勢的規律 ,但是股票的價格受到大量因素的影響,這使得股價的預測不是那么容易,但是,隨著機器學習技術的發展,使得從海量信息中挖掘出來對股票預測極其重要的信息有了一定的可能性,所以股票預測這項工作依然是具有極高的價值和意義的。
1.3 研究意義
在股票買賣過程中,如果建立了金融預測模型,我們將歷史數據灌入,學習到參數,從而對未來的股票價格進行預測。假如模型的預測價格高于當天的收盤價格,即模型告訴我們未來股票價格可能出現上漲,則我們可以繼續持倉這只股票以期獲得后續更高的投資收益;另外,情況相反時,我們可以根據模型的建議采取相反的舉措與動作。所以建立一個準確且高效的股票預測模型對于投資者更好的收益顯得非常有意義。當然,找到這種股票價格上漲下跌趨勢的規律對于國家宏觀調控和企業的經營管理也是有很高的現實價值的。股票預測研究不僅僅聚焦在技術上,技術上的突破固然重要,但是在數據的處理以及特征工程上的精益求精上往往能給股票預測模型精度帶來相當明顯的提升。所以說股票預測這項工作依然是具有極高的價值和意義的,股票市場的價格波動研究不僅有重要的學術意義,而且有重要的實際意義。這能幫助我們更好的理解和把握股票市場的運行規律,以及探尋其對真實經濟的影響機制與影響程度,能幫助我們在股票價格劇烈波動情況下選擇并實施有效的貨幣政策,這有助于減輕和消除來自股票市場的不穩定因素,從而進一步提高各國宏觀經濟的運行質量。
第二章 基本模型論述
2.1 LSTM模型的理論概述
長短期記憶神經網絡(long shortterm memory networks,LSTM)是一種時間遞歸神經網絡,是循環神經網絡的一種變體,適合處理和預測時間序列中間隔和延遲相對較長的重要事件,這一技術特征與股票預測問題有著很高的契合度,將普通循環網絡中的隱藏節點設計為自循環形式,記憶單元維持一個誤差流,進而可以記憶長時期的有效信息,避免梯度爆炸和梯度消失。LSTM 在文本預測、情感分析和股票預測等領域都有著非常優異的表現,結合股票特性將基礎數據轉換為相關的技術指標。它還改善了RNN中存在的長期依賴問題;LSTM的表現通常比時間遞歸神經網絡及隱馬爾科夫模型(HMM)更好;作為非線性模型,LSTM可作為復雜的非線性單元用于構造更大型深度神經網絡。但是仍然存在缺陷,就是RNN的梯度問題在LSTM及其變種里面得到了一定程度的解決,但還是不夠。它可以處理100個量級的序列,而對于1000個量級,或者更長的序列則依然會顯得很棘手;另一個缺點是每一個LSTM的cell里面都意味著有4個全連接層(MLP),如果LSTM的時間跨度很大,并且網絡又很深,這個計算量會很大且很耗時。
2.2 LSTM的三個主要結構
2.2.1 遺忘門
在我們 LSTM 中的第一步是決定我們會從細胞狀態中丟棄什么信息。這個決定通過一個稱為遺忘門層完成
2.2.2 輸入門
輸入門是決定讓多少新的信息加入到cell狀態中來。實現這個需要包括兩個 步驟:首先,需要sigmoid層決定哪些信息需要更新;tanh 層生成一個向量,也就是備選的用來更新的內容。在下一步,我們把這兩部分聯合起來,對cell的狀態進行一個更新。
2.2.3 輸出門
最終,我們需要確定輸出什么值。這個輸出將會基于我們的細胞狀態,但是也是一個過濾后的版本。首先,sigmoid層來確定細胞狀態的哪個部分將被輸出。接著,細胞通過 tanh 進行處理狀態并將它和sigmoid層的輸出相乘,最終會輸出我們確定輸出的那部分內容。
2.3 改進模型
LSTM模型有非常強大的功能,本文只是使用了相對簡單的單步單特征的預測,更深入研究的話可以發現,LSTM還可以進行多步單特征,單步多特征,多步多特征等更強大的預測工作。除此之外,模型進行改進的地方還可以從模型的網絡結構,訓練模型的選項,網絡層的激活函數等進行調整改進。
第三章 數據處理
3.1 數據讀取與可視化展示
首先從包含 2010 年 1月1日至 2021 年 12 月30日標準普爾 500 股票指數的開盤價、最高價、最低價、收盤價的美國標準普爾500指數歷史數據.xls的excel文件根據時間拆分成2021年6月1日之前的訓練數據TrainData.xls,2021年6月1日至12月30日的檢驗數據InspectData.xls,以及2022年1月到3月30日的預測數據TestData.xls。數據格式大致如圖所示:
將三個excel文件的NumData數值型數據的第一列的所有元素作為收盤價的數據,把TestData文本型數據的第一列的日期數據轉換成日期類型數據,為了后續讀取數據的方便,將日期以及收盤價保存到各自的mat文件中。
然后通過讀取mat文件的數據,以日期作為橫軸數據,收盤價作為縱軸數據對三個文件的整體數據做一個大致的可視化分析。訓練數據,檢驗數據,預測數據的運行結果分別如下:
從運行結果來看,SP500的收盤價趨勢除了中間幾次斷崖式暴跌之外,大致上是呈現上漲的趨勢,具體放大細看的話不難發現,股票的收盤價整體上呈現一個波動的上漲趨勢。
3.2 數據預處理
3.2.1 數據分區
緊接著,在開始預測之前,我們需要對數據進行一定的處理,首先需要把SP500的收盤價數據轉換成(1, numel(SP500)) 形狀的行數據,然后加載mat文件,用不同的變量保存訓練,檢驗,預測的數據。
3.2.2 標準化數據
為了獲得較好的擬合效果并防止訓練發散,首先通過mean方法預計std方法分別獲取訓練數據的均值以及標準差,將訓練數據通過(數據-均值)/標準差的形式標準化為具有零均值和單位方差的標準化訓練數據。在預測時,我們將使用與訓練數據相同的參數來標準化測試數據。
3.2.3 準備預測變量以及響應變量
要預測序列在將來時間步的值,需要將響應變量指定為將值移位一個steptime時間步的訓練序列。也就是說,在輸入序列的每個時間步,LSTM 網絡都學習預測下一個時間步的值。預測變量是沒有最終時間步的訓練序列。
3.3 訓練模型
3.3.1 定義 LSTM 網絡結構以及訓練選項
通過matlab提供的構建深度學習網絡的設計器,創建如圖所示的LSTM 回歸網絡。
需要注意的是,我們需要手動修改一下其中網絡層的一些參數,由于我們是單步預測,所以序列輸入層的輸入大小應該是1,將LSTM網絡設置成250個神經元,將狀態激活函數設置為tanh,將激活門函數設置為sigmoid,將輸出模式設置成sequence。將遺忘層的遺忘率設置成45%,表示將有45%的概率將神經元暫時從網絡中丟棄,以此來防止過擬合的情況發生。然后再設置一個全連接層,最后以回歸輸出的形式將數據進行輸出。
緊接著,我們需要指定訓練的選項,這里將求解器設置為 ‘adam’ 并進行 350 輪訓練。為防止梯度爆炸,將梯度閾值設置為 1。指定初始學習率為 0. 002,為防止網絡震蕩不收斂,在 150 輪訓練后通過乘以因子 0.2 來降低學習率。
3.3.2 訓練LSTM網絡
我們需要使用 trainNetwork 以指定的訓練選項訓練 LSTM 網絡,并傳入預測變量以及響應變量。
訓練的過程如圖所示,可以看到RMSE均方根誤差與Loss損失函數在剛開始下降的比較快,到后來Loss損失函數就趨近于0,RMSE均方根誤差就趨于0.1,可以從這兩個指標看出訓練的效果還是不錯的
3.3.3 對檢驗數據集進行標準化處理
我們將使用訓練數據的均值以及標準差對驗證數據進行Z-Score標準化處理,然后再取其(1,end-1)的數據作為預測的輸入數據
3.4 模型預測
3.4.1 預測將來的時間步
首先我們需要初始化網絡狀態,并先對訓練數據 XTrain 進行預測,預測將來多個時間步的值,我們需要使用 predictAndUpdateState 函數一次預測一個時間步,并在每次預測時更新網絡狀態,對于每次預測,我們使用前一次的真實值作為函數的輸入。接下來,使用訓練響應的最后一個時間步進行第一次預測。循環其余預測并將前一次預測輸入到 predictAndUpdateState。由于我們的是單步預測,所以我們將使用CPU的環境進行預測,并將 predictAndUpdateState 的ExecutionEnvironment選項設置為 cpu
3.4.2 反標準化
由于之前傳入的數據是使用了標準化處理的,所以輸出的預測值也是經過標準化后的數據,所以最終我們需要將預測的結果值反標準化,最終轉換為實際的預測值。
3.4.3 計算誤差指標
我們需要根據去標準化的預測值去計算誤差指標。對于 RMSE均方根誤差,首先我們需要先獲取到預測樣本的真實值,然后對樣本點的測量值和真實值求差,求平方后做平均運算,最后取根植,獲取到RMSE均方根誤差。對于MAE平均絕對誤差,我們需要把預測值與真實值做差,然后取絕對值后做平均處理,最后獲取到MAE平均絕對誤差。對于MAPE平均絕對百分比誤差,我們需要把預測值與真實值做差,結果除以真實值,取絕對值后做平均處理,最后獲取到MAPE平均絕對百分比誤差。
計算所得的RMSE均方根誤差結果如圖所示:
計算所得的MAE平均絕對誤差結果如圖所示:
計算所得的MAPE平均絕對百分比誤差結果如圖所示:
3.4.4 對檢驗數據進行可視化展示
對檢驗數據的可視化展示,由于訓練數據和檢驗數據是相連的,所以首先將訓練數據和檢驗數據的預測值聯合展示。
運行結果如下:
緊接著,將預測值與檢驗數據進行比較,繪制出如下的比較折線圖和誤差棉棒圖,這里僅把RMSE均方根誤差作為誤差的展示項
運行結果如下圖所示:
如上的分析以及可視化結果來看,訓練的模型對檢驗數據的擬合程度還是相當不錯的,在大致的趨勢上可以看到預測的效果與實際的效果是接近一致的,從誤差棉棒圖中也可以看出來誤差的范圍大概在(-180,100)之間,所以說整體的擬合效果是不錯的。
3.4.5 標準化預測數據
用檢驗數據檢驗了模型擬合效果后,接下來應該對預測數據做同樣的標準化處理,然后將標準化過后的數據,作為輸入數據輸入到訓練好的模型中進行預測。
3.4.6 預測將來的時間步
緊接著就需要根據XTest預測下一個時間步的值,每次預測時都需要更新網絡狀態,由于數據量不大,所以運行環境選擇cpu即可,最后循環 (預測數據長度-1)次,根據XTest的數據,預測出YTest_pred也就是2-end之間的數據
3.4.7 反標準化預測數據并獲取預測數據的真實值
由于之前的輸入數據是經過標準化的,所以獲得的預測數據也是標準化過后的數據,所以需要將預測所得的值進行反標準化處理,轉換成實際的預測值。并獲取好2-end的真實值,以方便后續的比較處理
3.4.8 對預測數據進行可視化展示
首先需要將訓練數據和檢驗數據拼接起來,繪制第一個圖形,然后在此基礎上,將預測的值用紅色的折線繪制出來,并定義好橫縱坐標,圖例的顯示設置。
可視化結果如圖所示:
緊接著需要將預測數據單獨拿出來與實際數據做一個對比,繪制出預測-實際的折線圖,并繪制二者之間的誤差棉棒圖,這里以RMSE作為表現誤差項的指標。
可視化結果如圖所示:
通過以上的預測分析可以看到,預測值與真實值之間存在一定的誤差,誤差范圍大概在[-200,200]之間,但是大致趨勢上還是吻合的。猜測誤差較大的原因就是這個時間段內,股市的波動情況太大,導致根據前向的趨勢預測后向的數據的精度有一定程度的下降,但是從整體上來看我們的預測效果還是不錯的。
3.5 構建預測誤差表
通過以上的預測結果,有表展示:
時間 真實值 模型預測值 預測誤差
2022年1月3日 4,796.56 4,796.56 0
2022年1月4日 4,793.54 4792.7681 -0.77193
2022年1月5日 4,700.58 4790.5269 89.94685
2022年1月6日 4,696.05 4756.9443 60.89434
2022年1月7日 4,677.02 4718.5068 41.48684
2022年1月10日 4,670.29 4685.3433 15.05326
2022年1月11日 4,713.07 4664.2129 -48.8571
2022年1月12日 4,726.35 4668.9238 -57.4262
2022年1月13日 4,659.02 4688.3735 29.35354
2022年1月14日 4,662.85 4687.6782 24.82822
2022年1月18日 4,577.34 4677.5229 100.183
2022年1月19日 4,532.76 4639.5654 106.8054
2022年1月20日 4,482.73 4586.6387 103.9087
2022年1月21日 4,397.93 4528.5640 130.634
2022年1月24日 4,410.13 4461.3511 51.22107
2022年1月25日 4,356.45 4415.1621 58.71211
2022年1月26日 4,349.93 4377.7480 27.81805
2022年1月27日 4,326.50 4353.9966 27.49658
2022年1月28日 4,431.85 4336.3853 -95.4647
2022年1月31日 4,515.55 4357.7056 -157.844
2022年2月1日 4,546.54 4415.2383 -131.302
2022年2月2日 4,589.32 4480.5474 -108.773
2022年2月3日 4,477.44 4540.4761 63.03608
2022年2月4日 4,500.54 4544.5249 43.9849
2022年2月7日 4,483.87 4526.2266 42.35656
2022年2月8日 4,521.54 4498.4497 -23.0903
2022年2月9日 4,587.18 4487.8281 -99.3519
2022年2月10日 4,504.06 4510.2500 6.19
2022年2月11日 4,418.64 4517.8618 99.22182
2022年2月14日 4,401.67 4489.9775 88.30754
2022年2月15日 4,471.07 4447.8252 -23.2448
2022年2月16日 4,475.01 4433.0283 -41.9817
2022年2月17日 4,380.26 4438.2500 57.99
2022年2月18日 4,348.87 4423.5049 74.63488
2022年2月22日 4,304.74 4393.5366 88.79662
2022年2月23日 4,225.50 4351.6133 126.1133
2022年2月24日 4,288.70 4293.0605 4.360547
2022年2月25日 4,384.62 4263.9351 -120.685
2022年2月28日 4,373.79 4287.3765 -86.4135
2022年3月1日 4,306.26 4326.0654 19.80543
2022年3月2日 4,386.54 4338.9795 -47.5605
2022年3月3日 4,363.49 4357.2905 -6.19947
2022年3月4日 4,328.87 4364.7124 35.8424
2022年3月7日 4,201.09 4354.0659 152.9759
2022年3月8日 4,170.62 4299.7788 129.1588
2022年3月9日 4,277.88 4232.2261 -45.6539
2022年3月10日 4,259.52 4212.3696 -47.1504
2022年3月11日 4,204.31 4218.1191 13.80914
2022年3月14日 4,173.11 4218.6426 45.53258
2022年3月15日 4,262.45 4206.0918 -56.3582
2022年3月16日 4,357.95 4216.2656 -141.684
2022年3月17日 4,411.67 4262.1948 -149.475
2022年3月18日 4,463.09 4327.2256 -135.864
2022年3月21日 4,461.18 4396.1255 -65.0545
2022年3月22日 4,511.61 4444.1680 -67.442
2022年3月23日 4,456.23 4481.2764 25.04637
2022年3月24日 4,520.16 4485.1626 -34.9974
2022年3月25日 4,543.04 4491.3242 -51.7158
2022年3月28日 4,575.52 4504.8560 -70.664
2022年3月29日 4,631.60 4528.9009 -102.699
2022年3月30日 4,602.45 4568.1245 -34.3255
第四章 結論
剛開始對時序數據的分析還是一個很懵懂的狀態,然后通過查閱資料,知道了時序分析是以分析時間序列的發展過程、方向和趨勢,預測將來時域可能達到的目標的方法。這運用了概率統計中時間序列分析原理和技術,利用時序系統的數據相關性,建立相應的數學模型,描述系統的時序狀態,以達到預測未來的效果。而適合股票預測的方法有很多種,例如移動平均法、季節系數法、指數平滑法、自回歸滑動平均模型(ARIMA)、隨機森林等等,但是在查找資料的過程中發現,長短期記憶網絡在時序數據的分析上有非常好的效果,傳統的RNN在時序數據的分析中有較好的效果,之所以會有較好的預測效果是因為在 t時間點時會將 t-1時間點的隱節點作為當前時間點的輸入,這樣有效的原因是因為之前時間點的信息也用于計算當前時間點的內容,但是傳統的RNN卻存在長期依賴以及梯度消失或爆炸的問題,而LSTM的出現正是對RNN的一種補充,他能很好地利用”門機制”來控制特征的流通和損失,這使得它能解決RNN存在的問題并保留其優秀的時序分析的能力。經過先從python股票預測的LSTM的實現,再到matlab的編程實現,其中對LSTM的實現方法以及過程都經過了深入的理解,最終實現了基于LSTM模型的股票預測。
但是依舊存在一些的不足之處,比如在模型的優化上就無從下手,由于之前都是學習計算機視覺相關的圖片識別類的深度學習課程,對于這類問題的提高精度和優化的方法更為擅長。因為是第一次接觸時序數據的分析,所以在優化方面難免有些不足。除了影響股票價格的因素眾多導致某一時間段的波動情況比較劇烈以外,模型本身還是有一些不足以及更大的優化空間的。所以在今后的學習中,我會努力學習并且深入研究深度學習中的神經網絡在金融,大數據,統計分析等方面的運用,并且探尋能提高和優化算法的方法,以達到能更好、更高效地使用模型進行實際運用和操作的目的。
參考文獻
[1] 張倩倩,林天華,祁旭陽,趙霞,基于機器學習的股票預測研究綜述[J]. 河北省科學院學報,2020, 37(04):18-19.
[2] 隋金城.基于LSTM神經網絡的股票預測研究[D].青島科技大學,2020.
[3] 周陽.基于LSTM模型的上證綜指價格預測研究[D].南京郵電大學,2019.
代碼附錄
1、數據預處理代碼
2、數據可視化代碼
3、加載數據集代碼
4、訓練數據,檢驗數據,預測數據標準化代碼
5、定義LSTM回歸網絡與訓練選項
6、初始化網絡,對檢驗數據進行預測
7、計算RMSE,MAE,MAPE三大誤差指標
8、可視化預測結果及對比代碼
9、對預測數據進行預測
10、繪制預測數據的預測結果
總結
以上是生活随笔為你收集整理的MATLAB-基于长短期记忆网络(LSTM)的SP500的股票价格预测 股价预测 matlab实战 数据分析 数据可视化 时序数据预测 变种RNN 股票预测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软开源 纸牌游戏代码_5个适用于Lin
- 下一篇: 人工智能-用matlab实现数字识别