长短期记忆(英语:Long Short-Term Memory,LSTM)神经网络,是一种时间递归神经网络(RNN),该网络适合于处理和预测时间序列中间隔和延迟非常长的重要事件,如股票价格预测和水文预报等。
第一步 数据获取、可视化与预处理
#************************ 导入所需的python库 **********************#
import sys
import warnings
if not sys.warnoptions:
warnings.simplefilter("ignore")
import datetime
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM
from sklearn.preprocessing import MinMaxScaler
#************************************************************************#
#此文以印度的Tata Global Beverages公司股价变动为例,该公司总部位于 #
#印度加尔各答,是塔塔集团的子公司,世界第二大茶叶制造商#和分销商 #
#股价数据下载于 Quandl 数据库。 #
#************************************************************************#
df = pd.read_csv(r'C:\Users\Feng\Desktop\NSE-TATAGLOBAL11.csv')
#********* 查看一下该公司股票信息,开盘价、最高价、收盘价等 ********#
df.head(10)
该部分将输出
股价变化信息
#*************** 将索引设置为时间格式方便后续分析 ***************#
df['Date'] = pd.to_datetime(df.Date,format='%Y-%m-%d')
df.index = df['Date']
#****************** 查看一下近五年的收盘价变动 *****************#
plt.figure(figsize=(10,5))
plt.grid()
dstart = datetime.datetime(2013,1,1)
dstop = datetime.datetime(2019,1,1)
plt.ylim(100,350)
plt.xlim(dstart,dstop)
plt.plot(df['Close'], label='Close Price history')
plt.savefig(r'C:\Users\Feng\Desktop\TaTa股价变动.png',
dpi=300, bbox_inches='tight')
股价波动图
data = df.sort_index(ascending=True, axis=0)
new_data = pd.DataFrame(index=range(0,len(df)),
columns=['Date', 'Close'])
for i in range(0,len(data)):
new_data['Date'][i] = data['Date'][i]
new_data['Close'][i] = data['Close'][i]
#******************** 设置dataframe索引 ********************#
new_data.index = new_data.Date
new_data.drop('Date', axis=1, inplace=True)
#**************** 将数据分为训练集和测试集 ****************#
dataset = new_data.values
train = dataset[0:987,:]
valid = dataset[987:,:]
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(dataset)
x_train, y_train = [], []
for i in range(60,len(train)):
x_train.append(scaled_data[i-60:i,0])
y_train.append(scaled_data[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))
第二步 创建长短期记忆神经网络
model = Sequential()
#模型为3层,前两层五十个神经元,最后一层为输出层,仅一个神经元
model.add(LSTM(units=50, return_sequences=True,
input_shape=(x_train.shape[1],1)))
model.add(LSTM(units=50))
model.add(Dense(1))
#*******编译模型,以MSE为损失函数,adam优化算法 *******#
#****** 大多数情况下adam优化速度较快,结果也很好 *******#
model.compile(loss='mean_squared_error', optimizer='adam')
#************** 将训练集带入模型,开始训练 ***************#
model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2)
#该模型训练时间约50秒
#************ 应用训练好的模型预测股票信息 ************#
inputs = new_data[len(new_data) - len(valid) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = scaler.transform(inputs)
X_test = []
for i in range(60,inputs.shape[0]):
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))
closing_price = model.predict(X_test)
closing_price = scaler.inverse_transform(closing_price)
第三步 模型预测
#***** 此行代码是为了能够在图中显示中文,否则中文将显示为方框 *****#
plt.rcParams['font.sans-serif']=['SimHei']
plt.rc('font', size=12)
train = new_data[:987]
valid = new_data[987:]
valid['Predictions'] = closing_price
plt.figure(figsize=(8,6))
plt.title("Tata Global Beverages股票收盘价预测")
plt.grid()
plt.plot(train['Close'],color="blue",label="训练集")
plt.plot(valid['Close'],color="red",label="测试集")
plt.plot(valid['Predictions'],color="orange",label="预测结果")
plt.legend()
plt.ylim(100,350)
plt.xlim(dstart,dstop)
plt.savefig(r'C:\Users\Feng\Desktop\TaTa股价预测.png',
dpi=300, bbox_inches='tight')
模型预测结果
预测结果不错。
大家也可以尝试用长短期记忆神经网络对其他的时间序列进行预测。
如果您喜欢这篇文章,希望您能花一秒时间留下您的小手印 Thanks♪(・ω・)ノ