使用注意力机制的 LSTM 彻底改变时间序列预测

目录

  • 一、说明
  • 二、LSTM 和注意力机制简介
  • 三、为什么要将 LSTM 与时间序列注意力相结合?
  • 四、模型架构
    • 训练与评估
  • 五、验证
  • 六、计算指标
  • 七、结论

一、说明

   在时间序列预测领域,对更准确、更高效的模型的追求始终存在。深度学习的应用为该领域的重大进步铺平了道路,其中,长短期记忆 (LSTM) 网络与注意力机制的集成尤其具有革命性。本文深入探讨了一个实际案例研究:使用这种复杂的架构预测 Apple Inc. (AAPL) 的股价。

   重要的是要承认这些想法的起源:韦恩·格雷。Wayne 是一名金融分析师,在人工智能方面拥有专业知识。在不透露太多的情况下,韦恩很棒,他的想法更上一层楼。这篇文章试图解释我们的对话,只是他研究的开始!

二、LSTM 和注意力机制简介

   LSTM 网络是一种特殊的递归神经网络 (RNN),能够学习数据序列中的长期依赖关系。它们被广泛用于顺序数据,并且是时间序列分析中许多预测建模成功的基石。注意力机制最初是为自然语言处理任务开发的,它通过允许模型在进行预测时专注于输入序列的特定部分来增强 LSTM,类似于人类注意力的工作方式。

三、为什么要将 LSTM 与时间序列注意力相结合?

   金融市场的动态性质使得股价预测成为一项具有挑战性的任务。传统的 LSTM 尽管能够捕获时间依赖性,但可能会难以应对股价变动的噪音和波动。注意力机制通过为输入数据的不同时间步长提供加权重要性来解决这个问题,使模型能够优先考虑更相关的信息并提高其预测性能。

   案例研究:预测 AAPL 股价
   在我们的实验中,我们利用了AAPL四年的历史股价,使用“收盘价”进行预测。首先对数据进行归一化以帮助训练过程,然后输入到我们的 LSTM with Attention 模型中。

四、模型架构

   我们的模型包括一个 LSTM 层,然后是一个注意力层和一个全连接层来产生输出。注意力层计算注意力权重并将其应用于 LSTM 的输出,生成一个上下文向量,作为最终预测的输入。

# Import necessary libraries
import yfinance as yf
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import MinMaxScaler# Download Apple Inc. stock data
aapl_data = yf.download('AAPL', start='2020-01-01', end='2024-03-01')# Use the 'Close' price for prediction
close_prices = aapl_data['Close'].values# Normalize the data
scaler = MinMaxScaler(feature_range=(0, 1))
close_prices_scaled = scaler.fit_transform(close_prices.reshape(-1, 1))# Prepare the dataset
X = close_prices_scaled[:-1]
y = close_prices_scaled[1:]# Reshape for LSTM
X = X.reshape(-1, 1, 1)
y = y.reshape(-1, 1)# Train-test split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Convert to PyTorch tensors
X_train_tensor = torch.tensor(X_train, dtype=torch.float32)
y_train_tensor = torch.tensor(y_train, dtype=torch.float32)
X_test_tensor = torch.tensor(X_test, dtype=torch.float32)
y_test_tensor = torch.tensor(y_test, dtype=torch.float32)# LSTM with Attention Mechanism
class LSTMAttention(nn.Module):def __init__(self, input_dim, hidden_dim, output_dim=1, num_layers=1):super(LSTMAttention, self).__init__()self.hidden_dim = hidden_dimself.num_layers = num_layersself.lstm = nn.LSTM(input_dim, hidden_dim, num_layers, batch_first=True)self.attention = nn.Linear(hidden_dim, 1)self.fc = nn.Linear(hidden_dim, output_dim)def forward(self, x):lstm_out, _ = self.lstm(x)attention_weights = torch.softmax(self.attention(lstm_out).squeeze(-1), dim=-1)context_vector = torch.sum(lstm_out * attention_weights.unsqueeze(-1), dim=1)out = self.fc(context_vector)return out# Instantiate and train the model
model = LSTMAttention(input_dim=1, hidden_dim=50)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)# Training loop
epochs = 100
for epoch in range(epochs):model.train()optimizer.zero_grad()output = model(X_train_tensor)loss = criterion(output, y_train_tensor)loss.backward()optimizer.step()if epoch % 10 == 0:model.eval()test_pred = model(X_test_tensor)test_loss = criterion(test_pred, y_test_tensor)print(f'Epoch {epoch}, Loss: {loss.item()}, Test Loss: {test_loss.item()}')# Predictions
model.eval()
predictions = model(X_test_tensor).detach().numpy()
predictions_actual = scaler.inverse_transform(predictions)# Plotting
plt.figure(figsize=(15, 5))
plt.plot(scaler.inverse_transform(y_test), label='Actual')
plt.plot(predictions_actual, label='Predicted')
plt.title('AAPL Stock Price Prediction')
plt.legend()
plt.show()# Calculate MSE
mse = mean_squared_error(scaler.inverse_transform(y_test), predictions_actual)
print(f'Mean Squared Error: {mse}')

训练与评估

   该模型经过了 100 多个时期的训练,显示训练集和测试集的均方误差 (MSE) 持续下降。当与实际值进行对比时,最终预测表明该模型能够密切跟踪实际价格走势。
在这里插入图片描述
在这里插入图片描述

五、验证

# 第 1 步:获取下个月的额外数据
additional_data = yf。download('AAPL', start='2023-03-02', end='2023-03-29')# 第 2 步:预处理新数据
new_close_prices = additional_data['Close'].values
new_close_prices_scaled = scaler.变换(new_close_prices。reshape(-11))# 准备用于预测
的新数据集 X_new = new_close_prices_scaled[-1]
y_new_actual = new_close_prices_scaled[1]X_new = X_new。重塑(-111)
y_new_actual = y_new_actual。reshape(-11)# 转换为 PyTorch 张量
X_new_tensor = torch。tensor(X_new, dtype=torch.float32)
y_new_actual_tensor = 火炬。tensor(y_new_actual, dtype=torch.float32)# 第 3 步:制作预测
模型。eval()
new_predictions = model(X_new_tensor)。detach() 中。numpy()
new_predictions_actual = 缩放器。inverse_transform(new_predictions)# 第 4 步:评估模型
plt.图(figsize=155))
plt.plot(缩放器。inverse_transform(y_new_actual), label='实际')
plt。plot(new_predictions_actual, label='Predicted')
plt。title('AAPL 新月股价预测')
plt.legend()
plt.show()

六、计算指标

new_mse = mean_squared_error(scaler.inverse_transform(y_new_actual), new_predictions_actual)
print(f'新均方误差:{new_mse}')

结果分析
   第一个图显示测试集的预测价格与实际价格。这一时期的均方误差约为9.87,表明与看不见的数据有很强的拟合度。

   为了进行可靠的验证,我们还预测了下个月的价格:

   随后一段时间的 MSE 约为 5.63,这令人印象深刻,展示了该模型的泛化能力。
在这里插入图片描述

七、结论

   事实证明,LSTM 与 Attention 机制相结合,是处理股票价格等时间序列数据的强大架构。它不仅捕捉了时间模式,还辨别了对未来价值产生重大影响的关键时刻。虽然这个模型代表了向前迈出的一大步,但金融市场的波动性确保了对更精细模型的探索仍在继续。然而,我们的AAPL股价预测案例研究的结果是有希望的,并为未来的探索奠定了坚实的基础。

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

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

相关文章

喜讯 ChatGPT 3.5 免登录|免注册就可以使用了

https://chat.openai.com/ 直接访问openai 官网直接使用,当然还是要魔法的,不用再去用别人二次开发的,还有次数限制,还有开会员😅才能用的。😀试用啦一下,基本秒回答,能力也是在线的…

llama-factory简介

llamafactory是什么,能干什么 LLaMA-Factory 是一个易于使用的大规模语言模型(Large Language Model, LLM)微调框架,它支持多种模型,包括 LLaMA、BLOOM、Mistral、Baichuan、Qwen 和 ChatGLM 等。该框架旨在简化大型语…

【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案

【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案 大家好 我是寸铁👊 总结了一篇【Python】无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案✨ 喜欢的小伙伴可以点点关注 💝 前言 今天寸铁…

JSON的定义、基本使用二

<script>//定义jsonvar json{"name" : "张三","age" : "18岁","addr" : ["北京","上海","天津"]}//获取数据console.log(json.age)console.log(json.name)console.log(json.addr)</…

渗透测试练习题解析 5(CTF web)

1、[安洵杯 2019]easy_serialize_php 1 考点&#xff1a;PHP 反序列化逃逸 变量覆盖 【代码审计】 通过 GET 的方式获取参数 f 的值&#xff0c;传递给变量 function 定义一个过滤函数&#xff0c;过滤掉特定字符&#xff08;用空字符替换&#xff09; 下面的代码其实没什么用…

Go语言如何处理文件

1.文件的重要性 文件不过是硬盘中的数据,看起来好像没什么了不起,但实际上,文件能够让程序员管理配置、存储程序的状态乃至从底层操作系统中读取数据。 UNIX型操作系统的一个重要特征是,将一切都视为文件。这意味着在操作系统看来,从键盘到打印机的所有东西都可像文件那样…

多线程(31)StampedLock和ReadWriteLock

StampedLock 是 Java 8 引入的一种新的锁机制&#xff0c;位于 java.util.concurrent.locks 包下。它可以被认为是 ReadWriteLock 的一个改进版&#xff0c;提供了一种乐观的读锁策略&#xff0c;这种策略可以在某些场景下减少锁的竞争&#xff0c;从而提高性能。与 ReadWriteL…

【Java】jdk1.8 Java代理模式,Jdk动态代理讲解(非常详细,附带class文件)

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 一、什么是代理模式 想要学代理模式&#xff0c;我们就要先弄清一个概念“什么是代理”&#xff1f; 在我们的现实生活中&#xff0c;你或许不少听过关于代理的名词&#xff0c;如&#xff1a;代理商。那什么又叫做代理…

Rust---复合数据类型之结构体

目录 结构体的使用输出结果 结构体简化创建结构体更新语法元组结构体单元结构体&#xff08;unit struct&#xff09;结构体中的引用使用#[derive(Debug)]再次介绍 代码综合展示 与元组不同的是&#xff0c;结构体可以为内部的每个字段起一个富有含义的名称&#xff0c;因此无需…

【74LS191/48为可预置的四位二进制加/减法计数器3-9循环显示】2022-3-19

缘由我有电路原理图&#xff0c;想用proteus仿真&#xff0c;但是数码管不亮-嵌入式-CSDN问答 74LS191为可预置的四位二进制加/减法计数器 74ls191引脚功用 RCO进位/借位输出端 MAX/MIN进位/借位输出端 CTEN计数操控端 QA-QD计数输出端 U/D计数操控端 CLK时钟输入端 LO…

【Docker笔记03】【MySQL 与 Redis的主从安装】

一、前言 本系列是根据 B 站 尚硅谷 Docker 视频 学习记录笔记。因为没有视频课件&#xff0c;部分内容摘自 https://www.yuque.com/tmfl/cloud/dketq0。 本系列仅为自身学习笔记记录使用&#xff0c;记录存在偏差&#xff0c;推荐阅读原视频内容或本文参考笔记。 二、Mysql …

如何加速Docker镜像的构建过程?

要加速Docker镜像的构建过程&#xff0c;你可以考虑以下几种方法&#xff1a; 使用多阶段构建&#xff1a;多阶段构建可以帮助你减少镜像的大小&#xff0c;从而加速构建过程。你可以将构建过程分为多个阶段&#xff0c;每个阶段只保留必要的文件和依赖&#xff0c;最终构建出一…

10-用PySpark建立第一个Spark RDD

目录 RDD概念RDD特点建立RDD的方式不同工具建立RDD的方式使用PySpark Shell(交互环境)建立RDD使用VSCode编程建立RDD使用Jupyter Notebook建立RDD 总结 PySpark实战笔记系列第一篇 RDD概念 Apache Spark的核心组件的基础是RDD。所谓的RDD&#xff0c;即弹性分布式数据集&#…

Linux 关闭防火墙命令(新手)

关闭防火墙 查看防火墙状态 systemctl status firewalld.service 临时关闭防火墙&#xff08;重启失效&#xff09; systemctl stop firewalld.service 永久关闭防火墙 systemctl disable firewalld.servicesudo systemctl enable firewalld&#xff0c;这种方式输入命令…

施耐德 Unity Pro PLC 编程软件介绍

Unity Pro 软件基本介绍 Unity Pro 是施耐德中大型 PLC 的编程软件&#xff08;<–> 对应西门子 Step7&#xff09; 支持的 PLC&#xff1a;施耐德中大型 PLC 中型 PLC&#xff1a;Premium、M340&#xff08;<–> 对应西门子 S7-300、S7-1200&#xff09;大型 PL…

【C++】探索C++中的类与对象(上)

​​ &#x1f331;博客主页&#xff1a;青竹雾色间. &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ✨人生如寄&#xff0c;多忧何为 ✨ C是一种强大的编程语言&#xff0c;其面向对象的特性使得代码结构更加清晰、易于维护和扩展。在C中&#xff0c;类与…

常见docker使用命令

#搭建镜像 “”" sudo docker build -t es_refresh:V1.20230303 . “”" #启动容器 “”" docker run -d --namepara_classify -v /etc/localtime:/etc/localtime -v /data/chenhw/multi_label_classification:/edb2vec -p 8066:8066 --gpus ‘“device0”’…

Day83:服务攻防-开发组件安全JacksonFastJson各版本XStreamCVE环境复现

目录 J2EE-组件Jackson-本地demo&CVE 代码执行 (CVE-2020-8840) 代码执行 (CVE-2020-35728&#xff09; J2EE-组件FastJson-本地demo&CVE FastJson < 1.2.24 FastJson < 1.2.47 FastJson < 1.2.80 (利用条件比较苛刻) J2EE-组件XStream-靶场&CVE …

高度不同的流体瀑布css实现方法

商城商品列表 实现瀑布流展示&#xff0c;通过flex或grid实现会导致每行中的列高度一致&#xff0c;无法达到错落有致的感觉&#xff1b; 为此需要用到&#xff1a; CSS columns 属性 columns 属性是一个简写属性&#xff0c;用于设置列宽和列数。 CSS 语法 columns: column-wi…

如何让Webots支持C#语言开发的控制器

Webots支持C、C、Java、Python、Matlab这五种语言开发控制器&#xff0c;没有直接支持C#&#xff0c;但有个同事已经用C#写了大量的机器人控制代码&#xff0c;想在不把C#代码改写成C的情况下&#xff0c;直接用webots仿真&#xff0c;那就得想想办法。(不过&#xff0c;让Chat…