本文主要介绍如何使用python搭建:一个基于长短期记忆网络(LSTM:Long Short-Term Memory, 简称 LSTM)的股票、大宗商品预测系统。
项目只是用股票预测作为抛砖引玉,其中包含了使用LSTM进行时序预测的相关代码。主要功能如下:
如各位童鞋需要更换训练数据,完全可以根据源码将图像和标注文件更换即可直接运行。
博主也参考过网上图像分类的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个预测系统即可。
本文只会告诉你如何快速搭建一个基于LSTM的股票预测系统并运行,原理的东西可以参考其他博主。
也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。
如果您有以上想法,那就找对地方了!
不多废话,直接进入正题!
首先我们这次工作主要是针对,大宗商品指数的一个预测,分别为:化工、贵金属、有色。
本项目开发IDE使用的是:Pycharm,大家可以直接csdn搜索安装指南非常多,这里就不再赘述。
因为本项目基于TensorFlow因此需要以下环境:
环境安装好后就可以打开pycharm开始愉快的执行代码了。由于代码众多,博客中就不放入最终代码了,有需要的童鞋可以在博客最下方找到下载地址。
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
"""
将时间序列转换为监督学习问题
Arguments:
data: 输入数据需要是列表或二维的NumPy数组的观察序列。
n_in: 输入的滞后观察数(X)。值可以在[1..len(data)]之间,可选的。默认为1。
n_out: 输出的观察数(y)。值可以在[0..len(data)-1]之间,可选的。默认为1。
dropnan: Bool值,是否删除具有NaN值的行,可选的。默认为True。
Returns:
用于监督学习的Pandas DataFrame。
"""
# 定义series_to_supervised()函数
# 将时间序列转换为监督学习问题
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n, ... t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j + 1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
names += [('var%d(t)' % (j + 1)) for j in range(n_vars)]
else:
names += [('var%d(t+%d)' % (j + 1, i)) for j in range(n_vars)]
# put it all together
agg = concat(cols, axis=1)
agg.columns = names
# drop rows with NaN values
if dropnan:
agg.dropna(inplace=True)
# 删除多余列
agg.drop(agg.columns[[6, 8, 10]], axis=1, inplace=True)
print("*" * 20)
print("完成监督学习转换:")
print(agg.head())
return agg
def model_create(train_X):
"""
搭建LSTM模型
:param train_X:
:return:
"""
model = Sequential()
model.add(LSTM(64, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dropout(0.5))
model.add(Dense(1, activation='relu'))
model.compile(loss='mae', optimizer='adam', metrics=['mse'])
return model
# 定义callbacks参数
callbacks = [
TensorBoard(log_dir=my_log_dir)
]
# 贵金属模型训练
history1 = lstm_gjs.fit(train_x_gjs, train_y_gjs, epochs=100, batch_size=100,
validation_data=(test_x_gjs, test_y_gjs), callbacks=callbacks,
verbose=2, shuffle=False)
# 保存最终模型
lstm_gjs.save_weights('models/' + 'model_lstm_gjs.tf')
由于项目代码量和数据集较大,感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以在评论区进行评论,我都会一一解答。
完整代码下载:
【代码分享】手把手教你:基于LSTM的股票预测系统