如何预测股票分析--长短期记忆网络(LSTM)

上一篇中,我们回顾了先知的方法,但是在这个案例中表现也不是特别突出,今天介绍的是著名的l s t m算法,在时间序列中解决了传统r n n算法梯度消失问题的的它这一次还会有令人杰出的表现吗?

 

长短期记忆(Long Short-Term Memory) 是具有长期记忆能力的一种时间递归神经网络(Recurrent Neural Network)。 其网络结构含有一个或多个具有可遗忘和记忆功能的单元组成。它在1997年被提出用于解决传统RNN(Recurrent Neural Network) 的随时间反向传播中权重消失的问题(vanishing gradient problem over backpropagation-through-time),重要组成部分包括Forget Gate, Input Gate, 和 Output Gate, 分别负责决定当前输入是否被采纳,是否被长期记忆以及决定在记忆中的输入是否在当前被输出。Gated Recurrent Unit 是 LSTM 众多版本中典型的一个。因为它具有记忆性的功能,LSTM经常被用在具有时间序列特性的数据和场景中。

LSTM 算法广泛应用于序列预测问题中,并被证明是一种非常有效的方法。它们之所表现如此出色,是因为LSTM能够存储重要的既往信息,并忽略不重要的信息。

LSTM有三个门:

  • 输入门:输入门将信息添加到细胞状态

  • 遗忘门:它移除模型不再需要的信息

  • 输出门:LSTM的输出门选择作为输出的信息

要更详细地了解LSTM及其体系结构,可以阅读下面的文章:

  • 长短期记忆网络简介

现在,让我们将LSTM实现为一个黑盒,并检查它在特定数据上的性能。

实现

#importing required libraries 导入必要的库函数

from sklearn.preprocessing import MinMaxScaler

from keras.models import Sequential

from keras.layers import Dense, Dropout, LSTM

 

#creating dataframe 搭建p d的数据框架,利用循环填充框架的内容

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]

 

#setting index 设定数据的索引,刨除date列

new_data.index = new_data.Date

new_data.drop('Date', axis=1, inplace=True)

 

#creating train and test sets 划分训练集测试集

dataset = new_data.values

 

train = dataset[0:987,:]

valid = dataset[987:,:]

 

#converting dataset into x_train and y_train 将两个数据集归一化处理

scaler = MinMaxScaler(feature_range=(0, 1))

#总数据集归一化

scaled_data = scaler.fit_transform(dataset)

 #确定正式训练集测试集,大小是在刚刚划分的数据集合中,按60:1的比例划分,这里的划分不能算是k折交叉验证,知道的朋友麻烦留言解答一下,感谢🙏

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])

#转为numpy格式

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))

 

# create and fit the LSTM network 建立模型

model = Sequential()

model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1],1)))

model.add(LSTM(units=50))

model.add(Dense(1))

 #编译模型,并给模型喂数据

model.compile(loss='mean_squared_error', optimizer='adam')

model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2)

 

#predicting 246 values, using past 60 from the train data 用测试集最后的60个数据

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)

#计算rms

rms=np.sqrt(np.mean(np.power((valid-closing_price),2)))

rms

 

11.772259608962642

#for plotting 绘画结果

train = new_data[:987]

valid = new_data[987:]

valid['Predictions'] = closing_price

plt.plot(train['Close'])

plt.plot(valid[['Close','Predictions']])

推论

LSTM轻松地超越了我们目前看到的任何算法。

LSTM模型可以对各种参数进行调优,如改变LSTM层数、增加dropout值或增加训练迭代轮数(epoch)数。

但LSTM的预测是否足以确定股票价格将上涨还是下跌?当然不行!

正如我在文章开头提到的,股价受到公司新闻和其他因素的影响,如公司的非货币化或合并/分拆。还有一些无形的因素往往是无法事先预测的。

 

 

 

参考:https://www.jiqizhixin.com/articles/2019-01-04-16

posted @ 2020-01-24 21:12  星涅爱别离  阅读(1728)  评论(0编辑  收藏  举报