使用注意力机制的 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_dim
        self.num_layers = num_layers
        self.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股价预测案例研究的结果是有希望的,并为未来的探索奠定了坚实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言(温故而知新&#xff…

C++算法 —— 前缀和

一、【模版】前缀和 1.链接 【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 2.描述 3.思路 前缀和的思想其实就是一种简单的动态规划,以i位置记录从头位置到i位置的和,然后间接的求一段连续区间的数组和,时间复杂度是O(n&…

基于多模态单细胞数据构建共表达网络-MuSeGNN

本篇来自于MuSe-GNN: Learning Unified Gene Representation From Multimodal Biological Graph Data的补充材料。主要目的是从多模态数据中构建共表达网络。作者概述了使用CS-CORE,scTransform和SPARK-X进行预处理步骤和网络构建的算法细节。 目前存在大量用于图谱…

ESP32 引脚分配

请注意,以下引脚分配参考适用于流行的 30 引脚ESP32 devkit v1开发板。 仅输入引脚 GPIO34~39是GPIs–仅输入的管脚。这些引脚没有内部上拉或下拉电阻。它们不能用作输出,因此只能将这些管脚用作输入:GPIO 34、GPIO 35、GPIO 36、GPIO 39 S…

利用nginx-http-flv-module实现三种直播

目录 一、说明 二、目标 三、实现 四、直播地址 一、说明 此文在《流媒体服务器的搭建(支持hls)》《搭建nginx-http-flv-module直播系统》之后编写,很多详细内容需要参考它。 流媒体服务器的搭建(支持hls)

【解读Kubernetes架构】全面指南,带你掌握Kubernetes的设计原理与构成!

了解 Kubernetes 架构:综合指南 前言一、什么是 Kubernetes 架构?1.1、控制平面1.2、工作节点 二、Kubernetes 控制平面组件2.1、kube-api服务器2.2、etcd2.3、kube-scheduler2.4、Kube 控制器管理器2.5、云控制器管理器 (CCM) 三…

Web APIs简介 Dom

JS的组成 API API 是一些预先定义的函数,目的是提供应用程序与开发人员基于软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节 简单理解:API是给程序员提供的一种工具,以便能更轻松的实现…

车载电子电器架构 —— 工程EOL诊断

车载电子电器架构 —— 工程EOL诊断 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己…

数据的统计描述

data.info() 提供了关于数据框的简要摘要,包括: 索引类型数据列的数量非空值的数量(针对每列)每列的数据类型(例如,int64, float64, object等)内存使用情况提供了哪些列可能包含缺失值&#xff…

flink on yarn

前言 Apache Flink,作为大数据处理领域的璀璨明星,以其独特的流处理和批处理一体化模型,成为众多企业和开发者的首选。它不仅能够在处理无界数据流时展现出卓越的实时性能,还能在有界数据批处理上达到高效稳定的效果。本文将简要…

Linux文件IO(4):目录操作和文件属性获取

目录 1. 前言 2. 函数介绍 2.1 访问目录 – opendir 2.2 访问目录 – readdir 2.3 访问目录 – closedir 2.4 修改文件访问权限 – chmod/fchmod 2.5 获取文件属性 – stat/lstat/fstat 2.5.1 文件属性 – struct stat 2.6 文件类型 – st_mode 3. 代码练习 3.1 要求 3.2 代…

day04-MQ

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,但是你…

数组--有序数组的平方

LeetCode中的第977题: 思想:①返回每个新数组;②排序; (n个数,进行n-1趟比较。第j趟比较中要进行n-j次两两比较) (1)n个数,进行n-1趟比较: for(…

深度学习【向量化(array)】

为什么要向量化 在深度学习安全领域、深度学习练习中,你经常发现在训练大量数据时,深度学习算法表现才更加优越,所以你的代码运行的非常快至关重要,否则,你将要等待非常长的时间去得到结果。所以在深度学习领域向量化…

(源码+部署+讲解)基于Spring Boot和Vue的宠物领养系统的设计与实现

一、引言 本报告旨在详细描述基于Spring Boot后端框架和Vue前端框架的宠物领养系统的设计与实现过程。宠物领养系统旨在为宠物主人和领养者提供一个便捷的平台,实现宠物的信息发布、领养申请、信息管理等功能。通过该系统,宠物主人可以快速找到适合的领养…

Kali WSL2(windows下安装了kali)

自从WSL2以来,感觉各方面也挺好的,有时候比vmware workstation方便,特别单独使用一个linux的时候。所以研究了下kali,也是很OK的,以及验证完成了。 本文参考官网: Kali Linux | Penetration Testing and Et…

C++——特殊类设计

目录 前言 一,请设计一个不能被拷贝的类 二,请设计一个只能在堆上创建对象的类 2.1 思路一:构造函数私有 2.2 思路二,析构函数私有 三,请设计一个只能在栈上创建对象的类 四,请设计一个只能创建一个…

练习14 Web [极客大挑战 2019]Upload

phtml格式绕过,burp修改content-type绕过,常见的文件上传存放目录名 题目就叫upload,打开靶机 直接上传一个图片格式的一句话木马,返回如下: 提交练习5和9中的两种可以执行图片格式php代码的文件,修改con…

Netty的线程模型

文章目录 前言NIO的三种reactor模式Netty对3种Reactor模式的支持Netty内部如何实现Reactor线程模型在事件分发过程中,Netty如何避免竞争条件 前言 Netty的线程模型采用了Reactor模式,这是一种高性能的IO设计模式,它基于NIO多路复用。Netty支…

226.翻转二叉树

226.翻转二叉树 力扣题目链接(opens new window) 翻转一棵二叉树。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNo…