700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 循环神经网络(RNN)实现股票预测

循环神经网络(RNN)实现股票预测

时间:2022-07-15 15:02:31

相关推荐

循环神经网络(RNN)实现股票预测

​活动地址:CSDN21天学习挑战赛

前言

1.什么是循环神经网络?

一个最简单的循环神经网络如下图所示:这样的神经网络一共有3层,分别是输入层x,隐藏层h和输出层y。定义每一层的节点下标如下:k表示的是输出层的节点下标,j表示的是当前时间节点隐藏层的节点下标,l表示的是上一时间节点隐藏层的节点下标,i表示的是输入层的节点下标。

2.回归评价指标

MSE :均方误差 -----> 预测值减真实值求平方后求均值

RMSE :均方根误差 -----> 对均方误差开方

平方根误差(RMSE),其又被称为RMSD(root mean square deviation),是回归模型中最常用的评价指标。

MAE :平均绝对误差-----> 预测值减真实值求绝对值后求均值

R2 :决定系数,可以简单理解为反映模型拟合优度的重要的统计量

其中的参数解释:

是第i个样本的真实值​是第i个样本的预测值m是样本的个数

一、前期工作

1.加载数据

import os,mathfrom tensorflow.keras.layers import Dropout, Dense, SimpleRNNfrom sklearn.preprocessing import MinMaxScalerfrom sklearn import metricsimport numpy as npimport pandas as pdimport tensorflow as tfimport matplotlib.pyplot as plt# 支持中文plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

查看一下数据集

data = pd.read_csv('./SH600519.csv') # 读取股票文件data

可以看到这个数据集的维度是一个2426 rows × 8 columns

"""前(2426-300=2126)天的开盘价作为训练集,表格从0开始计数,2:3 是提取[2:3)列,前闭后开,故提取出C列开盘价后300天的开盘价作为测试集"""training_set = data.iloc[0:2426 - 300, 2:3].values test_set = data.iloc[2426 - 300:, 2:3].values

二、数据预处理

1.归一化

sc = MinMaxScaler(feature_range=(0, 1))training_set = sc.fit_transform(training_set)test_set = sc.transform(test_set)

2.设置测试集训练集

x_train = []y_train = []x_test = []y_test = []"""使用前60天的开盘价作为输入特征x_train第61天的开盘价作为输入标签y_trainfor循环共构建2426-300-60=2066组训练数据。共构建300-60=260组测试数据"""for i in range(60, len(training_set)):x_train.append(training_set[i - 60:i, 0])y_train.append(training_set[i, 0])for i in range(60, len(test_set)):x_test.append(test_set[i - 60:i, 0])y_test.append(test_set[i, 0])# 对训练集进行打乱np.random.seed(7)np.random.shuffle(x_train)np.random.seed(7)np.random.shuffle(y_train)tf.random.set_seed(7)

"""将训练数据调整为数组(array)调整后的形状:x_train:(2066, 60, 1)y_train:(2066,)x_test :(240, 60, 1)y_test :(240,)"""x_train, y_train = np.array(x_train), np.array(y_train) # x_train形状为:(2066, 60, 1)x_test, y_test = np.array(x_test), np.array(y_test)"""输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]"""x_train = np.reshape(x_train, (x_train.shape[0], 60, 1))x_test = np.reshape(x_test, (x_test.shape[0], 60, 1))

五.构建模型

model = tf.keras.Sequential([SimpleRNN(100, return_sequences=True), #布尔值。是返回输出序列中的最后一个输出,还是全部序列。Dropout(0.1),#防止过拟合SimpleRNN(100),Dropout(0.1),Dense(1)])

六.激活模型

# 该应用只观测loss数值,不观测准确率,所以删去metrics选项,一会在每个epoch迭代显示时只显示loss值pile(optimizer=tf.keras.optimizers.Adam(0.001),loss='mean_squared_error') # 损失函数用均方误差

七.训练模型

history = model.fit(x_train, y_train, batch_size=64, epochs=20, validation_data=(x_test, y_test), validation_freq=1) #测试的epoch间隔数model.summary()

八、结果可视化

1.绘制loss图

plt.plot(history.history['loss'] , label='Training Loss')plt.plot(history.history['val_loss'], label='Validation Loss')plt.title('Training and Validation Loss')plt.legend()plt.show()

2.预测

predicted_stock_price = model.predict(x_test) # 测试集输入模型进行预测predicted_stock_price = sc.inverse_transform(predicted_stock_price) # 对预测数据还原---从(0,1)反归一化到原始范围real_stock_price = sc.inverse_transform(test_set[60:]) # 对真实数据还原---从(0,1)反归一化到原始范围# 画出真实数据和预测数据的对比曲线plt.plot(real_stock_price, color='red', label='Stock Price')plt.plot(predicted_stock_price, color='blue', label='Predicted Stock Price')plt.title('Stock Price Prediction by K同学啊')plt.xlabel('Time')plt.ylabel('Stock Price')plt.legend()plt.show()

3.模型评估

MSE = metrics.mean_squared_error(predicted_stock_price, real_stock_price)RMSE = metrics.mean_squared_error(predicted_stock_price, real_stock_price)**0.5MAE = metrics.mean_absolute_error(predicted_stock_price, real_stock_price)R2 = metrics.r2_score(predicted_stock_price, real_stock_price)print('均方误差: %.5f' % MSE)print('均方根误差: %.5f' % RMSE)print('平均绝对误差: %.5f' % MAE)print('R2: %.5f' % R2)

均方误差: 2832.56694

均方根误差: 53.22187

平均绝对误差: 46.33857

R2: 0.59098

参考资料:

>- 本文为[🔗365天深度学习训练营](https://mp./s/k-vYaC8l7uxX51WoypLkTw) 中的学习记录博客

>- 参考文章地址: [🔗深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天](https://mtyjkh./article/details/117752046)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。