用RNN(循环神经网络)预测股票价格

news2024/11/22 16:04:19

RNN(循环神经网络)是一种特殊类型的神经网络,它能够处理序列数据,并且具有记忆先前信息的能力。这种网络结构特别适合于处理时间序列数据、文本、语音等具有时间依赖性的问题。RNN的核心特点是它可以捕捉时间序列中的长期依赖关系。

RNN的基本结构

RNN由多个重复的单元组成,每个单元可以看作是一个小型的神经网络。这些单元按顺序处理序列中的每个元素,并且每个单元的输出不仅取决于当前的输入,还取决于前一个单元的输出。这种结构使得RNN能够在序列的不同时间点之间传递信息。

RNN的工作原理

  1. 输入:RNN接收一个序列作为输入,序列中的每个元素在不同的时间步骤被输入到网络中。

  2. 隐藏层:每个时间步骤,RNN都会计算一个隐藏状态,这个状态是当前输入和前一时间步骤隐藏状态的函数。隐藏状态可以看作是网络对到目前为止所观察到的所有输入的总结。

  3. 输出:在每个时间步骤,RNN可以产生一个输出,这个输出是基于当前的隐藏状态。对于某些任务,如语言模型或文本生成,输出可能是序列的下一个元素。

  4. 循环连接:RNN的每个单元都包含一个循环连接,这个连接将当前单元的输出反馈到下一个时间步骤的相同单元的输入中。这种循环连接是RNN能够处理序列数据的关键。

RNN的变体

由于标准的RNN在处理长序列时会遇到梯度消失或梯度爆炸的问题,因此出现了一些改进的RNN结构:

  1. LSTM(长短期记忆网络):LSTM通过引入门控机制(输入门、遗忘门、输出门)来解决梯度消失的问题,使得网络能够学习到长期依赖关系。

  2. GRU(门控循环单元):GRU是LSTM的一个简化版本,它将LSTM中的三个门减少为两个门(更新门和重置门),并且将细胞状态和隐藏状态合并为一个。

  3. 双向RNN(Bi-RNN):在双向RNN中,序列的每个元素同时被两个RNN处理,一个处理正向序列,另一个处理反向序列。这允许网络在每个时间步骤同时考虑前后文信息。

RNN的应用

RNN在许多领域都有广泛的应用,包括:

  • 自然语言处理:如机器翻译、文本摘要、情感分析、语言模型。
  • 语音识别:将语音信号转换为文本。
  • 时间序列预测:如股票价格预测、天气预测。

RNN的这些应用通常涉及到序列数据的处理,其中序列中的元素之间存在时间上的依赖关系。通过学习这些依赖关系,RNN能够预测序列的未来走向或理解序列的模式。

要实现一个预测股票价格的循环神经网络(RNN)模型,我们需要考虑以下几个关键步骤:

  1. 数据收集:获取股票价格历史数据,通常包括开盘价、最高价、最低价、收盘价和成交量等。
  2. 数据预处理:包括数据清洗、归一化或标准化、序列构造等,以便于模型能够更好地学习和泛化。
  3. 模型设计:选择合适的RNN架构,如简单RNN、LSTM或GRU,并设计网络层结构。
  4. 模型训练:使用训练数据对模型进行训练,并调整参数以优化性能。
  5. 预测与评估:使用测试数据评估模型的预测能力,并选择合适的评估指标,如均方误差(MSE)。

接下来,我将提供一个简化的RNN模型实现案例,用于预测股票价格。

假设已经收集到了股票价格的历史数据,并将其存储在一个名为stock_prices.csv的文件中。数据预处理和模型设计将基于这个假设数据进行。

数据入口:‌​‌‬‬​‬​​​​‍​‬​‍‌​‬‌‍​​​​​‍​​​​​‬​‬​⁠‬‬用于学习的财经数据 - 飞书云文档 (feishu.cn)

接下来将使用Python来编写股票价格预测脚本,利用TensorFlow和Keras库构建和训练一个循环神经网络(RNN)模型。

Step1:导入所需的库

import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN
from tensorflow.keras.optimizers import Adam
import numpy as np

这里导入了数据处理(pandas)、数据预处理(MinMaxScaler)、神经网络模型构建(Sequential, Dense, SimpleRNN)和优化器(Adam)相关的库。

Step2:加载数据

data = pd.read_csv('stock_prices.csv')

使用pandas库从CSV文件中读取股票价格数据。

Step3:选择特征和标签

features = data[['Open', 'High', 'Low', 'Volume']]
labels = data['Close']

从数据中提取开盘价、最高价、最低价和成交量作为特征(用于训练模型),收盘价作为标签(模型的预测目标)。

Step4:数据归一化

scaler = MinMaxScaler(feature_range=(0, 1))
scaled_features = scaler.fit_transform(features)
scaled_labels = scaler.fit_transform(labels.values.reshape(-1, 1))

使用MinMaxScaler将特征和标签数据缩放到0和1之间,以帮助神经网络更好地学习。

这里创建了一个MinMaxScaler实例,并指定了特征范围feature_range为(0, 1)。这意味着所有的特征将被缩放到0和1之间。

fit_transform方法执行两个操作:首先,fit方法计算用于缩放数据的参数(即每个特征的最小值和最大值)。然后,transform方法使用这些参数来实际转换数据。features是包含所有特征数据的DataFrame,调用fit_transform后,这些特征将被缩放到0和1之间的范围。

这一步与上一步类似,但是它应用于标签数据。首先,由于labels是一个Series,使用.values将其转换为NumPy数组。然后,.reshape(-1, 1)将数组重塑为一个列向量,这是因为fit_transform期望输入数据的形状为 [n_samples, n_features]。在这个例子中,n_features是1,因为我们只有一个标签(收盘价)。

Step5:构造序列数据

def create_dataset(data, look_back=1):
    X, Y = [], []  # 初始化两个列表,X用于存储特征,Y用于存储标签
    for i in range(len(data) - look_back):  # 遍历数据,直到长度减去look_back
        X.append(data[i:(i + look_back), :])  # 将从当前位置到look_back的数据追加到X列表
        Y.append(data[i + look_back, :])  # 将look_back之后的数据追加到Y列表
    return np.array(X), np.array(Y)  # 将列表转换为NumPy数组并返回

look_back = 1
X, Y = create_dataset(scaled_features, look_back)

参数说明:

  • data: 输入的时间序列数据,通常是二维数组,其中每一行代表一个时间步,每一列代表一个特征。
  • look_back: 一个整数,表示在构造特征序列时回看的历史时间步数。默认值为1,表示只使用前一个时间步的数据作为特征。

函数内部逻辑:

  1. 初始化两个空列表 X 和 Y,用于存储特征和标签。

  2. 使用 for 循环遍历数据,循环的范围是 len(data) - look_back。这是因为我们需要确保对于每个起始索引 i,都有足够的后续数据来构造一个长度为 look_back 的特征序列和一个对应的标签。

  3. 在每次循环中,使用切片操作 data[i:(i + look_back), :] 来从数据中提取长度为 look_back 的子序列,并将其追加到 X 列表中。

  4. 同时,提取 look_back 之后的数据行 data[i + look_back, :] 作为标签,并将其追加到 Y 列表中。

  5. 循环结束后,使用 np.array 将 X 和 Y 列表转换为 NumPy 数组,并返回这两个数组。

调用 create_dataset 函数:

look_back = 1
X, Y = create_dataset(scaled_features, look_back)

这里,look_back 被设置为 1,表示每个特征序列将只包含一个时间步。然后,create_dataset 函数被调用来处理 scaled_features 数据(假设这是之前已经归一化的特征数据)。函数返回的 X 和 Y 将被用作训练模型的输入和目标数据。

简而言之,这段代码的目的是将原始时间序列数据转换为适合训练序列预测模型的形式,其中 X 包含多个时间步的特征序列,而 Y 是对应的标签数组。

Step6:创建模型

model = Sequential()
model.add(SimpleRNN(units=50, return_sequences=True, input_shape=(look_back, features.shape[1])))
model.add(SimpleRNN(units=50))
model.add(Dense(1))

创建一个序贯模型(Sequential),并添加了两层SimpleRNN和一个输出层(Dense)。第一个SimpleRNN层返回序列,第二个不返回。

Step7:编译模型

model.compile(optimizer=Adam(learning_rate=0.001), loss='mean_squared_error')

使用Adam优化器和均方误差损失函数来编译模型。

Step8:训练模型

model.fit(X, Y, epochs=100, batch_size=32, verbose=1)

使用提供的特征和标签数据训练模型,设置迭代次数为100,批量大小为32,并显示训练过程。

Step9:预测

predicted_prices = model.predict(X)
predicted_prices = scaler.inverse_transform(predicted_prices)
df_predicted = pd.DataFrame(predicted_prices, columns=['Predicted Close Price'])
df_predicted

使用训练好的模型进行预测,并将预测结果从归一化后的值转换回原始尺度,结果如下:

761d1452662e48579b19c831e6f47be8.png

以上就是用Python编写的一个股票价格预测脚本,利用了TensorFlow和Keras库来构建和训练一个循环神经网络(RNN)模型来预测股票价格的相对完整的过程。

 

想要了解更多多元化的数据分析视角,可以关注之前发布的相关内容。

 

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

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

相关文章

【项目】云备份

云备份 云备份概述框架 功能演示服务端客户端 公共模块文件操作模块目录操作模块 服务端模块功能划分功能细分模块数据管理热点管理 客户端模块功能划分功能细分模块数据管理目录检查文件备份 云备份 概述 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中。…

【网络原理】❤️Tcp 核心机制❤️ 通晓可靠传输的秘密, 保姆式教学, 建议收藏 !!!

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

QT QxOrm CRUD增删改查mysql数据库操作

QT QxOrm CRUD增删改查mysql数据库操作 QxOrm 是一个 C 库,旨在为 C 用户提供对象关系映射 (ORM) 功能。 基于每个类的简单 C 设置函数(如 Java 中的 Hibernate XML 映射文件),QxOrm 库提供以下功能: 持久性&#xff1…

安宝特案例 | AR如何大幅提升IC封装厂检测效率?

前言:如何提升IC封装厂检测效率? 在现代电子产品的制造过程中,IC封装作为核心环节,涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商,负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…

C语言俄罗斯方块(VS2022版)

C语言俄罗斯方块 演示视频一、前置知识1.Win32 API 的使用2.宽字符的使用 二、封装核心数据与框架介绍三、核心操作介绍旋转操作检测操作水平检测竖直检测代码化简 四、源码展示在 tetris.h 中:在 tetris.c 中:在 test.c 中: 以下代码环境为 …

小阿轩yx-Zabbix企业级分布式监控环境部署

小阿轩yx-Zabbix企业级分布式监控环境部署 前言 “运筹帷幄之中,决胜千里之外”监控在 IT 运维中占据着重要地位,按比例说占 30% 也不为过在监控系统开源软件中有很多可选择的工具,但是真正符合要求的、能够真正解决业务问题的监控系统软件…

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,…

OpenHarmony鸿蒙开发( Beta5.0)智能甲醛检测系统实践

样例简介 本项目是基于BearPi套件开发的智能甲醛检测系统Demo,该设备硬件部分主要由小熊派单板套件和和甲醛检测传感器组成。智能甲醛检测系统可以通过云和手机建立连接,可以在手机上设置甲醛浓度阈值,传感器感知到的甲醛浓度超过阈值之后&a…

QQ邮箱“已发送”邮件竟然无法一键清空?看我操作,怎么删除12万+已发送邮件

最近遇到了一个问题,QQ邮箱提示我空间已满,所以我就专门去看看有哪些邮件可以删除,释放点空间。 我直接暴力删除了很多文件夹的邮件,在文件夹管理界面 有“清空”按钮,点一个即可清空。 但是。。。不出意外的话要出意…

南卡、韶音、墨觉:精选三款旗舰骨传导耳机全面对比评测!

在科技日新月异的今天,耳机作为我们日常生活中不可或缺的音频伴侣,正经历着前所未有的变革。特别是骨传导耳机,凭借其独特的声音传导方式和出色的佩戴体验,逐渐成为了运动爱好者和户外探索者的首选。在众多品牌中,南卡…

Pycharm的安装与Conda环境的配置

目录 第一步:下载并安装 PyCharm 社区版 第二步:创建新项目并配置 Python 解释器 第三步:配置 Conda 环境 第四步:验证环境 第五步:测试 PyTorch 第六步:测试基本 PyTorch 代码 第一步:下…

替代区块链

随着比特币的成功,人们逐渐意识到区块链技术的潜力,并随之出现了迅速的发展,各种区块链协议、应用程序和平台相应产生。 需要指出的是,在这种多元的局面下,很多项目迅速失去了它们的吸引力。事实上,有不少项…

深圳MES系统在制造业的应用与发展

深圳MES在制造业的应用与发展呈现以下几个特点: 应用范围广泛:深圳制造业涵盖了电子、通信、汽车、机械等多个领域,MES系统在这些领域的应用非常广泛。不同行业的企业可以根据自身的需求和特点,定制化地应用MES系统来实现生产管理…

测试即服务(TaaS):概念、优势及应用场景!

引言 随着数字化转型的深入发展,软件质量和用户体验变得愈发重要。传统的软件测试方法已经难以满足现代企业对于快速迭代和高质量交付的需求。在此背景下,“测试即服务”(Testing as a Service, TaaS) 模式应运而生,为软件测试带来了新的解决…

基于SpringBoot+Vue+MySQL的足球俱乐部管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统足球俱乐部管理…

Gtest(Google Test)使用

下面Gtest是在arm-linux下运行的 https://download.csdn.net/download/qq_31868891/89729426 一、下载编译 1.下载gtest代码 https://github.com/google/googletest 2.配置编译 vscode安装CMake Tools 将上面下载的gtest代码文件夹拖到vscode里,然后选择对应的…

SAP 凭证的替代传输GGB1

SAP 凭证的替代传输GGB1 之前没有留意过,前人一直是直接改的,搜索了一下是可以这样弄得 1.一般通过OBBH,配置的凭证替代,产生的请求号,从开发机传输不到生产机。只能通过GGB1来传输。在GGB1里面选择要传输的替代 选中…

BookStack在线文档管理系统本地Docker部署与远程访问详细教程

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

LEAN类型系统属性之规范性(Regularity)注解

在 《小结》 中,列出LEAN类型系统所定义的全部规律,下面 关于 LEAN 属性 的一些推论(Lemma)进行注解。主要是其规范性(Regularity),以说明LEAN类型系统是完备构建的(well founded&am…

Java+selenium+chrome+linux/windows实现数据获取

背景:在进行业务数据获取或者自动化测试时,通常会使用模拟chrome方式启动页面,然后获取页面的数据。在本地可以使用windows的chromedriver.exe进行打开chrome页面、点击等操作。在linux 下通常使用无界面无弹窗的方式进行操作。接下来是实现方…