使用LSTM(长短期记忆网络)模型预测股票价格的实例分析

news2024/11/24 13:04:21

一:LSTM与RNN的区别

LSTM(Long Short-Term Memory)是一种特殊的循环神经网络(RNN)架构。LSTM是为了解决传统RNN在处理长序列数据时遇到的梯度消失或梯度爆炸问题而设计的。

在传统的RNN中,信息通过隐藏状态在时间步之间传递,但由于权重的重复应用,随着时间的推移,梯度可能会迅速减小或增大,导致网络难以学习长期依赖关系。LSTM通过引入了一种称为“”(gates)的机制来解决这个问题,这些门可以控制信息的流动,从而允许网络在长序列中有效地保持和传递信息。

LSTM的四个主要组成部分是:

1: 细胞状态(Cell State):一个流动的载体,它携带有关观察到的输入序列的信息。细胞状态可以跨越时间步传递信息。

2: 遗忘门(Forget Gate):决定哪些信息应该从细胞状态中丢弃。遗忘门会读取当前的输入和上一时间步的隐藏状态,并输出一个0到1之间的数值,表示保留信息的程度。

3: 输入门(Input Gate):决定哪些新信息将被存储到细胞状态中。输入门由两部分组成:一个sigmoid层决定哪些值将要更新,和一个tanh层创建一个新的候选值向量,它们将会被加入到状态中。

4: 输出门(Output Gate):决定下一个隐藏状态的值。它读取当前的细胞状态和输入,并通过一个sigmoid层和一个tanh层来计算输出值。

LSTM的这些门通过使用sigmoid激活函数来决定信息的保留或丢弃,而tanh激活函数则用来创建新的候选值或输出值。

由于其设计上的优势,LSTM能够捕捉长期依赖关系,因此在处理复杂序列数据时非常有效。

二:使用LSTM预测股票价格

一个典型的LSTM实例可以是股票价格预测。在这个例子中,我们可以使用LSTM模型来学习股票价格的时间序列数据,并尝试预测未来的价格走势。

为了实现这个实例,我们需要完成以下几个步骤:

  1. 数据收集:获取股票价格的历史数据。
  2. 数据预处理
    • 数据清洗:去除异常值。
    • 数据归一化:使用MinMaxScaler将数据缩放到0到1之间。
  3. 构建LSTM模型
    • 设计网络结构:确定LSTM层的数量和每层的神经元数量。
    • 添加全连接层:用于输出预测结果。
    • 编译模型:选择优化器和损失函数。
  4. 训练模型:使用历史数据训练模型。
  5. 预测和评估:使用测试数据评估模型的性能。

接下来将演示一个使用Keras库中的LSTM(长短期记忆网络)模型进行股票价格预测的简单示例。

导入必要的库

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import LSTM, Dense
plt.rcParams['font.sans-serif'] = ['SimHei'] 
plt.rcParams['axes.unicode_minus'] = False 
  • numpy:用于数值计算。
  • matplotlib.pyplot:用于绘制图表。
  • MinMaxScaler:来自sklearn.preprocessing,用于将数据缩放到指定的范围(这里是0到1)。
  • Sequential:来自keras.models,用于创建神经网络模型。
  • LSTMDense:来自keras.layers,分别是LSTM层和全连接层。
  • plt.rcParams:设置matplotlib绘图参数,确保中文字体可以正确显示,并处理坐标轴的负号。

生成假设的股票价格数据集

prices = np.random.rand(100, 1).cumsum()
  • 使用numpy生成一个100行1列的随机数组,并将其累加,模拟股票价格走势。

数据预处理

prices_reshaped = prices.reshape(-1, 1)
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_prices = scaler.fit_transform(prices_reshaped)
  • 将一维的prices数组转换为二维,,因为MinMaxScaler需要二维输入。例如,如果 prices 是一个包含100个元素的一维数组,那么 prices_reshaped 将会是一个形状为 (100, 1) 的二维数组。
  • 创建一个MinMaxScaler对象,并将其用于缩放数据到0和1之间。

创建数据集

X, Y = [], []
for i in range(60, len(scaled_prices)):
    X.append(scaled_prices[i-60:i, 0])
    Y.append(scaled_prices[i, 0])
X, Y = np.array(X), np.array(Y)
  • 对于数据集中的每个点,使用过去60个时间点的数据作为输入X,并使用第61个时间点的数据作为输出Y
  • 遍历归一化后的股票价格数据:

    • for i in range(60, len(scaled_prices))::这个循环从索引60开始,直到scaled_prices数组的末尾。索引60意味着每个样本包含60个时间步长的数据。
  • 构建输入数据X:

    • X.append(scaled_prices[i-60:i, 0]):对于每个索引i,从scaled_prices中取出从i-60i-1的60个数据点,这些数据点将作为模型的输入。这里[:, 0]确保只选择一列数据,因为scaled_prices是一个二维数组。
  • 构建输出数据Y:

    • Y.append(scaled_prices[i, 0]):对于每个索引i,从scaled_prices中取出索引为i的数据点,这个数据点将作为模型的输出,即第61个时间步长的股票价格。

经过这个循环,X将包含40个的60个时间步长的数据,而Y将包含对应时间步长之后的股票价格。这样的数据结构非常适合用于训练时间序列预测模型LSTM,其中模型需要学习如何根据过去60个时间步长的数据来预测下一个时间步长的价格。

重构输入数据

X = np.reshape(X, (X.shape[0], X.shape[1], 1))
  • X: 这是一个NumPy数组,包含了模型的输入数据。

  • np.reshape(): NumPy中的函数,用于在不改变数据内容的情况下改变数组的形状。

  • (X.shape[0], X.shape[1], 1): 这是重塑操作的目标形状。

    • X.shape[0]: 表示X数组的第一个维度40,即样本的数量
    • X.shape[1]: 表示X数组的第二个维度60,即每个样本的特征数量
    • 1: 表示为每个样本增加一个维度,使其成为三维数组。

在LSTM网络中,期望的输入数据格式通常是三维的,其形状为 [样本数量, 时间步长, 特征数量]在这个例子中,每个样本是一个时间序列,包含了过去60个时间点的数据,而每个时间点只有一个特征(股票价格)。通过这行代码,X数组被重塑为以下形状:

  • [样本数量(40), 时间步长(60), 特征数量(1)]

这种形状是LSTM层能够正确处理的数据格式。

构建LSTM模型

model = Sequential()
model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], 1)))
model.add(LSTM(units=50))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mean_squared_error')
  • 创建一个序贯模型。
  • 添加两个LSTM层,第一个LSTM层返回序列,第二个不返回。
  • 添加一个全连接层,输出一个值。
  • 编译模型,使用Adam优化器和均方误差损失函数。

训练模型

model.fit(X, Y, epochs=1, batch_size=1, verbose=2)
  • 使用数据XY训练模型,设置一个周期,批量大小为1。
  • verbose=2:输出每个epoch的进度以及每个epoch结束时的一些统计信息(如损失值)。

预测

predicted_prices = model.predict(X)
predicted_prices = scaler.inverse_transform(predicted_prices)
  • 使用模型进行预测。
  • 将预测结果从缩放后的数据转换回原始数据范围。

可视化结果

plt.figure(figsize=(10, 6))
plt.plot(prices, color='blue', label='实际价格')
plt.plot(np.arange(60, 100), predicted_prices, color='red', label='预测价格')
plt.title('股票价格预测')
plt.xlabel('时间')
plt.ylabel('价格')
plt.legend()
plt.show()
  • 绘制实际价格和预测价格的图表,蓝色表示实际价格,红色表示预测价格。可视化图表如下:

可以看出建立的LSTM模型的预测效果较好。

三:每日股票行情数据

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

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

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

相关文章

电动机制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

电动机制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型。5G智能工厂与物联数字孪生平台的融合应用,为电动机制造业的数字化转型铺设了一条高速通道。这一创新模式不仅极大地提升了生产效率,还深刻改变了产品的设计、生产、管理及运…

在全球化时代成为超级个体:Web3、个人品牌与AI工具的融合

随着Web3技术和人工智能的快速发展,个人品牌建设与创作者经济正在迎来前所未有的机遇。《Web3Brand》是一个专注于帮助用户理解Web3技术、建立和增强个人品牌、提升创作者经济实力,并利用AI工具提高工作效率的平台。本文将探讨该博客如何通过提供播客、案例分析、策略指南和工…

redis内存清理和linux系统清理缓存以及redis启动

1清空所有数据库 redis-cli FLUSHALL 2清空所有数据库redis-cli FLUSHDB 3. 删除指定的缓存键 redis-cli DEL <key>4. 设置键过期 redis-cli EXPIRE <key> <seconds>例如&#xff1a; redis-cli EXPIRE mykey 605.启动redis 这个启动命令要在/usr/loca…

sql 中名字 不可以 包含 mysql中 具有 特定意义 的单词

这种sql执行不报错 这种sql执行报错 所以sql中名字不可以使用mysql中具有特定意义的单词 以此文章作为警告&#xff0c;我下次起名字不可以使用 mysql中具有特殊意义的字符 就因为这个导致我搞了一个多小时&#xff0c;急死我了&#xff0c;周五就要前后端联调了。下次千万不…

NSmartProxy:一款.NET开源、跨平台的内网穿透工具

前言 今天大姚给大家分享一款.NET开源、免费&#xff08;MIT License&#xff09;、跨平台的内网穿透工具&#xff0c;采用.NET Core的全异步模式打造&#xff1a;NSmartProxy。 内网穿透工具介绍 内网穿透工具是一种能够允许用户从互联网上的任何地方安全地访问并管理处于内…

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题&#xff0c;就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的&#xff0c;就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream> # include<vector>…

数据结构:线性表的顺序存储

文章目录 &#x1f34a;自我介绍&#x1f34a;线性表的顺序存储介绍概述例子 &#x1f34a;顺序表的存储类型设计设计思路类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我…

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导&#xff1a; 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规&#xff0c;其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性&#xff0c;欧盟REACH法规规定&#…

【H2O2|全栈】关于HTML(2)HTML基础(一)

HTML相关知识 目录 前言 准备工作 标签的具体分类&#xff08;一&#xff09; 本文中的标签在什么位置使用&#xff1f; 属性 标题标签 段落标签 文本格式化标签 分类汇总 计算机输出标签 ​编辑分类汇总 引文&#xff0c;引用标签 分类汇总 预告和回顾 UI设计…

SAP学习笔记 - 开发04 - Fiori UI5 开发环境搭建

上一章学习了 CDSView开发环境的搭建&#xff0c;以及CDSView相关的知识。 SAP学习笔记 - 开发03 - CDSView开发环境搭建&#xff0c;Eclipse中连接SAP&#xff0c;CDSView创建-CSDN博客 本章继续学习SAP开发相关的内容&#xff0c; - Fiori UI5的开发环境搭建 - 安装VSCode …

JavaScript Web API入门day7

目录 1.图片切换模块 2.鼠标经过以及离开中等盒子&#xff0c;大盒子的处理 3.黑色遮罩层的位置以及放大功能 4.放大镜的完整代码 1.图片切换模块 效果图&#xff1a; 思路分析&#xff1a; ①&#xff1a;鼠标经过小盒子&#xff0c;左侧中等盒子显示对应中等图片 获取对…

2024 年高教社杯全国大学生数学建模竞赛B题第一问详细解题思路(终版)

示例代码&#xff1a; from scipy.stats import norm# 定义参数 p0 0.10 # 标称次品率 alpha 0.05 # 95% 信度下的显著性水平 beta 0.10 # 90% 信度下的显著性水平 E 0.01 # 允许的误差范围# 计算95%信度下的样本量 Z_alpha_2 norm.ppf(1 - alpha / 2) n_95 ((Z_alp…

ICM20948 DMP代码详解(7)

接前一篇文章&#xff1a;ICM20948 DMP代码详解&#xff08;6&#xff09; 上一回讲解了EMP-App中的入口函数main()中重点关注的第2段代码的前一个函数inv_icm20948_reset_states&#xff0c;本回讲解后一个函数inv_icm20948_register_aux_compass。 为了便于理解和回顾&#…

mipi协议:多通道分配和合并

Multi-Lane Distribution and Merging: CSI-2 是一个通道可扩展的规范。对于需要比单个数据通道提供更多带宽的应用&#xff0c;或者那些希望避免高时钟频率的应用&#xff0c;可以通过增加数据通道的数量来扩展数据路径&#xff0c;从而近似线性地提高总线的峰值带宽。为了确保…

CocosCreator中使用protobuf

(前提) 工欲善其事,必先利其器. 要想在CocosCreator中使用protobuf,我们首先要安装NodeJs.安装教程可参考Node.js安装及环境配置详细教程_nodejs安装及环境配置-CSDN博客,已经很详细了.NodeJs自带npm, 我们要用npm下载protobufjs.可能你会问npm是什么? npm是NodeJs自带的包管理…

spring中添加@Test注解测试

1、添加maven依赖 <!-- 添加test方便测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><grou…

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信…

如何利用评论进行有效的 ASO

如何利用评论进行有效的ASO的问题的答案通常以“正面评论”一词开始。确实&#xff0c;这句话首先浮现在脑海中。但这个问题的答案包括负面评论、用户体验、提高知名度、评分、根据评论优化应用程序以及许多其他有趣的点。这里几乎没有无聊的统计数据&#xff0c;这些数字也不会…

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别&#xff0c;以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTableView 的…

lamp的脚本部署

l是linux,a是apache,m是mysql&#xff0c;p是php。最基本的动态网页搭建。语法后面再补几篇&#xff0c;现在先写吧。 一、环境准备 1.1、rocklinux换源&#xff0c;关掉防火墙&#xff0c;selinux&#xff0c;时间同步 #cp rocky* /a # 阿里 sed -e s|^#mirrorlist|mirro…