基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)
前言
系列专栏:【深度学习:算法项目实战】✨︎
涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记忆、自然语言处理、深度强化学习、大型语言模型和迁移学习。
随着金融市场的日益复杂和全球化,投资者们对于准确预测股票价格的需求愈发迫切。然而,股票市场的波动受到众多因素的影响,包括宏观经济状况、公司财务状况、市场情绪等,这使得股票价格的预测成为了一个复杂且具有挑战性的任务。
近年来,深度学习技术的快速发展为股票价格预测提供了新的思路和方法。双向长短期记忆(BiLSTM)网络作为深度学习中的一种重要模型,具有强大的序列建模能力,能够捕捉数据中的长期依赖关系。因此,将BiLSTM应用于股票单变量时间序列预测,有望提高预测的准确性和稳定性。
本文旨在探讨基于PyTorch框架的BiLSTM模型在股票单变量时间序列预测中的应用。首先,我们将介绍金融时间序列数据的特点和预处理方法,包括数据的标准化、去噪和特征提取等。然后,我们将详细阐述BiLSTM模型的构建过程,包括模型架构的设计、参数的选择和优化算法的应用等。接着,我们将通过具体的实验来验证BiLSTM模型在股票预测任务中的有效性,并与传统的时间序列预测方法进行比较。最后,我们将对实验结果进行分析和讨论,探讨BiLSTM模型在股票预测中的优势和不足,并展望未来的研究方向。
BiLSTM 单变量时间序列预测
- 1. 股票时间序列数据
- 1.1 数据预处理
- 1.2 探索性分析(可视化)
- 1.2.1 股票的日收盘价
- 1.2.2 股票的日交易量
- 1.2.3 股票的日收益率
- 1.2.4 股票价格相关性
- 1.2.5 股票的风险价值
- 2. 时间数据特征工程(APPL)
- 2.1 构造序列数据
- 2.2 特征缩放(归一化)
- 2.3 数据集划分(TimeSeriesSplit)
- 2.4 数据集张量(TensorDataset)
- 3. 构建时间序列模型(BiLSTM)
- 3.1 构建双向 LSTM 模型
- 3.2 定义模型、损失函数与优化器
- 4. 模型训练与可视化
- 4.1 训练过程
- 4.2 Loss 可视化
- 5. 模型评估与可视化
- 5.1 评估指标(MAE、RMSE、MAPE、R2)
- 5.2 反归一化
- 5.3 结果可视化
- 6. 模型预测
- 6.1 转换最新时间步收盘价的数组为张量
- 6.2 预测下一个时间点的收盘价格
- 参考链接
1. 股票时间序列数据
股票时间序列数据是指按照时间顺序排列的关于股票市场的历史数据。这些数据记录了股票市场在不同时间点上的各种信息,如股票的开盘价、最高价、最低价、收盘价、成交量等。时间序列数据是金融市场分析的重要基础,因为它们反映了市场参与者的行为、市场供求关系以及宏观经济和政策的影响等因素。
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from sklearn.preprocessing import MinMaxScaler from sklearn.model_selection import TimeSeriesSplit import torch import torch.nn as nn from torch.utils.data import DataLoader, TensorDataset from torchinfo import summary from tqdm import tqdm
1.1 数据预处理
pandas.to_datetime 函数将标量、数组、Series 或 DataFrame/dict-like 转换为 pandas datetime 对象。
AAPL = pd.read_csv('AAPL.csv') print(type(AAPL['Close'].iloc[0]),type(AAPL['Date'].iloc[0])) # Let's convert the data type of timestamp column to datatime format AAPL['Date'] = pd.to_datetime(AAPL['Date']) print(type(AAPL['Close'].iloc[0]),type(AAPL['Date'].iloc[0])) # Selecting subset cond_1 = AAPL['Date'] >= '2021-04-23 00:00:00' cond_2 = AAPL['Date']