利用 RNN 预测股票价格:从数据处理到可视化实战

在金融领域,预测股票价格走势一直是众多投资者和研究者关注的焦点。今天,我们将利用深度学习中的循环神经网络(RNN)来构建一个简单的股票价格预测模型,并详细介绍从数据加载、预处理、模型搭建、训练到最终结果可视化的全过程。

一、项目概述

本项目旨在通过历史股票价格数据,训练一个 RNN 模型,使其能够对未来股票价格进行一定程度的预测。我们将使用 Python 作为主要编程语言,结合 NumPy、PyTorch 以及 Scikit-learn 等强大的库来实现这一目标。

二、数据准备

  1. 加载数据:首先,我们使用 np.loadtxt 函数从 CSV 文件(假设名为 data-02-stock_daily.csv)中读取股票价格数据。这里需要注意指定正确的分隔符,通常股票数据 CSV 文件是以逗号分隔的,所以我们传入 delimiter=','。读取到的数据是一个二维数组,每一行代表一天的股票相关信息,如开盘价、收盘价、最高价、最低价等。为了让数据按照时间顺序排列,方便后续处理,我们使用切片操作 data = data[::-1] 将数据反转。
  2. 归一化处理:不同特征的数值范围可能差异很大,这会影响模型训练的效率和效果。因此,我们引入 MinMaxScaler 类进行归一化处理。它会将数据的每一个特征都映射到 0 到 1 的区间内,具体操作是通过 data = MinMaxScaler().fit_transform(data) 实现。经过这一步,数据的分布更加规整,有助于模型更快更好地收敛。
  3. 构建输入输出序列:为了让 RNN 模型能够学习到股票价格的时间序列特征,我们需要设置一个时间步长 c(这里设为 7)。通过循环遍历归一化后的数据,构建输入序列 x 和对应的输出序列 y。对于输入序列,我们将连续 c 天的数据作为一个样本,即 x.append(data[i:i + c]);而输出序列则是第 c + 1 天的股票价格,也就是 y.append(data[i + c][-1])。最后,将 x 和 y 转换为 PyTorch 张量,方便后续在深度学习框架中使用,使用 x = torch.tensor(x, dtype=torch.float) 和 y = torch.tensor(y, dtype=torch.float) 完成转换。
  4. 划分数据集:使用 sklearn 的 train_test_split 函数将数据集划分为训练集和测试集。为了保证实验的可重复性,我们指定 test_size=0.2,表示测试集占总数据集的 20%,以及 random_state=42 作为随机种子。通过 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42) 得到划分后的数据集,并打印出训练集的形状,以便了解数据的维度信息,用于后续模型参数的设置。

三、模型搭建

我们定义了一个自定义的 RNN 模型类,继承自 torch.nn.Module。在 __init__ 方法中:

  1. 首先调用父类的初始化方法 super().__init__(),确保模型的基础结构正确初始化。
  2. 接着创建两个 RNN 层,第一个 self.rnn1 的输入大小根据训练数据的特征维度确定,即 input_size=x_train.shape[2],这里 x_train.shape[2] 表示输入数据的特征数量,隐藏层大小设为 128,并且设置 batch_first=True,使输入张量的批次维度在第一维,方便与后续的数据加载器等组件配合;第二个 self.rnn2 的输入大小为第一个 RNN 层的隐藏层大小 128,隐藏层大小设为 256,同样设置 batch_first=True
  3. 最后定义一个线性层 self.linear,将第二个 RNN 层的输出映射到预测的股票价格维度,其输入特征数量为 256,输出特征数量为 1。

在 forward 方法中:

  1. 输入数据 x 首先经过第一个 RNN 层 self.rnn1,得到输出 x 和隐藏状态 y,由于在这个预测场景中我们不需要关注隐藏状态,所以直接忽略 y,即 x, _ = self.rnn1(x)
  2. 接着 x 再经过第二个 RNN 层 self.rnn2,同样忽略隐藏状态,x, _ = self.rnn2(x)
  3. 最后将经过两层 RNN 处理后的 x 的最后一个时间步的输出(也就是 x[:, -1, :])传入线性层 self.linear,得到最终的预测结果并返回。

四、模型训练

  1. 实例化模型:创建 RNN 模型的实例,即 model = RNN()
  2. 定义损失函数:选用均方误差损失函数(MSELoss)来衡量模型预测值与真实值之间的差异,loss_fn = torch.nn.MSELoss()。这是因为在预测股票价格这种连续值的任务中,均方误差能够很好地反映预测的准确性。
  3. 定义优化器:使用 Adam 优化器来更新模型的参数,指定学习率为 0.01,通过 optimizer = torch.optim.Adam(model.parameters(), lr=0.01) 完成定义。Adam 优化器在实际应用中表现出良好的收敛性能,能够自适应地调整学习率,使得模型训练更加高效。
  4. 训练循环:设置训练的轮数为 1000,在每一轮训练中:
    • 首先使用 optimizer.zero_grad() 清空上一轮训练的梯度信息,确保每一轮的梯度计算都是基于当前轮次的输入数据。
    • 然后将训练数据 x_train 传入模型,得到预测输出 h = model(x_train),并使用 loss_fn 计算预测值与真实值 y_train 之间的损失。
    • 接着调用 loss.backward() 进行反向传播,计算模型参数的梯度。
    • 最后使用 optimizer.step() 根据计算得到的梯度更新模型参数,并将当前轮次的损失值添加到损失列表 loss_list 中。为了便于观察训练过程,每 100 个轮次打印一次损失值,如 if (epoch + 1) % 100 == 0: print(f'Epoch [{epoch + 1}/{num_epoch00}, Loss: {loss.item():.4f}')

五、模型预测与可视化

  1. 预测测试集:训练完成后,将测试集数据 x_test 传入模型,得到预测结果 predictions = model(x_test).squeeze(),这里的 squeeze 操作是为了去除可能存在的多余维度,使预测结果的维度与真实值 y_test 相匹配。
  2. 绘制预测结果:使用 matplotlib 库绘制预测结果和真实结果的对比图。首先创建一个新的绘图窗口,设置合适的图幅大小,如 plt.figure(figsize=(10, 6))。然后分别绘制预测值和真实值的折线图,用红色表示预测值 plt.plot(predictions.detach().numpy(), c='r', label='Prediction'),绿色表示真实值 plt.plot(y_test.detach().numpy(), c='g', label='Actual'),并添加标题、坐标轴标签以及图例,最后通过 plt.show() 展示绘图结果。这使得我们能够直观地看到模型预测的股票价格与实际价格的接近程度,评估模型的性能。
  3. 绘制损失曲线:为了进一步了解模型训练过程中的收敛情况,我们还绘制了训练损失随轮次变化的曲线。同样创建一个新的绘图窗口,绘制损失列表 loss_list 中的值,用蓝色表示训练损失 plt.plot(loss_list, c='b', label='Training Loss'),添加相应的标题、坐标轴标签和图例,最后展示绘图结果。通过观察损失曲线,我们可以判断模型是否收敛,以及收敛的速度如何,为后续模型的优化提供参考。

通过以上完整的步骤,我们成功地利用 RNN 模型对股票价格进行了预测,并通过可视化手段直观地展示了预测结果和训练过程。当然,这只是一个简单的示例,在实际应用中,还可以进一步优化模型结构、调整参数、增加更多的数据特征等,以提高预测的准确性。希望这个项目能够为你在深度学习应用于金融领域的探索中提供一些帮助!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/901045.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangGraph 架构详解

核心架构组件 LangGraph 的架构建立在一个灵活的基于图的系统上,使开发者能够定义和执行复杂的工作流。以下是主要架构组件: 1. 状态管理系统 LangGraph 的核心是其强大的状态管理系统,它允许应用程序在整个执行过程中维护一致的状态&…

Python 深度学习实战 第1章 什么是深度学习代码示例

第1章:什么是深度学习 内容概要 第1章介绍了深度学习的背景、发展历史及其在人工智能(AI)和机器学习(ML)中的地位。本章探讨了深度学习的定义、其与其他机器学习方法的关系,以及深度学习在近年来取得的成…

swift菜鸟教程1-5(语法,变量,类型,常量,字面量)

一个朴实无华的目录 今日学习内容:1.基本语法引入空格规范输入输出 2.变量声明变量变量输出加反斜杠括号 \\( ) 3.可选(Optionals)类型可选类型强制解析可选绑定 4.常量常量声明常量命名 5.字面量整数 and 浮点数 实例字符串 实例 今日学习内容: 1.基本…

GAT-GRAPH ATTENTION NETWORKS(论文笔记)

CCF等级:A 发布时间:2018年 代码位置 25年4月21日交 目录 一、简介 二、原理 1.注意力系数 2.归一化 3.特征组合与非线性变换 4.多头注意力 4.1特征拼接操作 4.2平均池化操作 三、实验性能 四、结论和未来工作 一、简介 图注意力网络&…

XML、JSON 和 Protocol Buffers (protobuf) 对比

目录 1. XML (eXtensible Markup Language) 1)xml的特点: 2)xml的适用场景: 2. JSON (JavaScript Object Notation) 1)JSOM的特点: 2)JSON的适用场景: 3. Protocol Buffers (…

如何通过简单步骤保护您的网站安全

在如今的数字化时代,网站安全已经成为每个网站管理者都不能忽视的重点。未授权用户入侵、数据泄露和恶意软件等威胁越来越多,网站安全对于保护企业、用户和客户的数据非常重要。为了帮助您提升网站的安全性,本文介绍了一些简单且有效的措施&a…

【后端开发】初识Spring IoC与SpringDI、图书管理系统

文章目录 图书管理系统用户登录需求分析接口定义前端页面代码服务器代码 图书列表展示需求分析接口定义前端页面部分代码服务器代码Controller层service层Dao层modle层 Spring IoC定义传统程序开发解决方案IoC优势 Spring DIIoC &DI使用主要注解 Spring IoC详解bean的存储五…

通付盾风控智能体(RiskAgent): 神烦狗(DOGE)

在数字化业务高速发展的今天,风控系统已成为企业抵御黑产、欺诈、保障交易安全的核心防线。然而传统风控面临人力依赖高与策略滞后性等挑战,数据分析师需每日从海量数据中手动提炼风险特征、设计防护规则,耗时费力;新策略从发现到…

大模型论文:Language Models are Unsupervised Multitask Learners(GPT2)

大模型论文:Language Models are Unsupervised Multitask Learners(GPT2) 文章地址:https://storage.prod.researchhub.com/uploads/papers/2020/06/01/language-models.pdf 摘要 自然语言处理任务,例如问答、机器翻译、阅读理解和摘要&am…

分布式ID生成方案的深度解析与Java实现

在分布式系统中,生成全局唯一的ID是一项核心需求,广泛应用于订单编号、用户信息、日志追踪等场景。分布式ID不仅需要保证全局唯一性,还要满足高性能、高可用性以及一定的可读性要求。本文将深入探讨分布式ID的概念、设计要点、常见生成方案&a…

记 etcd 无法在docker-compose.yml启动后无法映射数据库目录的问题

1、将etcd 单独提取 Dockerfile,指定配置文件和数据目录 #镜像 FROM bitnami/etcd:3.5.11 #名称 ENV name"etcd" #重启 ENV restart"always" #运行无权限 ENV ALLOW_NONE_AUTHENTICATION"yes" #端口 EXPOSE 2379 2380 #管理员权限才…

怎样才不算干扰球·棒球1号位

在棒球运动中,"干扰球"(Interference)是指球员或场外人员非法影响了比赛的正常进行。以下情况通常 不构成干扰,属于合法行为或无需判罚: 1. 击跑员(Batter-Runner)合法跑垒 跑垒限制…

PyTorch实现多输入输出通道的卷积操作

本文通过代码示例详细讲解如何在PyTorch中实现多输入通道和多输出通道的卷积运算,并对比传统卷积与1x1卷积的实现差异。 1. 多输入通道互相关运算 当输入包含多个通道时,卷积核需要对每个通道分别进行互相关运算,最后将结果相加。以下是实现…

深入解析 MySQL 中的日期时间函数:DATE_FORMAT 与时间查询优化、DATE_ADD、CONCAT

深入解析 MySQL 中的日期时间函数:DATE_FORMAT 与时间查询优化 在数据库管理和应用开发中,日期和时间的处理是不可或缺的一部分。MySQL 提供了多种日期和时间函数来满足不同的需求,其中DATE_FORMAT函数以其强大的日期格式化能力,…

SSH配置优化:提升本地内网Linux服务器远程连接速度与稳定性

文章目录 引言一. 理解SSH连接过程与影响因素二. 服务器端SSH配置优化三. 客户端SSH配置优化四. 高级技巧五. 内网穿透突破公网IP限制总结 引言 SSH (Secure Shell) 是一种网络协议,用于加密的网络服务,常用于远程登录和管理Linux服务器。对于本地内网的…

BERT - MLM 和 NSP

本节代码将实现BERT模型的两个主要预训练任务:掩码语言模型(Masked Language Model, MLM) 和 下一句预测(Next Sentence Prediction, NSP)。 1. create_nsp_dataset 函数 这个函数用于生成NSP任务的数据集。 def cr…

“实时滚动”插件:一个简单的基于vue.js的无缝滚动

1、参考连接: 安装 | vue-seamless-scroll 2、使用步骤: 第一步:安装 yarn add vue-seamless-scroll 第二步:引入 import vueSeamlessScroll from vue-seamless-scroll/src 第三步:注册 components: { vueSeamless…

【蓝桥杯】赛前练习

1. 排序 import os import sysn=int(input()) data=list(map(int,input().split(" "))) data.sort() for d in data:print(d,end=" ") print() for d in data[::-1]:print(d,end=" ")2. 走迷宫BFS import os import sys from collections import…

pyTorch-迁移学习-学习率衰减-四种天气图片多分类问题

目录 1.导包 2.加载数据、拼接训练、测试数据的文件夹路径 3.数据预处理 3.1 transforms.Compose数据转化 3.2分类存储的图片数据创建dataloader torchvision.datasets.ImageFolder torch.utils.data.DataLoader 4.加载预训练好的模型(迁移学习) 4.1固定、修改预训练…

第十四届蓝桥杯大赛软件赛国赛Python大学B组题解

文章目录 弹珠堆放划分偶串交易账本背包问题翻转最大阶梯最长回文前后缀贸易航线困局 弹珠堆放 递推式 a i a i − 1 i a_ia_{i-1}i ai​ai−1​i, n 20230610 n20230610 n20230610非常小,直接模拟 答案等于 494 494 494 划分 因为总和为 1 e 6 1e6…