利用 RNN 预测股票价格:从数据处理到可视化实战
在金融领域,预测股票价格走势一直是众多投资者和研究者关注的焦点。今天,我们将利用深度学习中的循环神经网络(RNN)来构建一个简单的股票价格预测模型,并详细介绍从数据加载、预处理、模型搭建、训练到最终结果可视化的全过程。
一、项目概述
本项目旨在通过历史股票价格数据,训练一个 RNN 模型,使其能够对未来股票价格进行一定程度的预测。我们将使用 Python 作为主要编程语言,结合 NumPy、PyTorch 以及 Scikit-learn 等强大的库来实现这一目标。
二、数据准备
- 加载数据:首先,我们使用
np.loadtxt
函数从 CSV 文件(假设名为data-02-stock_daily.csv
)中读取股票价格数据。这里需要注意指定正确的分隔符,通常股票数据 CSV 文件是以逗号分隔的,所以我们传入delimiter=','
。读取到的数据是一个二维数组,每一行代表一天的股票相关信息,如开盘价、收盘价、最高价、最低价等。为了让数据按照时间顺序排列,方便后续处理,我们使用切片操作data = data[::-1]
将数据反转。 - 归一化处理:不同特征的数值范围可能差异很大,这会影响模型训练的效率和效果。因此,我们引入
MinMaxScaler
类进行归一化处理。它会将数据的每一个特征都映射到 0 到 1 的区间内,具体操作是通过data = MinMaxScaler().fit_transform(data)
实现。经过这一步,数据的分布更加规整,有助于模型更快更好地收敛。 - 构建输入输出序列:为了让 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)
完成转换。 - 划分数据集:使用
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__
方法中:
- 首先调用父类的初始化方法
super().__init__()
,确保模型的基础结构正确初始化。 - 接着创建两个 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
。 - 最后定义一个线性层
self.linear
,将第二个 RNN 层的输出映射到预测的股票价格维度,其输入特征数量为 256,输出特征数量为 1。
在 forward
方法中:
- 输入数据
x
首先经过第一个 RNN 层self.rnn1
,得到输出x
和隐藏状态y
,由于在这个预测场景中我们不需要关注隐藏状态,所以直接忽略y
,即x, _ = self.rnn1(x)
。 - 接着
x
再经过第二个 RNN 层self.rnn2
,同样忽略隐藏状态,x, _ = self.rnn2(x)
。 - 最后将经过两层 RNN 处理后的
x
的最后一个时间步的输出(也就是x[:, -1, :]
)传入线性层self.linear
,得到最终的预测结果并返回。
四、模型训练
- 实例化模型:创建
RNN
模型的实例,即model = RNN()
。 - 定义损失函数:选用均方误差损失函数(MSELoss)来衡量模型预测值与真实值之间的差异,
loss_fn = torch.nn.MSELoss()
。这是因为在预测股票价格这种连续值的任务中,均方误差能够很好地反映预测的准确性。 - 定义优化器:使用 Adam 优化器来更新模型的参数,指定学习率为 0.01,通过
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
完成定义。Adam 优化器在实际应用中表现出良好的收敛性能,能够自适应地调整学习率,使得模型训练更加高效。 - 训练循环:设置训练的轮数为 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}')
。
- 首先使用
五、模型预测与可视化
- 预测测试集:训练完成后,将测试集数据
x_test
传入模型,得到预测结果predictions = model(x_test).squeeze()
,这里的squeeze
操作是为了去除可能存在的多余维度,使预测结果的维度与真实值y_test
相匹配。 - 绘制预测结果:使用
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()
展示绘图结果。这使得我们能够直观地看到模型预测的股票价格与实际价格的接近程度,评估模型的性能。 - 绘制损失曲线:为了进一步了解模型训练过程中的收敛情况,我们还绘制了训练损失随轮次变化的曲线。同样创建一个新的绘图窗口,绘制损失列表
loss_list
中的值,用蓝色表示训练损失plt.plot(loss_list, c='b', label='Training Loss')
,添加相应的标题、坐标轴标签和图例,最后展示绘图结果。通过观察损失曲线,我们可以判断模型是否收敛,以及收敛的速度如何,为后续模型的优化提供参考。
通过以上完整的步骤,我们成功地利用 RNN 模型对股票价格进行了预测,并通过可视化手段直观地展示了预测结果和训练过程。当然,这只是一个简单的示例,在实际应用中,还可以进一步优化模型结构、调整参数、增加更多的数据特征等,以提高预测的准确性。希望这个项目能够为你在深度学习应用于金融领域的探索中提供一些帮助!
相关文章:
利用 RNN 预测股票价格:从数据处理到可视化实战
在金融领域,预测股票价格走势一直是众多投资者和研究者关注的焦点。今天,我们将利用深度学习中的循环神经网络(RNN)来构建一个简单的股票价格预测模型,并详细介绍从数据加载、预处理、模型搭建、训练到最终结果可视化的…...
前端从全链路角度分析性能
在面试中回答“从全链路角度分析性能优化”时,需覆盖用户请求到页面渲染的完整链路。以下是结构化回答框架,结合业界实践和最新优化策略: 一、网络传输优化 1. CDN与协议升级 ◦ 使用CDN缩短资源物理距离,结合HTTP/2/3的多路复用和头部压缩特性,提升资源加载效率(如We…...
2025年第十八届“认证杯”数学中国数学建模网络挑战赛【BC题】完整版+代码+结果
# 问题一:随机森林回归from sklearn.ensemble import RandomForestRegressormodel_rf RandomForestRegressor()model_rf.fit(X_train, y_train)# 问题二:LSTM时间序列预测from tensorflow.keras.models import Sequentialmodel_lstm Sequential()model…...
权限管控与数据安全:衡石ChatBot在钉钉中的合规部署指南
数据安全是ChatBot落地的第一道门槛 在数字化转型浪潮下,企业数据查询正从“专业BI工具”向“自然语言交互”跃迁。衡石ChatBot通过钉钉等企业IM工具,让业务人员以对话方式实时获取数据,极大提升了决策效率。然而,数据开放的同时…...
什么是生产管理看板?
简单来说,生产管理看板就是一种把生产过程“摆在明面上”的工具——它可能是贴在墙上的白板,也可能是车间里一块大屏幕,主要作用就是让生产信息一目了然。 这种看板广泛用在工厂、制造车间、或者办公室里,它把生产计划、任务进度、库存情况、设备状态等重要数据通通“晒”…...
YOLO学习笔记 | 一文详解YOLOv11核心创新与实践方法
===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== YOLOv11核心创新与实践 一、架构创新1. 模块升级与参数优化2. 多…...
198. 打家劫舍:动态规划
前言 本篇文章来自leedcode,是博主的学习算法的笔记心得。 如果觉得对你有帮助,可以点点关注,点点赞,谢谢你! 题目来源 198. 打家劫舍 - 力扣(LeetCode) 题目描述 思路 1.对于只有一个房间…...
算法基础模板
高精度加法 #include <bits/stdc.h> using namespace std; const int N10005; int A[N],B[N],C[N],al,bl,cl; void add(int A[],int B[],int C[]) {for(int icl-1;~i;i--){C[cl]A[i]B[i];C[cl1]C[cl]/10;C[cl]%10;}if(C[cl])cl; } int main() {string a,b;cin>>a&…...
【大模型LLM第十六篇】Agent学习之浅谈Agent loop的几种常见范式
anthropics agent https://zhuanlan.zhihu.com/p/32454721762 code:https://github.com/anthropics/anthropic-quickstarts/blob/main/computer-use-demo/computer_use_demo/loop.py sampling_loop函数 每次进行循环,输出extract tool_use࿰…...
[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)
一、前言 📌 为什么日志在项目中如此重要? 在开发和维护一个后端系统时,日志就像程序运行时的“黑匣子”,帮我们记录系统的各种行为和异常。一份良好的日志,不仅能帮助我们快速定位问题,还能在以下场景中…...
【模拟电路】隧道二极管
与标准二极管相比,隧道二极管通过使用具有令人难以置信的大掺杂水平的半导体物质来工作,导致p-n结之间的耗尽层变得比最快的硅二极管窄约1000倍。 一旦隧道二极管正向偏置,整个p-n结开始发生称为电子流“隧穿”的过程。 在测试隧道二极管的…...
qwen-vl 实现OCR的测试
OCR 技术是数字化时代必不可少的实用工具。以前都依赖专业的公司的专业软件才能完成。成本很高。也正因为如此,我国纸质资料的数字化并不普及。基于大模型的ORC 也许会改变这样的现状。 文本识别,也称为光学字符识别 (OCR),可以将印刷文本或…...
3.0/Q2,Charls最新文章解读
文章题目:Exploring the association between socioeconomic inequalities in chronic respiratory disease and all-cause mortality in China: findings from the China Health and Retirement Longitudinal Study DOI:10.3389/fpubh.2024.1472074 中文…...
【大模型系列篇】基于Ollama和GraphRAG v2.0.0快速构建知识图谱
GraphRAG是一种结合了知识图谱和大型语言模型的检索增强生成(RAG)技术。它通过引入图结构化的知识表示和处理方法,显著提升了传统RAG系统的能力,为处理复杂和多样化数据提供了强有力的支持。更多介绍可以跳转《最强检索增强技术Gr…...
Wincc管对象的使用
Wincc管对象的使用 管对象的调用多边形管T形管双T形管管弯头管道大小调整 管对象的调用 打开【图形编辑器】 多边形管 多边形管如下: 一根管子的顶点数是两个,如果修改顶点数,管子就有多少个端点。 修改顶点数为5 此时点击端点然后拖动&#…...
springboot--页面的国际化
今天来实现页面中的国际化 首先,需要创建一个新的spring boot项目,导入前端模板,在我的博客中可以找到,然后将HTML文件放在templates包下,将其他的静态资源放在statics包下,如下图结构 页面的国际化主要在首…...
记 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 #管理员权限才能创建数据库 USER root # 设置入口点…...
c++关键字new
链接:【C】C中的new关键字用法详解...
数字内容体验的核心价值是什么?
个性化推荐提升满意度 在数字内容体验的构建中,个性化推荐已成为提升用户满意度的核心策略。通过分析用户行为数据、偏好标签及场景特征,系统能够精准匹配内容资源,减少信息过载带来的决策疲劳。例如,基于用户画像的动态推荐算法…...
通过实施最小权限原则(POLP)来保护敏感数据
在处理机密信息时,应始终将确保组织的敏感数据安全放在首位。无论是制定新政策还是参与项目协作,都应采取一切必要预防措施,确保对任何敏感信息进行恰当的访问控制和存储管理。 最小权限原则(POLP)是企业保护客户与员工数据、财务记录、知识…...
VBA即用型代码手册:文档Document
我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…...
【力扣hot100题】(089)最长有效括号
这题目真是越做越难了。 但其实只是思路很难想到,一旦会了方法就很好做。 但问题就在方法太难想了…… 思路还是只要遍历一遍数组,维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。 光是知道这个还不够,看了答案…...
为什么需要「实体识别」以及 RAG如何和实体识别结合用
🤖 为什么要做「实体识别」? 实体识别(Named Entity Recognition, NER) 是自然语言处理(NLP)中的一种基础技术,它的目标是: 从文本中识别出“有意义”的实体信息,如人名…...
初级社会工作者考试精选题库
通过练习题库中的题目,考生能了解考试的题型、难度分布以及命题规律,明确备考的重点和难点,有针对性地复习知识点,避免盲目备考。 精选练习题 1、社会工作者小王在为社区孤寡老人提供服务时,总是把他们当成自己的父母来…...
Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification
Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification 目录 Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification`AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)`功能概述参数解释`AutoModelForSequen…...
图书管理系统(Python)
运行结果: 源代码: # 定义一个图书类 class Book: def __init__(self, title, author, isbn): self.title title self.author author self.isbn isbn def show_info(self): print(f"{self.title},{self.author},{self.isbn}") # 图书列表…...
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(4卷)任务书
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(4卷)任务书 背景描述:模块A:大数据平台搭建(容器环境)(15分)任务一:Hadoop 完全分布式安装配置任务二…...
装系统的一天!镜像系统!
虚拟机可以装系统,我们都知道,但是虚拟机可以装几个系统呢? macOS: 如何在 Windows 电脑上装 macOS 系统?_windows装mac-CSDN博客 Win10: Win10镜像(官方正版)下载及虚拟机配置(保姆级教程…...
Wincc脚本全部不运行
Wincc脚本全部不运行 前言解决办法操作步骤 前言 这里主要是指旧项目移植到Wincc的高版本,移植后界面的一些功能均会失效。(例如脚本不执行,项目编辑器不可用等情况) 解决办法 Wincc的项目文件中有Dcf文件,Dcf文件包…...
第三节:React 基础篇-React组件通信方案
React 组件通信方案详解及使用场景 以下是 React 组件通信的常用方法及其适用场景,以层级结构呈现: 一、父子组件通信 1. Props 传递 • 实现方式: • 父组件通过 props 向子组件传递数据。 • 子组件通过回调函数 (onEvent) 通知父组件更…...
✨ MOS开关的非线性因素详解 ✨
MOS 开关在模拟电路、开关电源等应用中广泛使用,但其导通特性存在非线性,可能导致信号失真或系统性能下降。以下是主要非线性因素及解决思路: 🔧 1. 导通电阻(Ron)的非线性 机理: Ron 并非固定值…...
解决vcpkg使用VS2022报错问题
转自个人博客:解决vcpkg使用VS2022报错问题 最近,在把Visual Studio2019完全更新到最新Visual Studio2022后,原使用的vcpkg无法正常安装包,会报如下与Visual Studio 2022相关的错误: error: in triplet x64-windows-m…...
基于支持向量回归(SVR)的空气质量预测
基于支持向量回归(SVR)的空气质量预测 1.作者介绍2.支持向量回归(SVR)算法介绍2.1 算法原理2.2 关键概念2.3算法特点2.4与其他回归方法对比 3.基于支持向量回归(SVR)的空气质量预测实验3.1数据集介绍3.2代码…...
【数据结构】排序
目录 1.排序的概念及其运用 1.1排序的概念 1.2常见排序算法 2插入排序 2.1直接插入排序 2.1.1基本思想 2.1.2代码实现 2.1.3特性总结 2.2 希尔排序 2.2.1基本思想 2.2.2代码实现 3.选择排序 3.1选择排序 3.1.1基本思想 3.1.2代码实现 3.1.3特性总结 3.2 堆排…...
4185 费马小定理求逆元
4185 费马小定理求逆元 ⭐️难度:简单 🌟考点:费马小定理 📖 📚 import java.util.Scanner; import java.util.Arrays;public class Main {static int[][] a;public static void main(String[] args) {Scanner sc …...
低代码控件开发平台:飞帆中粘贴富文本的控件
效果: 链接: https://fvi.cn/729...
偶氮二异丁腈(AIBN)的物化性质及其在合成中的应用
偶氮二异丁腈(AIBN)是一种常用的自由基引发剂,是一种白色结晶性粉末,不溶于水,但溶于甲醇、乙醇、丙酮、乙醚、甲苯等有机溶剂和乙烯基单体。 AIBN在60℃以上会分解形成异丁腈基,从而引发自由基反应。其分解温度区间为50ÿ…...
3.1.3.2 Spring Boot使用Servlet组件
在Spring Boot应用中使用Servlet组件,可以通过注解和配置类两种方式注册Servlet。首先,通过WebServlet注解直接在Servlet类上定义URL模式,Spring Boot会自动注册该Servlet。其次,通过创建配置类,使用ServletRegistrati…...
java——HashSet底层机制——链表扩容和树化
HashSet在Java中是基于HashMap实现的,它实际上是将所有元素作为HashMap的key存储,而value则统一使用一个静态的Object对象(Present)作为占位符。 1.举例演示 下面我们就举例说明一下,HashSet集合中,一个节点上的链表添加数据以及…...
玩转Docker | 使用Docker搭建Blog微博系统
玩转Docker | 使用Docker搭建Blog微博系统 前言一、Blog介绍项目简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Blog服务下载镜像创建容器检查容器状态设置权限检查服务端口安全设置四、访问Blog系统访问Blog首页登录Blog五、总结前言 在数字…...
Linux中的Vim与Nano编辑器命令详解
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中代码与命令建议通过官方渠道验证。 在Linux系统中,文本编辑是最常用的…...
G1垃圾回收器介绍
G1垃圾回收器简介 全称:Garbage-First Garbage Collector。目的:G1垃圾回收器是为了替代CMS垃圾回收器而设计的,它旨在提供更好的垃圾回收性能和可预测性,特别是在处理大内存堆时。特点:G1是一种服务器端的垃圾回收器…...
Python学习笔记(三)
文章目录 Python函数详解基本概念定义函数函数调用参数类型1. 位置参数2. 默认参数3. 关键字参数4. 可变参数 返回值函数作用函数中的变量作用域规则 递归函数Lambda函数函数注解装饰器文档字符串其他重要概念闭包生成器函数高阶函数 Python函数详解 基本概念 函数是Python中…...
Hqst的超薄千兆变压器HM82409S在Unitree宇树Go2智能机器狗的应用
本期拆解带来的是宇树科技推出的Go2智能机器狗,这款机器狗采用狗身体形态,前端设有激光雷达,摄像头和照明灯。在腿部设有12个铝合金精密关节电机,并配有足端力传感器,通过关节运动模拟狗的运动,并可做出多种…...
TaskFlow开发日记 #1 - 原生JS实现智能Todo组件
一、项目亮点 - 📌 **零依赖实现**:纯原生JavaScript CSS3 - 📌 **数据持久化**:LocalStorage自动同步 - 📌 **交互优化**:收藏置顶 动态统计 - 📌 **响应式设计**:完美适配移动端…...
es的告警信息
Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,在运行过程中可能会产生多种告警信息,以提示用户系统中存在的潜在问题或异常情况。以下是一些常见的 ES 告警信息及其含义和处理方法: 集群健康状态告警 信息示例…...
vue实现在线进制转换
vue实现在线进制转换 主要功能包括: 1.支持2-36进制之间的转换。 2.支持整数和浮点数的转换。 3.输入验证(虽然可能存在不严格的情况)。 4.错误提示。 5.结果展示,包括大写字母。 6.用户友好的界面,包括下拉菜单、输…...
责任链设计模式(单例+多例)
目录 1. 单例责任链 2. 多例责任链 核心区别对比 实际应用场景 单例实现 多例实现 初始化 初始化责任链 执行测试方法 欢迎关注我的博客!26届java选手,一起加油💘💦👨🎓😄😂 最近在…...
Matlab 分数阶PID控制永磁同步电机
1、内容简介 Matlab 203-分数阶PID控制永磁同步电机 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Java中LocalDateTime类
Java中的日期类 Date类LocalDateTime类创建LocalDateTime对象1 获取当前时间2 获取自己指定时间3 字符串创建日期 获取当前日期的信息1获取当前日期的年月日 时分秒2 获取当前日期周几\当年第几天\当月第几天3 获取当前⽇期所在周的周⽇和周⼀ 日期的运算1日期加减天数2 日期加…...