使用神经网络预测商品及股票价格:探索LSTM算法

文中预测使用一种称为长短时记忆(LSTM)网络的循环神经网络(RNN)算法。

LSTM网络是一种特定设计用于处理序列数据的RNN,例如时间序列数据。它们能够通过选择性地记忆或遗忘来自先前时间步的信息,学习数据中的长期依赖关系。

在代码中,LSTM网络用于基于历史数据预测未来商品及股票价格。该模型在一系列60个数据点上进行训练,然后用于预测下一个数据点。该过程针对整个测试集重复进行,以生成一系列预测值。

预测结果如图所示,均方根误差(RMSE: Close 48.571104),我感觉预测值和均线类似,后附python代码,有兴趣朋友可以研究一下

使用神经网络预测商品及股票价格:探索LSTM算法

使用神经网络预测商品及股票价格:探索LSTM算法

代码如下

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense, Dropout, LSTM

# 加载商品价格数据
df = pd.read_csv('商品甲醇价格.csv') #这行代码的作用是从csv文件中加载商品价格数据。

# 删除日期列
df = df.drop(['Date'], 1)  #这行代码的作用是从数据中删除日期列,因为在这个LSTM模型中,日期并不是一个有用的特征。
#df = df.set_index('Date')
# 对数据进行归一化。这行代码的作用是使用MinMaxScaler对原始数据进行归一化处理,将价格数据缩放到0到1之间。
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(df)

# 创建训练数据集  这行代码的作用是创建训练数据集,其中包含前600行的归一化数据。
training_data = scaled_data[0:600, :]

# 将数据拆分为输入和输出。  这段代码的作用是将训练数据集拆分为输入和输出,其中每个输入序列由前60个数据点组成,而输出序列是一个单独的数据点。
x_train, y_train = [], []

for i in range(60, len(training_data)):
    x_train.append(training_data[i-60:i, 0])
    y_train.append(training_data[i, 0])

# 将数据形状转换为LSTM模型适用的形式  这段代码的作用是将训练集数据形状转换为适合LSTM模型的形式,即将其转换为3D张量。
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))

# 构建LSTM模型  这段代码的作用是构建LSTM模型,其中包括三个LSTM层和一个Dense层。在LSTM层中使用了dropout来防止过拟合。
model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1], 1)))
model.add(Dropout(0.2))
model.add(LSTM(units=50, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=50))
model.add(Dropout(0.2))
model.add(Dense(units=1))

# 编译模型  这行代码的作用是编译LSTM模型,使用adam优化器和均方误差作为损失函数。
model.compile(optimizer='adam', loss='mean_squared_error')

# 训练模型  这行代码的作用是使用训练数据集来训练LSTM模型。
model.fit(x_train, y_train, epochs=100, batch_size=32)

# 加载测试数据   这行代码的作用是从归一化数据中加载测试数据集,其中包含从第540行开始的所有数据,以及前60个时间步长的历史数据。
test_data = scaled_data[600-60:, :]

# 创建测试数据集   这段代码的作用是将测试数据集拆分为输入序列。与训练数据集类似,每个输入序列由前60个数据点组成。
x_test, y_test = [], df[600:]
for i in range(60, len(test_data)):
    x_test.append(test_data[i-60:i, 0])

# 将数据形状转换为LSTM模型适用的形式
x_test = np.array(x_test)
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))

# 对测试数据进行预测   这段代码的作用是对测试数据集进行预测,并使用MinMaxScaler的逆变换将预测值还原为原始价格。
predictions = model.predict(x_test)
predictions = scaler.inverse_transform(predictions)

# 计算预测结果的均方根误差(RMSE)   这段代码的作用是计算预测结果的均方根误差(RMSE)。
rmse = np.sqrt(np.mean(((predictions - y_test) ** 2)))
print("均方根误差(RMSE): ", rmse)

# 绘制图表
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["axes.unicode_minus"] = False

# 绘制原始股票价格图表
plt.plot(df[600:].index, df[600:].values, label='原始数据')

# 绘制预测股票价格图表
plt.plot(df[600:].index, predictions, label='预测数据')

# 添加标题和标签
plt.title('甲醇价格预测')
plt.xlabel('日期')
plt.ylabel('价格')
plt.legend()

# 显示图表
plt.show()

以下是 '商品甲醇价格.csv' 数据示例

Date

Close

2020/6/29

1763

2020/6/30

1774

2020/7/1

1778

2020/7/2

1808

2020/7/3

1823

2020/7/6

1837

2020/7/7

1808

2020/7/8

1825

2020/7/9

1831

2020/7/10

1799

2020/7/13

1838