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


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

    前言


    1.什么是循环神经网络

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

    2.回归评价指标

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

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

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

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

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

    其中的参数解释:

    •  y_{i}是第i个样本的真实值
    • \widehat{y}​是第i个样本的预测值
    • m是样本的个数


    一、前期工作

    1.加载数据

    1. import os,math
    2. from tensorflow.keras.layers import Dropout, Dense, SimpleRNN
    3. from sklearn.preprocessing import MinMaxScaler
    4. from sklearn import metrics
    5. import numpy as np
    6. import pandas as pd
    7. import tensorflow as tf
    8. import matplotlib.pyplot as plt
    9. # 支持中文
    10. plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
    11. plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号

     查看一下数据集

    1. data = pd.read_csv('./SH600519.csv') # 读取股票文件
    2. data
    Unnamed: odateopenclosehighlowvolumecode
    0742010-04-2688.70287.38189.07287.362107036.13600519
    1752010-O4-2787.35584.84187.35584.68158234.48600519
    2762010-04-2884.23584.31885.12883.59726287.43600519
    3772010-04-2984.59285.67186.31584.59234501.2600519
    4782010-04-3083.87182.3483.87181.52385566.7600519
    242124952020-04-2012211227.31231.51216.824239600519
    242224962020-04-211221.0212001223.99119329224600519
    242324972020-04-2212061244.51249.51202.2244035600519
    242424982020-04-2312501252.261265.681247.7726899600519
    242524992020-04-2412481250.561259.891235.1819122600519

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

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

    二、数据预处理

    1.归一化

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

    2.设置测试集训练集

    1. x_train = []
    2. y_train = []
    3. x_test = []
    4. y_test = []
    5. """
    6. 使用前60天的开盘价作为输入特征x_train
    7. 第61天的开盘价作为输入标签y_train
    8. for循环共构建2426-300-60=2066组训练数据。
    9. 共构建300-60=260组测试数据
    10. """
    11. for i in range(60, len(training_set)):
    12. x_train.append(training_set[i - 60:i, 0])
    13. y_train.append(training_set[i, 0])
    14. for i in range(60, len(test_set)):
    15. x_test.append(test_set[i - 60:i, 0])
    16. y_test.append(test_set[i, 0])
    17. # 对训练集进行打乱
    18. np.random.seed(7)
    19. np.random.shuffle(x_train)
    20. np.random.seed(7)
    21. np.random.shuffle(y_train)
    22. tf.random.set_seed(7)
    1. """
    2. 将训练数据调整为数组(array)
    3. 调整后的形状:
    4. x_train:(2066, 60, 1)
    5. y_train:(2066,)
    6. x_test :(240, 60, 1)
    7. y_test :(240,)
    8. """
    9. x_train, y_train = np.array(x_train), np.array(y_train) # x_train形状为:(2066, 60, 1)
    10. x_test, y_test = np.array(x_test), np.array(y_test)
    11. """
    12. 输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]
    13. """
    14. x_train = np.reshape(x_train, (x_train.shape[0], 60, 1))
    15. x_test = np.reshape(x_test, (x_test.shape[0], 60, 1))

    五.构建模型

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

    六.激活模型

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

    七.训练模型

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

    八、结果可视化

    1.绘制loss图

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

    2.预测

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

     3.模型评估

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

     均方误差: 2832.56694

    均方根误差: 53.22187

    平均绝对误差: 46.33857

    R2: 0.59098

    参考资料:

    >- 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/k-vYaC8l7uxX51WoypLkTw) 中的学习记录博客
    >- 参考文章地址: [🔗深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天](https://mtyjkh.blog.csdn.net/article/details/117752046)
     

  • 相关阅读:
    题目 1071:阶乘公式求值
    IO:作业:线程:2. 要求用线程拷贝一张图片,一个线程拷贝前半部分,另一个线程拷贝后半部分
    【LeetCode:2586. 统计范围内的元音字符串数 | 模拟】
    pycharm 断点调试python Flask
    QGIS跨平台编译
    NOI / 1.2编程基础之变量定义、赋值及转换
    manim边做边学--数轴
    SDL2 简明教程(二):创建一个空的窗口
    mysql主备集群(高可用)
    yolov8目标检测-onnx模型推理
  • 原文地址:https://blog.csdn.net/qq_21402983/article/details/126331590