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


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

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

相关文章

影刀RPA实战:Excel排序、替换与格式

1.实战目标 今天继续介绍影刀RPA操作Excel的指令&#xff0c;内容替换&#xff0c;数据排序与单元格格式设置&#xff0c;这几个功能在日常工作中使用率还是比较频繁的。我们可以使用影刀来处理这些重复繁琐的工作。 2.内容替换 我们手动替换内容时 打开Excel文件&#xff1…

鸿蒙进入“无人区”:该如何闯关?

按照华为方面的说法&#xff0c;“打造鸿蒙操作系统是三大战役&#xff0c;目前已经完成了底座和体验两大战役&#xff0c;第三大战役则是生态。”生态固然重要&#xff0c;但要让鸿蒙与当今世界主流操作系统抗衡&#xff0c;乃至成为新一代操作系统中的翘楚&#xff0c;其实还…

上市四天暴涨又暴跌,扫描全能王背后公司坐上“过山车”

股价四天涨五倍&#xff0c;遇到回调跌一半&#xff0c;扫描全能王母公司——合合信息&#xff0c;一上市就坐上了“过山车”。 合合信息其实早在2021年就向科创板申请上市&#xff0c;并在2023年成功过会&#xff0c;但直到9月13日才开启申购&#xff0c;IPO之路一走就是三年…

springboot-网站开发-thymeleaf引擎报错找不到指定的页面模板文件

springboot-网站开发-thymeleaf引擎报错找不到指定的页面模板文件&#xff01; 这种错误的情况&#xff0c;发生&#xff0c;一般都是因为&#xff0c;我们自己的html模板文件&#xff0c;存档位置并不是在默认的templates下面。而是我们自己新建的一个子目录里面。然后&#x…

又被Transformer秀到了!结合小样本学习发A会!

在有限的数据资源下&#xff0c;为了训练出高性能的机器学习模型&#xff0c;我们常会考虑Transformer小样本学习。 这是因为Transformer能从有限的数据中提取更多有用的信息&#xff0c;这样与小样本学习结合&#xff0c;可以更有效的帮助我们提高模型的性能&#xff0c;加速…

Vue84 vue3项目结构分析

打开main.js文件&#xff0c;发现和vue2不同 //引入的不再是Vue构造函数了&#xff0c;引入的是一个名为createApp的工厂函数 import { createApp } from vue import App from ./App.vue//创建应用实例对象——app(类似于之前Vue2中的vm&#xff0c;但app比vm更“轻”) const …

Chrome(谷歌)浏览器 数据JSON格式美化 2024显示插件安装和使用

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 没有美化的格式浏览器展示 美化之后效果图 安装流程 下载地址 https://github.com/gildas-lormeau/JSONVue 点击下载 下载成功&#xff0c;如图所示 解压文件 添加成功&#xff0c;如图所示 通过浏览器…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架&#xff0c;但是它是生成漂亮测试报告的开源工具&#xff0c;搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上&#xff0c;对测试数据进行处理统计&#xff0c;生成格式统一、美观的测试报告。 …

C语言函数栈帧的创建与销毁(32)

文章目录 前言一、什么是函数栈帧&#xff1f;二、理解函数栈帧能解决什么问题&#xff1f;三、函数栈帧的创建和销毁解析什么是栈&#xff1f;认识相关寄存器和汇编指令 四、解析函数栈帧的创建和销毁预备知识函数的调用堆栈准备环境转到反汇编函数栈帧的创建函数栈帧的销毁 五…

FreeRTOS学习总结

背景&#xff1a;在裸机开发上&#xff0c;有时候我们需要等待某个信号或者需要延迟时&#xff0c;CPU的运算是白白浪费掉了的&#xff0c;CPU的利用率并不高&#xff0c;我们希望当一个函数在等待的时候&#xff0c;可以去执行其他内容&#xff0c;提高CPU的效率&#xff0c;同…

视频格式不支持播放怎么办?几招教你转换成mp4格式

视频已成为我们生活中不可或缺的一部分&#xff0c;无论是学习、娱乐还是工作交流&#xff0c;视频都扮演着重要角色。然而&#xff0c;在享受视频带来的便利时&#xff0c;我们时常会遇到一个令人头疼的问题——视频格式不支持播放。不同设备、平台和软件对视频格式的支持各不…

什么是组态软件?Web组态软件又是什么?

从事相关工作的对“组态软件”应该都不陌生&#xff0c;那Web组态软件又是什么呢?本文将对Web组态可视化软件&#xff08;下称“Web组态软件”&#xff09;做简单介绍&#xff0c;可视化编辑器是Web组态软件中的一个重要功能模块。除了编辑器&#xff0c;还有哪些功能模块?又…

leetcode---素数,最小质因子,最大公约数

1 判断一个数是不是质数(素数) 方法1&#xff1a;依次判断能否被n整除即可&#xff0c;能够整除则不是质数&#xff0c;否则是质数 方法2&#xff1a;假如n是合数&#xff0c;必然存在非1的两个约数p1和p2&#xff0c;其中p1<sqrt(n)&#xff0c;p2>sqrt(n)。 方法3&…

医院管理新思维:Spring Boot技术应用

5系统详细实现 5.1 医生模块的实现 5.1.1 病床信息管理 医院管理系统的医生可以管理病床信息&#xff0c;可以对病床信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 病床信息管理界面 5.1.2 药房信息管理 医生可以对药房信息进行添加&#xff0c;修改&#xff0c;…

Java中System类和RunTime类的Api

目录 System 类 1)out 2)err 3)in 4)currentTimeMillis() 5)nanoTime() 6)arraycopy(Object 要从里面复制东西的数组, int 要从里面复制东西数组的索引起始位置, Object 获得复制元素的数组, int 获得复制元素数组的起始索引, int 要复制东西的个数) 7)gc() 8)exit(int status)…

运维工具之ansible

Ansible 1.什么是ansible? ​ ansible是基于ssh架构的自动化运维工具&#xff0c;由python语言实现&#xff0c;通过ansible可以远程批量部署等。 2.部署前提 ​ 控制端需要安装ansible,被控制端要开启ssh服务&#xff0c;并允许远程登录&#xff0c;被管理主机需要安装py…

探讨Facebook在全球社交网络中的技术优势

Facebook作为全球最大的社交网络之一&#xff0c;其技术优势在于多个方面&#xff0c;这些优势不仅塑造了用户体验&#xff0c;也影响了整个社交媒体生态。 个性化用户体验 Facebook通过分析用户的行为和兴趣&#xff0c;提供个性化的内容推荐。利用机器学习算法&#xff0c;平…

仅用一分钟,AI如何帮你构建完整的论文初稿?揭秘背后科技!

大家好&#xff01;在今天的分享中&#xff0c;我们将深入探讨一项令人兴奋的技术进展&#xff1a;仅用一分钟&#xff0c;AI如何帮助你构建一篇完整的论文初稿。这项技术不仅节省了研究人员和学生的宝贵时间&#xff0c;还改变了我们对学术写作的传统认知。 首先&#xff0c;…

【读书笔记·VLSI电路设计方法解密】问题10:从概念到硅片开发SoC芯片的主要任务

从概念到硅片的SoC芯片开发过程可分为以下四个任务&#xff1a;设计、验证、实现和软件开发。 设计&#xff1a;通常从市场调研和产品定义开始&#xff0c;然后进行系统设计&#xff0c;最后以RTL编码结束。验证&#xff1a;确保芯片按照设计规格能够准确执行功能&#xff0c;…

深度学习500问——Chapter17:模型压缩及移动端部署(4)

文章目录 17.9 常用的轻量级网络有哪些 17.9.1 SequeezeNet 17.9.2 MobileNet 17.9.3 MobileNet-v2 17.9.4 Xception 17.9 常用的轻量级网络有哪些 17.9.1 SequeezeNet SqueezeNet出自 F.N.landola, S.Han等人发表的论文《SqueezeNet&#xff1a;ALexNet-level accuracy with…