LSTM时间序列模型实战——预测上证指数走势

news2024/11/20 13:22:19

LSTM时间序列模型实战——预测上证指数走势



关于作者


作者:小白熊

作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。

联系邮箱:xbx3144@163.com

科研辅导、知识付费答疑、个性化定制以及其他合作需求请联系作者~



前言


  时间序列预测在金融市场的分析和建模中占有重要地位,尤其是在股票价格、指数的波动预测中。本文将带领大家从数据预处理、基于TensorFlow的LSTM模型构建与训练,到最终预测结果的可视化,深入探讨如何使用LSTM模型预测上证指数的收盘价走势。



一、环境配置


  首先,需要确保安装以下python库。这些库可以通过以下命令进行安装:pip install numpy pandas matplotlib scikit-learn tensorflow openpyxl

  • numpy:用于数值计算,支持多维数组和矩阵操作。
  • pandas:数据处理工具,用于读取Excel、CSV等数据文件,并提供数据清洗、转换功能。
  • matplotlib:用于绘制图形,可视化数据。
  • scikit-learn:用于数据标准化、特征提取等机器学习操作。
  • tensorflow:神经网络框架,支持深度学习模型的构建和训练。
  • openpyxl:读取和操作表格文件。

在代码中,导入上述库:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dropout, Dense, Activation

# 正常显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False



二、读取数据


  在进行时间序列预测前,需要读取并预处理数据。其中数据文件名为data.xlsx,其中包含了上证指数的历史数据(获取数据请私信博主)。

# 读取数据
data_all = pd.read_excel('data.xlsx', header=0, index_col=0)

# 检测缺失值
missing_values = data_all.isnull()

# 打印缺失值数量
print("缺失值的数量:")
print(missing_values.sum())

本文使用pandas库读取数据文件,并通过isnull()函数检查数据中的缺失值:
在这里插入图片描述

缺失值的存在可能会对模型的性能产生负面影响,在下一步骤中将会对其进行处理!



三、异常值处理与缺失值填充


  为了确保数据的质量,需要去除异常值并填补缺失值。异常值指的是那些远离正常分布范围的数据点。缺失值使用interpolate()函数对缺失值进行插值填充。

# 去除异常值:基于均值和标准差的阈值法
threshold = 5
data_new = data_all[(data_all > data_all.mean() - threshold * data_all.std()) & (
        data_all < data_all.mean() + threshold * data_all.std())]

# 使用插值法填充缺失值
data_new = data_new.interpolate(limit=150)

  本文定义了一个阈值 threshold,基于均值和标准差去除偏离正常范围的异常值。当阈值 threshold 等于 5 时,则认为一个数据点如果偏离了数据均值 ±5倍标准差,就会被视为异常值。



四、特征提取与标准化


  本文的LSTM模型是多输入模型,需要提供输入特征和对应的标签。我们将收盘价收盘价_Clpr作为预测的标签,其他特征作为输入。同时,还需要对数据进行标准化处理,使其具有相同的尺度。

# 提取特征和标签
features = data_new.drop(['收盘价_Clpr'], axis='columns')
labels = data_new['收盘价_Clpr']

# 重组特征和标签
labels = labels.values.reshape(-1, 1)
features = features.values

# 对特征和标签进行标准化处理
scaler_x, scaler_y = StandardScaler(), StandardScaler()
features = scaler_x.fit_transform(features)
labels = scaler_y.fit_transform(labels)

  本文使用StandardScaler对特征和标签数据进行标准化处理,以消除特征间的量纲差异,确保模型在训练时不会偏向某些特征。


五、划分训练集与验证集


  为了评估模型的性能,我们需要将数据集划分为训练集和验证集。通常情况下,我们使用80%的数据作为训练集,20%的数据作为验证集。

# 划分训练集和验证集
train_size = int(len(features) * 0.8)
val_size = len(features) - train_size
x_train, x_val = features[0:train_size, :], features[train_size:, :]
y_train, y_val = labels[0:train_size, :], labels[train_size:, :]

  通过上述代码,我们将数据分为训练集(x_trainy_train)以及验证集(x_valy_val)。



六、构建时间序列数据


  由于LSTM模型适用于处理时间序列数据,因此我们需要将数据转换为时间序列格式。通过自定义get_data函数,我们可以构建过去若干时间步的数据作为输入,未来若干时间步的数据作为目标标签。

def get_data(dataset_x, dataset_y, n_past, n_future):
    dataX = []
    dataY = []
    for i in range(n_past, len(dataset_x) - n_future):
        dataX.append(dataset_x[i - n_past:i, :])
        dataY.append(dataset_y[i:i + n_future, 0])
    return np.array(dataX), np.array(dataY)

# 定义过去和未来的时间步数
n_past = 20
n_future = 5

# 构建训练集和验证集的时间序列数据
x_train_lstm, y_train_lstm = get_data(x_train, y_train, n_past, n_future)
x_val_lstm, y_val_lstm = get_data(x_val, y_val, n_past, n_future)

  在这个例子中,n_past=20代表将过去20天的数据作为LSTM的输入,n_future=5代表将未来5天的数据作为LSTM的输出。自定义函数get_data会返回适合LSTM模型的时间序列格式数据。


七、LSTM模型的构建


  LSTM(长短期记忆网络)是一种特殊的RNN(循环神经网络)。不同于传统RNN随着时间步长的增加,网络难以保持对早期输入信息的敏感性,导致梯度消失或爆炸问题。LSTM则通过引入以下三种门控机制来克服这些问题:

  • 遗忘门:控制当前记忆单元应该保留多少信息。
  • 输入门:决定当前时间步的输入有多少能被存储到记忆单元中。
  • 输出门:控制记忆单元中多少信息将用于当前时间步的输出。

  LSTM的记忆单元使其在处理长序列数据时效果尤为突出。LSTM模型结构通过以下代码实现:

# 初始化LSTM模型
model = Sequential()

# 第一层LSTM
model.add(LSTM(64, input_shape=(x_train_lstm.shape[1], x_train_lstm.shape[-1]), return_sequences=True))
model.add(Dropout(0.2))  # Dropout层,用于防止过拟合

# 第二层LSTM
model.add(LSTM(32, return_sequences=False))
model.add(Dropout(0.2))

# 全连接层
model.add(Dense(5))  # 输出维度为5,即预测未来5天的收盘价
model.add(Activation('linear'))  # 使用线性激活函数

# 编译模型
model.compile(loss='mse', optimizer='rmsprop')



八、训练模型


  利用编译好的LSTM模型进行训练。本文将模型训练300轮,并在每轮结束时通过验证集评估模型性能。

e# 训练模型
history = model.fit(x_train_lstm, y_train_lstm, epochs=300, batch_size=128, validation_data=(x_val_lstm, y_val_lstm))

  在训练过程中,模型会记录每次迭代的训练误差和验证误差,这些数据可以用于后续的性能分析。



九、模型评估与预测

  在训练完成后,我们可以通过绘制损失曲线来评估模型的收敛情况:

# 提取训练和验证损失值
loss = history.history['loss']
val_loss = history.history['val_loss']

# 绘制损失曲线
plt.plot(range(len(loss)), loss, 'b-', label='训练集损失')
plt.plot(range(len(loss)), val_loss, 'r-', label='验证集损失')
plt.legend(loc='best')
plt.title('LSTM模型损失曲线')
plt.xlabel('迭代次数')
plt.ylabel('均方误差 (MSE)')
plt.show()

结果如下:

损失曲线

接下来,使用训练好的LSTM模型进行预测:

# 进行预测
y_train_pred = model.predict(x_train_lstm)
y_val_pred = model.predict(x_val_lstm)

# 反标准化预测结果
y_train_pred = scaler_y.inverse_transform(y_train_pred)
y_val_pred = scaler_y.inverse_transform(y_val_pred)

# 绘制预测结果与真实值
plt.plot(np.arange(len(labels)), scaler_y.inverse_transform(labels), color='red', label='真实值')
plt.plot(np.arange(n_past, len(y_train) - n_future), y_train_pred[:, 0], color='green', label='训练集预测')
plt.plot(np.arange(len(y_train) + n_past, len(labels) - n_future), y_val_pred[:, 0], color='blue', label='验证集预测')
plt.title('上证指数-LSTM预测')
plt.xlabel('天数')
plt.ylabel('收盘价')
plt.legend()
plt.show()

结果如下:

上证指数



结束语

  本文详细介绍了如何使用LSTM模型预测上证指数收盘价。从数据预处理、特征提取、模型构建到预测和评估,逐步展示了时间序列预测的全过程。希望对你有所帮助!


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

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

相关文章

五款软件助你秒变职场达人

✨ 每天忙碌于工作&#xff0c;却感觉事半功倍&#xff1f;别担心&#xff0c;今天就为大家揭秘5款高效工作软件&#xff0c;让你秒变职场达人&#xff0c;效率直线飙升&#xff01;&#x1f389; 1️⃣ 亿可达 &#x1f3d7;️ 软件连接神器 &#x1f3af; 特点&#xff1a…

Java后端面试很水的,7天就能搞定!

随着Java的越来越卷&#xff0c;面试也直接上难度了&#xff0c;从以前的八股文到场景题了&#xff0c;尤其是有经验的去面试&#xff0c;场景题都是会问的&#xff0c;近期面试过的应该都深有体会&#xff01; 场景题230道&#xff1a; 1.分布式锁加锁失败后的等待逻辑是如何…

项目管理全流程包括哪些环节,一文读懂项目管理全流程

项目管理全流程是一个系统性、阶段性的过程&#xff0c;旨在确保项目从启动到完成的高效运行。该流程包括以下几个关键阶段&#xff1a;项目管理全流程是确保项目从启动到完成顺利进行的一系列阶段和活动的总称。 以下是基于项目管理全流程对项目管理的描述&#xff1a; 一、…

单路测径仪的详细介绍

蓝鹏测控单路测径仪是一种高精度、高效率的在线检测设备&#xff0c;广泛应用于线缆、电缆、电线、胶管、塑料管、金属丝等行业的生产过程中。以下是对该产品的详细介绍&#xff1a; 一、核心技术与工作原理 蓝鹏测控单路测径仪以光电检测为核心&#xff0c;结合单片机、LED灯、…

Qt-QStatusBar窗口状态栏相关操作(48)

目录 描述 使用 设置临时消息 添加子控件 添加 Labe 添加 进度条 从右边添加 按钮 描述 状态栏是应⽤程序中输出简要信息的区域。⼀般位于主窗⼝的最底部&#xff0c;⼀个窗⼝中最多只能有⼀个状态栏。在 Qt 中&#xff0c;状态栏是通过 QStatusBar类 来实现的。在状态…

Linux-处理用户输入

命令行参数 特殊参数变量 移动变量 处理选项-查找选项 处理选项-使用getopt命令 获得用户输入

讲座在线预约管理系统的设计与实现使用SpringBootSSM框架开发

目录 摘要 1 引言 2 系统需求分析 3 技术选型 4 系统架构设计 5 核心功能实现 5.1 用户管理 5.2 讲座管理 5.3 预约管理 5.4 评论系统 6 安全性考虑 7 测试 8 结论 摘要 本文旨在设计和实现一个基于Spring Boot SSM框架的讲座在线预约管理系统&#xff0c;并结合…

【Linux进程间通信】深入探索:Linux下的命名管道与System V共享内存

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;Linux “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀Linux进程间通信 &#x1f4d2;1. 命名管道&#x1f4d9;2. 命名管道实现server&client通…

环境变量及命令行参数

目录 一、环境变量的概念和基本命令 二、环境变量的组织结构及获取环境变量的方式 &#xff08;1&#xff09;组织结构 &#xff08;2&#xff09;获取环境变量 命令行第三个参数 通过第三方变量environ获取 通过系统调用getenv获取 三、命令行参数 一、环境变量的概念和…

Go语言对接微信支付与退款全流程指南

在互联网技术日益发展的今天&#xff0c;线上支付已成为不可或缺的一部分。作为一门简洁高效的编程语言&#xff0c;Go&#xff08;又称Golang&#xff09;凭借其强大的并发处理能力和高效性能&#xff0c;在后端开发领域越来越受到开发者的青睐。本文将详细介绍如何使用Go语言…

学习干货IF=93.6!开发临床预测模型:分步指南

预测患者未来结果对临床实践至关重要&#xff0c;有助于医生做出明智决策。尽管每年发布大量预测模型&#xff0c;但许多研究存在方法学局限&#xff0c;如样本量不足和模型验证不充分&#xff0c;这削弱了模型的实际应用价值。因此&#xff0c;必须深入探讨并改进这些局限性&a…

电力央企数智化转型中的大模型构建及智能巡检机器人的应用

在全球经济数字化转型的大背景下&#xff0c;电力行业面临着多重挑战&#xff0c;包括能源结构的转型、市场竞争的加剧以及环境保护的压力。电力央企作为国家能源供应的中坚力量&#xff0c;亟需通过数智化转型提升竞争力和服务水平。 随着今年年初我国首次将“开展‘人工智能行…

第十四届蓝桥杯嵌入式省赛程序设计题解析(基于HAL库)

一.题目分析 &#xff08;1&#xff09;.题目 &#xff08;2&#xff09;.题目分析 1.PWM输出分析 模式切换时&#xff0c;占空比要不变&#xff0c; 在五秒之内就要变化成目标频率&#xff0c;同时要求频率的步进值要小于200hz 为了使步进值小于200hz,那么在五秒的时间之内…

AI绘画:人工智能颠覆艺术创作的新时代

*AI绘画的震撼与魅力* 你是否曾幻想过&#xff0c;手握画笔便能创造出前所未有的艺术作品&#xff1f;当我们谈及艺术&#xff0c;总会联想到那份独特的创意和灵感。而如今&#xff0c;随着人工智能的迅猛发展&#xff0c;AI绘画正以其独特的方式&#xff0c;颠覆着传统的艺术…

XTR115电流环电路原理研究【文献】

作者&#xff1a;昝 勇&#xff0c;罗永红&#xff0c;王沛莹 中航工业 摘要&#xff1a; 针对各种数据采集与监控中抗恶劣电磁干扰环境的需求&#xff0c;给出一种基于XTB115的低功耗两线4&#xff5e;20 mA电流环数据传输电路&#xff0c;首先讨论了XTR115的性能特点和工作原…

RabbitMQ简介及安装类

RabbitMQ概述-MQ介绍 RabbitMQ是一个开源的消息代理和队列服务器&#xff0c;它支持多种消息协议&#xff0c;并且可以轻松地与多种编程语言和框架集成。RabbitMQ是使用Erlang语言编写的&#xff0c;因此它具有高并发和高可用性的特点。以下是RabbitMQ的一些关键特性和概念 消息…

两文读懂DDD领域驱动设计,举例说明,通俗易懂【值得收藏】

最近对架构莫名的感兴趣&#xff0c;慢慢觉得架构本身是为了提供方便&#xff0c;定制规范&#xff0c;目标一致并更好的协作&#xff0c;它的变动也并不是像变形金刚一样&#xff0c;而是像幼苗一样按规律成长起来的 DDD是一种方法也是一种思想&#xff0c;大家前面个别概念看…

C++-再探构造函数(进阶)

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 前言 来到类和对象最后一个章节&#xff0c;这里的难度已经极大程度的降低了 再探构造…

FFMpeg源码分析,关键结构体分析(一)

http://lazybing.github.io/blog/categories/ffmpegyuan-ma-fen-xi/ 一、下载FFmpeg的编译源码 进入网站&#xff1a;http://ffmpeg.org/download.html二、编译源码 执行下述命令&#xff1a; ./configure --prefix/usr/local/ffmpeg --enable-debug3 --enable-ffplay sudo …

22年408数据结构

第一题&#xff1a; 解析&#xff1a; 观察一下这个程序&#xff1a;我们注意到最外层的循环是从i1开始的&#xff0c;每次ii*2&#xff0c;直到i<n为止&#xff0c;假设程序总共执行k次执行&#xff0c;则有2^(k1)>n。则k1>log(2)n这里是以2为底n的对数, k>log(2)…