使用LSTM模型預測股價基於Keras

者按:本文介紹瞭如何使用LSTM模型進行時間序列預測。股票市場的數據由於格式規整和非常容易獲得,是作為研究的很好選擇。但不要把本文的結論當作理財或交易建議。

本文將通過構建用Python編寫的深度學習模型來預測未來股價走勢。

雖然預測股票的實際價格非常難,但我們可以建立模型來預測股票價格是上漲還是下跌。本文使用的數據可以在https://github.com/mwitiderrick/stockprice下載。另外,本文將不考慮諸如政治氛圍和市場環境等因素對股價的影響。。

介紹

LSTM在解決序列預測的問題時非常強大,因為它們能夠存儲之前的信息。而之前的股價對於預測股價未來走勢時很重要。

本文將通過導入NumPy庫來進行科學計算、導入Matplotlib庫來繪製圖形、以及導入Pandas庫來加載和操作數據集。

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

加載數據集

模型選擇開盤價(Open)和最高價(High)兩列。我們查看數據集的表頭,可以大致瞭解數據集的類型。

dataset_train = pd.read_csv('NSE-TATAGLOBAL.csv')
training_set = dataset_train.iloc[:, 1:2].values


Open列是股票交易的開盤價,Close列是收盤價,High列是最高價,Low列是最低價。


使用LSTM模型預測股價基於Keras



特徵歸一化

從以前使用深度學習模型的經驗來看,我們需要進行數據歸一化以獲得最佳的測試表現。本文的例子中,我們將使用Scikit- Learn的MinMaxScaler函數將數據集歸一到0到1之間。

from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_set_scaled = sc.fit_transform(training_set)

按步長創建數據

LSTM要求數據有特殊格式,通常是3D數組格式。初始按照60的步長創建數據,並通過Numpy轉化到數組中。然後,把 X_train的數據轉化到3D維度的數組中,時間步長設置為60,每一步表示一個特徵。

X_train = []
y_train = []
for i in range(60, 2035):
X_train.append(training_set_scaled[i-60:i, 0])
y_train.append(training_set_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))

構建LSTM

我們需要導入Keras的一些模型來構建LSTM

1、順序初始化神經網絡

2、添加一個緊密連接的神經網絡層

3、添加長短時記憶層(LSTM)

4、添加dropout層防止過擬合

from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout


為了防止過擬合,我們添加了LSTM層和Dropout層,其中LSTM層的參數如下:

1、50 units 表示輸出空間是50維度的單位

2、return_sequences=True 表示是返回輸出序列中的最後一個輸出,還是返回完整序列

3、input_shape 訓練集的大小

在定義Dropout層時,我們指定參數為0.2,意味著將刪除20%的層。然後,我們指定1個單元的輸出作為全連接層(Dense layer)。接著,我們使用目前流行的adam優化器編譯模型,並用均方誤差(mean_squarred_error)來計算誤差。最後,模型運行100epoch,設置batch大小為32。這個參數是根據電腦的配置來設定的,並且將耗費幾分鐘時間來完成實驗。

regressor = Sequential()
regressor.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50, return_sequences = True))
regressor.add(Dropout(0.2))
regressor.add(LSTM(units = 50))
regressor.add(Dropout(0.2))
regressor.add(Dense(units = 1))
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error')
regressor.fit(X_train, y_train, epochs = 100, batch_size = 32)

在測試集上預測股價

先導入我們要做股價預測的測試集:

dataset_test = pd.read_csv('tatatest.csv')
real_stock_price = dataset_test.iloc[:, 1:2].values


為了預測未來的股票價格,我們需要在測試集加載後做如下幾個工作:

1、在0軸上合併訓練集和測試集

2、將時間步長設置為60(如前面所介紹的)

3、使用MinMaxScaler函數轉換新數據集

4、按照前面所做的那樣重新規整數據集

在做出預測之後,我們用inverse_transform函數處理,以返回正常可讀格式的股票價格。

dataset_total = pd.concat((dataset_train['Open'], dataset_test['Open']), axis = 0)
inputs = dataset_total[len(dataset_total) - len(dataset_test) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60, 76):
X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_stock_price = regressor.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)


展示結果

最後,我們用Matplotlib庫可視化顯示真實股價和預測股價的對比。

plt.plot(real_stock_price, color = 'black', label = 'TATA Stock Price')
plt.plot(predicted_stock_price, color = 'green', label = 'Predicted TATA Stock Price')
plt.title('TATA Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('TATA Stock Price')
plt.legend()
plt.show()


使用LSTM模型預測股價基於Keras


從圖中我們可以看到,股票實際價格出現上漲時,模型也預測股價會上漲,較為吻合。這清晰地顯示了LSTMs在分析時間序列和序列數據等方面的強大作用。

結論

預測股價的方法還有很多,比如移動平均線、線性迴歸、k近鄰、ARIMA和Prophet。讀者可以自行測試這些方法的準確率,並與Keras LSTM的測試結果進行比較。


分享到:


相關文章: