一个很有意思的实例:预测股票走势。希望新的一年大家都能发大财!
长短期记忆网络(LSTM,Long Short-Term Memory)是一种专门用来处理时间序列的神经网络结构。LSTM的出现是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的。
我们以股票走势预测为例,输出为某个股票的今日收盘价格,输入为这个股票以往60个交易日的价格。
一、需要使用到的python包import numpy as np
import pandas as pd
# 使用kears包快速搭建LSTM神经网络
import kears
# tushare股票数据提供平台
import tushare as ts
二、获取股票数据
需要在 tushare官网申请账号,然后使用token才能通过数据接口获取数据
ts.set_token('xxx')
pro = ts.pro_api()
#这里是用 000002 万科为例,下载2015-1-1 的股价数据
df = pro.daily(ts_code=‘000002.SZ’, start_date='2015-01-01’, end_date=‘2020-02-25’)
我们在Pycharm中运行上述代码,并打印出结果如下:
三、股票数据预处理
使用最大最小算法将股票数据标准化为0到1之间的数据
from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler(feature_range = (0, 1))
train_set = mms.fit_transform(df.values)
# 准备大量的 X 和 y,用于后面的训练。
X_train = []
y_train = []
for i in range(60, len(train_set )):
X_train.append(train_set [i-60:i])
y_train.append(train_set [i, train_set .shape[1] - 1])
X_train, y_train = np.array(X_train), np.array(y_train)
四、创建LSTM神经网络
from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np
def cre_lstm(x_train):
model = Sequential()
model.add(LSTM(16, input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')
model.summary()
return model
五、训练LSTM神经网络并保存
model = cre_lstm(x_train)
LSTM_model = model.fit(x_train, y_train, epochs=300, batch_size=100,
validation_split=0.1, verbose=1, shuffle=False)
model.save("./model/LSTM_model")
六、预测未来的股票价格
#准备测试数据
X_test = []
for i in range(60, 60 + len(dataset_test)):
X_test.append(inputs[i-60:i])
X_test = np.array(X_test)
#对预测数据也做一次数组变形处理
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], dataset_test.shape[1]))
#用前面训练的模型预测价格
predicted_price = model.predict(X_test)
#再把规则化数据转回成正常的价格数据,现在就可以得出预测的下个交易日收盘价格
predicted_price = mms.inverse_transform(predicted_stock_price)
结论:曲线拟合还不错,但是有一个很严峻的问题:为什么我还没脱贫呢???
为什么不能用LSTM模型来预测股票?有一篇文章进行了说明:Machine Learning in Finance: Why You Should Not Use LSTM’s to Predict the Stock Market。结论是:从总体上看,LSTM似乎在预测第二天价格这方面是有效的,实际上,第二天的预测与前一天的实际价格非常接近。
按照文章的结论,将前一天的lable和后一天的预测进行拟合:
这张经过平移之后的图,虽然在数值上有差异,最大值和最小值都能对上。这说明,LSTM仅仅用一个非常接近前一天收盘价的数值作为第二天的预测值。这意味着它在股票的时间序列预测问题上是一个没有预测能力的模型。