当前位置: 首页 > news >正文

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

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模型预测上证指数收盘价。从数据预处理、特征提取、模型构建到预测和评估,逐步展示了时间序列预测的全过程。希望对你有所帮助!


相关文章:

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

LSTM时间序列模型实战——预测上证指数走势 关于作者 作者&#xff1a;小白熊 作者简介&#xff1a;精通python、matlab、c#语言&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;机器视觉&#xff0c;目标检测&#xff0c;图像分类&#xff0c;姿态识别&#xff0c;…...

基于 STM32F407 的 SPI Flash下载算法

目录 一、概述二、自制 FLM 文件1、修改使用的芯片2、修改输出算法的名称3、其它设置4、修改配置文件 FlashDev.c5、文件 FlashPrg.c 的实现 三、验证算法 一、概述 本文将介绍如何使用 MDK 创建 STM32F407 的 SPI Flash 下载算法。 其中&#xff0c;SPI Flash 芯片使用的是 W…...

力扣之1355.活动参与者

题目&#xff1a; Sql 测试用例&#xff1a; Create table If Not Exists Friends (id int, name varchar(30), activity varchar(30)); Create table If Not Exists Activities (id int, name varchar(30)); Truncate table Friends; insert into Friends (id, name, acti…...

数据资产治理:构建敏捷与安全的数据管理体系

在当今数字化的盛况下&#xff0c;作为核心资产的数据已经越发受到企业的重视。但是随着公司的逐步壮大&#xff0c;如何分析这些数据以及如何有效治理数据资产&#xff0c;以确保安全性、合规性以及易用性&#xff0c;是企业面临的重大挑战。数聚股份将从多年从业经验深度探讨…...

Nodejs连接Mysql笔记

框架搭建 安装Node.js 首先&#xff0c;确保你已经在系统上安装了Node.js和npm&#xff08;Node Packaged Modules&#xff09;。你可以通过以下命令检查是否已经安装&#xff1a;shell 或者 node -v 或者 npm -v 数据库连接代码 1.导入MySQL2库 npm install mysql2 2.在文件…...

Canvas:AI协作的新维度

在人工智能的浪潮中&#xff0c;OpenAI的最新力作Canvas&#xff0c;不仅是一款新工具&#xff0c;它标志着人工智能协作方式的一次革命性飞跃。Canvas为写作和编程提供了一个全新的交互界面&#xff0c;让用户能够与ChatGPT进行更紧密、更直观的协作。 ​​​​​​​ Canvas的…...

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵

【深度学习】— softmax回归、网络架构、softmax 运算、小批量样本的向量化、交叉熵 3.4 Softmax 回归3.4.1 分类问题3.4.2 网络架构 3.4.3 全连接层的参数开销3.4.4 softmax 运算3.4.5 小批量样本的向量化3.4.6 损失函数对数似然softmax 的导数 3.4.7 信息论基础熵信息量重新审…...

C# Wpf 图片按照鼠标中心缩放和平移

C# Wpf 图片按照鼠标中心缩放和平移 1、缩放事件 MouseWheel(object sender, MouseWheelEventArgs e)2、平移相关的事件 MouseMove(object sender, MouseEventArgs e) MouseDown(object sender, MouseButtonEventArgs e) MouseUp(object sender, MouseButtonEventArgs e)3、…...

网络安全产品类型

1. 防火墙&#xff08;Firewall&#xff09; 功能&#xff1a;防火墙是网络安全的第一道防线&#xff0c;通过检查进出网络的流量来阻止未经授权的访问。它可以基于预定义的安全规则&#xff0c;过滤数据包和阻止恶意通信。 类型&#xff1a; 硬件防火墙&#xff1a;以专用设备…...

【开源风云】从若依系列脚手架汲取编程之道(五)

&#x1f4d5;开源风云系列 &#x1f34a;本系列将从开源名将若依出发&#xff0c;探究优质开源项目脚手架汲取编程之道。 &#x1f349;从不分离版本开写到前后端分离版&#xff0c;再到微服务版本&#xff0c;乃至其中好玩的一系列增强Plus操作。 &#x1f348;希望你具备如下…...

金融市场的衍生品交易及其风险管理探讨

金融衍生品市场是现代金融体系的重要组成部分&#xff0c;其交易量和复杂性在过去几十年中迅速增长。衍生品&#xff0c;如期权、期货、掉期等&#xff0c;因其灵活性和杠杆效应&#xff0c;广泛应用于风险管理、投机和资产配置等多个领域。本文将探讨金融衍生品交易的关键特点…...

一、创建型(单例模式)

单例模式 概念 单例模式是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。它控制类的实例化过程&#xff0c;防止外部代码创建新的实例。 应用场景 日志记录&#xff1a;确保只有一个日志记录器&#xff0c;以便于管理和避免重复记…...

毕业设计项目-古典舞在线交流平台的设计与实现(源码/论文)

项目简介 基于springboot实现的&#xff0c;主要功能如下&#xff1a; 技术栈 后端框框&#xff1a;springboot/mybatis 前端框架&#xff1a;html/JavaScript/Css/vue/elementui 运行环境&#xff1a;JDK1.8/MySQL5.7/idea&#xff08;可选&#xff09;/Maven3&#xff08…...

【秋招笔试】10.09华子秋招(已改编)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 本次的三题全部上线…...

【算法笔记】双指针算法深度剖析

【算法笔记】双指针算法深度剖析 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;算法笔记 文章目录 【算法笔记】双指针算法深度剖析前言一.移动零1.1题目1.2思路分析1.3代码实现 二.复写零2.1题目2.2思路分析2.3代码实现 三.快乐数3.1题目…...

第二十二天|回溯算法| 理论基础,77. 组合(剪枝),216. 组合总和III,17. 电话号码的字母组合

目录 回溯算法理论基础 1.题目分类 2.理论基础 3.回溯法模板 补充一个JAVA基础知识 什么时候用ArrayList什么时候用LinkedList 77. 组合 未剪枝优化 剪枝优化 216. 组合总和III 17. 电话号码的字母组合 回溯法的一个重点理解&#xff1a;细细理解这句话&#xff01;…...

关闭IDM自动更新

关闭IDM自动更新 1 打开注册表2 找到IDM注册表路径 1 打开注册表 winR regedit 2 找到IDM注册表路径 计算机\HKEY_CURRENT_USER\Software\DownloadManager 双击LstCheck&#xff0c;把数值数据改为0 完成 感谢阅读...

Go 性能剖析工具 pprof 与 Graphviz 教程

在 Golang 开发中&#xff0c;性能分析是确保应用高效运行的重要环节。本文介绍如何使用 gin-contrib/pprof 在 Gin 应用中集成性能剖析工具&#xff0c;并结合 Graphviz 生成图形化的性能分析结果&#xff0c;如火焰图。这套流程帮助开发者更好地理解和优化 Go 应用的性能。 目…...

【题目解析】蓝桥杯23国赛C++中高级组 - 斗鱼养殖场

【题目解析】蓝桥杯23国赛C中高级组 - 斗鱼养殖场 题目链接跳转&#xff1a;点击跳转 前置知识&#xff1a; 了解过基本的动态规划。熟练掌握二进制的位运算。 题解思路 这是一道典型的状压动态规划问题。设 d p i , j dp_{i, j} dpi,j​ 表示遍历到第 i i i 行的时候&a…...

JavaScript可视化:探索顶尖的图表库

JavaScript可视化&#xff1a;探索顶尖的图表库 在这个被数据驱动的时代&#xff0c;你有没有想过&#xff0c;数据本身是如何变得有意义的&#xff1f;答案就是数据可视化。通过图表和图形&#xff0c;我们不仅可以看到数据&#xff0c;还可以感受到它&#xff0c;从而做出明…...

谷歌AI大模型Gemini API快速入门及LangChain调用视频教程

1. 谷歌Gemini API KEY获取及AI Studio使用 要使用谷歌Gemini API&#xff0c;首先需要获取API密钥。以下是获取API密钥的步骤&#xff1a; 访问Google AI Studio&#xff1a; 打开浏览器&#xff0c;访问Google AI Studio。使用Google账号登录&#xff0c;若没有账号&#xf…...

进入容器:掌控Docker的世界

进入容器:掌控Docker的世界 在这个快速发展的技术时代,你是否曾被Docker的庞大生态所吸引?那么,有没有想过在这个容器化的世界里,如何快速高效地“进入”这些隐藏在虚拟墙后的容器呢?容器就如同魔法箱,装载着应用与服务,而你,通过探索这些容器,能够更好地管理、排除…...

初始Linux(二)基础命令

前言&#xff1a; 之前那一篇我们已经介绍了一部分的基础命令&#xff0c;当然那只不过是九牛一毛&#xff0c;本篇我们继续介绍一些比较重要且需要掌握的基础命令。 mv命令&#xff1a; 其实这个命令有两个功能&#xff0c;一个是移动&#xff08;剪切&#xff09;文件&#…...

STM32 OLED

文章目录 前言一、OLED是什么&#xff1f;二、使用步骤1.复制 OLED.C .H文件1.1 遇到问题 2.统一风格3.主函数引用头文件3.1 oled.h 提供了什么函数 4.介绍显示一个字符的函数5. 显示十进制函数的讲解 三、使用注意事项3.1 配置符合自己的引脚3.2 花屏总结 前言 提示&#xff…...

伦敦金实时行情决策辅助!

在伦敦金实时交易的过程中&#xff0c;投资者主要依赖技术分析来辅助自己的投资决策。与基本面分析不同&#xff0c;技术分析侧重于研究金价的走势和市场行为&#xff0c;通过图表和技术指标来预测未来的市场走势。常用的技术分析方法包括&#xff1a; 趋势线和支撑阻力位&…...

​Leetcode 746. 使用最小花费爬楼梯​ 入门dp C++实现

问题&#xff1a;Leetcode 746. 使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你…...

路由协议常见知识点

路由协议是网络通信的基础&#xff0c;主要负责在网络中传递数据包&#xff0c;并确保它们从源节点传递到目标节点。本文将介绍一些常见的路由协议知识点&#xff0c;包括路由协议的分类、特性、配置与管理以及常见问题。 一、路由协议的分类 距离矢量路由协议&#xff1a; R…...

多模态大语言模型(MLLM)-InstructBlip深度解读

前言 InstructBlip可以理解为Blip2的升级版&#xff0c;重点加强了图文对话的能力。 模型结构和Blip2没差别&#xff0c;主要在数据集收集、数据集配比、指令微调等方面下文章。 创新点 数据集收集&#xff1a; 将26个公开数据集转换为指令微调格式&#xff0c;并将它们归类…...

网页前端开发之Javascript入门篇(7/9):字符串

Javascript字符串 什么是字符串&#xff1f; 答&#xff1a;其概念跟 Python教程 介绍的一样&#xff0c;只是语法上有所变化。 在 Javascript 中&#xff0c;一个字符串变量可以看做是其内置类String的一个实例&#xff08;Javascript会自动包装&#xff09;。 因此它拥有一…...

双登股份再战IPO:数据打架,实控人杨善基千万元股权激励儿子

撰稿|行星 来源|贝多财经 近日&#xff0c;双登集团股份有限公司&#xff08;下称“双登股份”&#xff09;递交招股书&#xff0c;准备在港交所主板上市&#xff0c;中金公司、建银国际、华泰国际为其联席保荐人。 贝多财经了解到&#xff0c;这并非双登股份首次向资本市场…...