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

一: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.rhkb.cn/news/421472.html

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

相关文章

Android SystemUI组件(06)导航栏创建分析虚拟按键

该系列文章总纲链接:专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明: 说明:本章节持续迭代之前章节的思维导图,主要关注左侧SystemBars分析中导航栏部分即可。 1 导航栏创建之makeStatusBarView 通过上一篇文章的…

Java综合实践——学生成绩查询系统

此系列文章收录大量Java经典代码题(也可以算是leetcode刷题指南),剩余文章指路Java题集。希望可以与大家一起探索Java的神秘。3、2、1,请看! 本篇文章将带大家一起来写一个学生成绩查询系统。 目录 系统呈现效果 前…

一些硬件知识(二十二)

二极管(Diode)伏安特性、技术参数和项目中的应用 在正向偏置下,二极管呈现出良好的导电性能,可以允许电流通过;而在反向偏置下,二极管具有很高的阻断能力,几乎不允许电流通过。这是由构成二极管…

new String(),toString()和Arrays.toString()的区别

下面写了一段代码来展示结果 import javax.sound.midi.Soundbank; import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {String str "abc";System.out.println("str:"str);char[] chars st…

Linux编译器-gcc/g++使用

1. 背景知识 1. 预处理(进行宏替换) 2. 编译(生成汇编) 3. 汇编(生成机器可识别代码) 4. 连接(生成可执行文件或库文件) 2. gcc如何完成 格式 gcc [选项] 要编译的文件 [选项] [目标文件] 预处理(进行宏替换) 编…

SSM校园二手交易平台---附源码78592

摘要 SSM校园二手交易平台是针对大学生群体而设计的一款在线交易平台。该平台的目的是为大学生提供一个便捷、安全、可靠的交易渠道,帮助他们买卖二手商品。平台具有以下特点:注重安全性:平台采取严格的用户认证和身份验证机制,确…

【人工智能学习笔记】4_4 深度学习基础之生成对抗网络

生成对抗网络(Generative Adversarial Network, GAN) 一种深度学习模型,通过判别模型(Discriminative Model)和生成模型(Generative Model)的相互博弈学习,生成接近真实数据的数据分…

html 引入 css文档

1. 三种方法 html 引入 css文档有三种方式: 1.1 内部样式表 1.2 外部样式表 1.3 行内样式表

python 学习一张图

python学习一张图,python的特点的是学的快,一段时间不用,忘记的也快,弄一张图及一些入门案例吧。 写一个简单的测试: #!/usr/bin/python # -*- coding: UTF-8 -*- import osdef add_num(a, b):return a bif __name__…

【深度学习】Pytorch基础

目录 梯度下降算法(Gradient Descent)代码实现 梯度下降算法(Gradient Descent) 梯度下降算法在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它的主要目的是通过迭代找到目标函数的最小…

企业会议室预约管理系统

基于springbootvuemysql实现的企业会议室预约管理系统(源码数据库部署视频) ### 主要技术 SpringBoot、Vue、MySQL ### 系统角色 员工、管理员 ### 系统功能 1)管理员:数据统计(会议室使用统计-柱状图、设备状态统计…

通过IDEA的Maven插件清理maven依赖缓冲

问题 有时候,在IDEA编程的时候,会遇到2个服务都依赖同一个模块,但是,其中有1个服务没有生效,但是,在CLI的maven中检查依赖树,没有任何问题,但是在IDEA中那个服务始终就是没有生效。…

计算语言学(一)基础

概率论的几个概念 熵、互信息 神经网络基础 MLP CNN RNN Seq2Seq LSTM Transformer 语料库与知识库

世界时钟 做外贸的朋友你需要这么一个看时间的工具

有很多人需要经常查看世界各地的时间,以前的办法就是去网上找时间,一个个对一下,这样是比较麻烦的,而且效率也非常低。 其实我们可以非常智能的管理这些时间时钟,让你更直观的,便捷的了解世界各地时间。 …

TESSY创建以及设计一个测试用例

我们以tessy5.1 IDE为例,给大家展示编写一个测试用例的过程。 还不会创建工程的,可以参考以下这篇文章: TESSY创建单元测试或集成测试工程_tessy 集成测试-CSDN博客 接下来我们以这个作为开始状态进行介绍 1、添加源文件 2、添加头文件路径…

Vulnhub-RickdiculouslyEasy靶场(9个flag)

flag1 端口9090有一个flag flag2 13337端口 flag3 使用dirb进行扫描网站的80端口,发现一些敏感文件 访问80端口,没有发现有效信息 访问passwords目录 访问FLAG.txt 再返回访问passwords.html文件 查看页面源代码发现一个密码 flag4 之前扫描到了robo…

一些硬件知识(二十)

单端差动放大器并不是指“单输入单输出”。它的意思是:输入端为差分输入,而输出为单端输出。 低压差线性稳压器(LDO,Low Dropout Regulator)是一种常见的线性稳压器,具有低输入输出电压差的特点&#xff0c…

全视通医院智慧后勤全场景管理+一体化解决方案,让医院管理提质增效

在 “十四五” 时期,公立智慧医院建设正如火如荼地进行着。2021年,国家卫生健康委医政医管局发布《医院智慧管理分级评估标准体系(试行)》,从政策层面给出了推进面向医务人员的“智慧医疗”、面向患者的“智慧服务”、…

线性方程组求解——预处理Preconditioning介绍

为什么需要预处理? 工程中出现的大规模线性方程组往往是病态的, 对数值求解带来很大的困难: ▶ 使得迭代法(比如Krylov 子空间迭代法) 收敛变得非常缓慢 ▶ 对数值解的精度产生很大的影响(在有限精度计算情形下) 对于第一个问题, 当前的有效处理方法是预处理, 预处…

Flutter的升级和降级步骤

升级 1.版本升级 // 升级到指定版本 flutter upgrade 版本号 // 升级到最新版本 flutter upgrade 2. 更新开发配置 启动 Android Studio。 打开 Settings 对话框,查看 SDK Manager。 如果你已经打开了一个项目,请打开 Tools > SDK Manager。 如果…