今天,梅朵和大家分享用Python實現(xiàn)LSTM股價預(yù)測,僅用于技術(shù)學(xué)習(xí)交流,不作為投資建議。
1.導(dǎo)入依賴庫
主要是安裝相關(guān)的依賴庫。本文實現(xiàn)的環(huán)境為:python 3.7。
# 導(dǎo)入依賴庫
import sklearn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.optimizers import Adam
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
2.讀取股價數(shù)據(jù)并歸一化
讀取股價數(shù)據(jù)文件,并對數(shù)據(jù)進(jìn)行歸一化處理。
# 讀取股票價格數(shù)據(jù)
data = pd.read_csv('stock_data.csv')
prices = data['Close'].values
# 數(shù)據(jù)預(yù)處理:歸一化
scaler = MinMaxScaler()
prices = scaler.fit_transform(prices.reshape(-1, 1))
3.劃分訓(xùn)練集和測試集并確定模型輸入和輸出數(shù)據(jù)
劃分?jǐn)?shù)據(jù)的訓(xùn)練集和測試集,并確定模型輸入庫數(shù)據(jù)和輸出數(shù)據(jù)。
# 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測試集
train_size = int(len(prices) * 0.75)
train_data, test_data = prices[:train_size], prices[train_size:]
#確定模型輸入和輸出數(shù)據(jù)
in_out_length = 12
train_sequences = []
for i in range(len(train_data) - in_out_length):
train_sequences.append(train_data[i:i+in_out_length])
X_train = np.array(train_sequences)
y_train = train_data[in_out_length:]
test_sequences = []
for i in range(len(test_data) - in_out_length):
test_sequences.append(test_data[i:i+in_out_length])
X_test = np.array(test_sequences)
y_test = test_data[in_out_length:]
4.創(chuàng)建LSTM模型并訓(xùn)練模型
創(chuàng)建LSTM模型并進(jìn)行模型訓(xùn)練。
# 創(chuàng)建LSTM模型
model = Sequential()
model.add(LSTM(50, input_shape=(in_out_length, 1)))
model.add(Dense(1))
learning_rate=0.002
model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate))
# 訓(xùn)練模型
model.fit(X_train, y_train, epochs=50, batch_size=64)
3.利用LSTM模型預(yù)測股價
利用訓(xùn)練好的LSTM模型進(jìn)行預(yù)測。
# 預(yù)測未來股價
predicted_prices = model.predict(X_test)
predicted_prices = scaler.inverse_transform(predicted_prices)
y_test = scaler.inverse_transform(y_test)
完整源代碼
# 導(dǎo)入依賴庫
import sklearn
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.optimizers import Adam
from keras.models import Sequential
from keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
if __name__=='__main__':
# 讀取股票價格數(shù)據(jù)
data = pd.read_csv('stock_data.csv')
prices = data['Close'].values
# 數(shù)據(jù)預(yù)處理:歸一化
scaler = MinMaxScaler()
prices = scaler.fit_transform(prices.reshape(-1, 1))
# 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測試集
train_size = int(len(prices) * 0.75)
train_data, test_data = prices[:train_size], prices[train_size:]
#確定模型輸入和輸出數(shù)據(jù)
in_out_length = 12
train_sequences = []
for i in range(len(train_data) - in_out_length):
train_sequences.append(train_data[i:i+in_out_length])
X_train = np.array(train_sequences)
y_train = train_data[in_out_length:]
test_sequences = []
for i in range(len(test_data) - in_out_length):
test_sequences.append(test_data[i:i+in_out_length])
X_test = np.array(test_sequences)
y_test = test_data[in_out_length:]
# 創(chuàng)建LSTM模型
model = Sequential()
model.add(LSTM(50, input_shape=(in_out_length, 1)))
model.add(Dense(1))
learning_rate=0.002
model.compile(loss='mean_squared_error', optimizer=Adam(learning_rate))
# 訓(xùn)練模型
model.fit(X_train, y_train, epochs=50, batch_size=64)
# 預(yù)測未來股價
predicted_prices = model.predict(X_test)
predicted_prices = scaler.inverse_transform(predicted_prices)
y_test = scaler.inverse_transform(y_test)
# 繪制預(yù)測結(jié)果
plt.plot(y_test, label='True_Prices')
plt.plot(predicted_prices, label='Predicted_Prices')
plt.legend()
plt.xlabel('Time_Steps')
plt.ylabel('Stock_Price')
plt.title('LSTM Stock Price Prediction')
plt.show()