• 股票价格预测


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

    学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
    想系统/深入学习某技术知识点…
    一个人摸索学习很难坚持,想组团高效学习…
    想写博客但无从下手,急需写作干货注入能量…
    热爱写作,愿意让自己成为更好的人…

    创作计划

    **
    1,机缘

    A,股票价格预测项目中的经验分享
    B,平时学习过程中的经验记录
    C,通过股票价格预测与相关作者进行技术交流

    2,收获

    A,获得了10粉丝的关注
    B,获得了20正向的赞、阅读量等
    C,认识了学习RNN的技术同行

    3,日常

    1. 创作已经是我学习的一部分了
    2. 有限的时间下,周二、周四、周六进行创作,其余时间学习

    4,憧憬

    创作规划是学习RNN原理,使用RNN模型模拟股票价格输出

    **

    学习计划

    **
    1,学习目标

    掌握 RNN入门知识

    2,学习内容

    A,掌握误差估计方法
    B,学习RNN基本原理
    C,划分数据集

    3,学习时间

    周一至周五晚上 7 点—晚上9点
    周六下午 6 点-下午 9 点
    周日下午 6 点-下午 9 点

    4,学习产出

    技术笔记 10 篇
    CSDN技术博客 3 篇
    学习的vlog 视频 1 个

    **

    学习日记

    **
    1,学习知识点

    RNN的结构,模型构建方法

    2,学习遇到的问题

    数据集的划分、模型的设计

    3,学习的收获

    学会了RNN模型的构建

    4,实操

    import os,math
    from tensorflow.keras.layers import Dropout, Dense, SimpleRNN
    from sklearn.preprocessing   import MinMaxScaler
    from sklearn                 import metrics
    import numpy as np
    import pandas as pd
    import tensorflow as tf
    import matplotlib.pyplot as plt
    # 支持中文
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    data = pd.read_csv('D:/BaiduNetdiskDownload/SH600519.csv')  # 读取股票文件
    #print(data)
    #取出第三列
    training_set = data.iloc[0:2426 - 300, 2:3].values
    test_set = data.iloc[2426 - 300:, 2:3].values
    #归一化
    sc= MinMaxScaler(feature_range=(0, 1))
    training_set = sc.fit_transform(training_set)
    test_set= sc.transform(test_set)
    #设置测试集、训练集
    x_train = []
    y_train = []
    
    x_test = []
    y_test = []
    
    """
    使用前60天的开盘价作为输入特征x_train
        第61天的开盘价作为输入标签y_train
    
    for循环共构建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, y_train = np.array(x_train), np.array(y_train)
    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值
    model.compile(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()
    plt.plot(history.history['loss']    , label='Training Loss')
    plt.plot(history.history['val_loss'], label='Validation Loss')
    plt.title('Training and Validation Loss by K同学啊')
    plt.legend()
    plt.show()
    ##预测
    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()
    #评估
    MSE   = metrics.mean_squared_error(predicted_stock_price, real_stock_price)
    RMSE  = metrics.mean_squared_error(predicted_stock_price, real_stock_price)**0.5
    MAE   = 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)
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101

    输出:在这里插入图片描述
    在这里插入图片描述
    均方误差: 2832.55388
    均方根误差: 53.22174
    平均绝对误差: 46.33845
    R2: 0.59098

    分析:可以看出训练集和测试集差别较小,没有产生过拟合。使用该模型预测准确率也较吻合。产生的误差较小。

  • 相关阅读:
    #边学边记 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理 2-2 制订沟通管理计划
    文件翻译-免费文件翻译-批量文件翻译软件大全
    springboot的Home F家居系统的设计与管理
    ubuntu20.04安装genymotion3.5.1
    <蓝桥杯软件赛>零基础备赛20周--第6周--数组和队列
    LiveGBS流媒体平台GB/T28181常见问题-如何禁用删除已注册设备国标设备如何删除
    下载Windows 10操作系统和在VMware虚拟机中配置完成
    花一天时间做一个高质量飞机大战游戏,过万字Unity完整教程!漂亮学妹看了直呼666!
    Git学习笔记
    SB了!给注解的数组属性赋值,我竟然...
  • 原文地址:https://blog.csdn.net/misterfm/article/details/126225598