数据挖掘实战-基于长短期记忆网络(LSTM)的黄金价格预测模型 | 97% 准确度

 

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

1.项目背景

2.数据集介绍

3.技术工具

4.实验过程

4.1导入数据

4.2数据预处理

4.3数据可视化

4.4特征工程

4.5构建LSTM模型

4.6模型评价

5.结论 

源代码


1.项目背景

        黄金作为全球金融市场的重要组成部分,其价格变动不仅影响着投资者的收益,也是全球经济运行状况的晴雨表。随着全球化的推进和信息技术的飞速发展,黄金市场日益复杂多变,其价格受到众多因素的影响,包括全球经济状况、货币政策、地缘政治事件等。因此,对黄金价格进行准确预测,对于投资者而言,具有至关重要的意义。

        传统的黄金价格预测方法往往基于统计分析或简单的机器学习模型,这些方法在处理复杂的非线性关系和长期依赖关系时存在局限性。而深度学习作为一种强大的机器学习方法,特别是长短期记忆网络(LSTM),在处理时间序列数据方面展现出了卓越的性能。LSTM模型通过其特殊的结构设计,能够有效地捕捉序列数据中的长期依赖关系,这对于预测黄金价格这种受多种因素长期影响的市场行为至关重要。

        然而,尽管LSTM在黄金价格预测方面具有一定的优势,但现有的研究和实践仍面临一些挑战。一方面,黄金市场的复杂性和不确定性使得模型的预测精度和稳定性受到影响;另一方面,LSTM模型的参数调优和特征选择也是影响预测效果的关键因素。因此,对LSTM模型进行优化,提高其在黄金价格预测中的性能,具有重要的理论价值和实际应用意义。

        基于以上背景,本研究旨在通过优化LSTM模型,提高黄金价格预测的准确性和稳定性。我们将从模型结构、参数优化、特征选择等方面入手,对LSTM模型进行改进和优化。通过本研究的开展,我们期望能够为投资者提供更加准确、可靠的黄金价格预测工具,同时推动深度学习技术在金融时间序列预测领域的进一步发展。

2.数据集介绍

        本数据集来源于Kaggle,这个全面的数据集提供了从2013年到2023年10年黄金价格趋势的见解。它细致地记录了每天的开盘价和收盘价,高点和低点,以及每天的交易量。原始数据集共有2583条,7个变量。

3.技术工具

Python版本:3.9

代码编辑器:jupyter notebook

4.实验过程

4.1导入数据

首先导入本次实验用到第三方库并加载数据集

查看数据大小

查看数据基本信息

查看数据描述性统计

4.2数据预处理

 由于我们不会使用Vol.和Change %特征来预测价格,我们将删除这两个特征:

日期特征以对象的形式存储在数据帧中。为了提高计算速度,我们将其数据类型转换为datetime,然后按升序对该特征进行排序:

“,”符号在数据集中是冗余的。首先,我们将其从整个数据集中移除,然后将数值变量的数据类型更改为float:

统计缺失值情况

统计重复值情况

4.3数据可视化

4.4特征工程

将数据分割为训练集和测试集 由于我们不能对时间序列数据中的未来数据进行训练,所以我们不应该对时间序列数据进行随机分割。在时间序列分割中,测试集总是晚于训练集。我们将最后一年的时间用于测试,其他时间用于训练。

黄金价格训练和测试集

数据缩放

由于我们的目标是仅根据其历史数据预测价格,我们使用MinMaxScaler缩放价格以避免密集的计算:

重构数据并创建滑动窗口

利用前一个时间步长来预测下一个时间步长称为滑动窗口。这样,时间序列数据就可以表示为监督学习。我们可以通过使用前一个时间步骤作为输入变量,并使用下一个时间步骤作为输出变量来做到这一点。前一个时间步长的数量称为窗口宽度。这里我们将窗口宽度设置为60。因此,X_train和X_test将是包含60个时间戳价格的嵌套列表。y_train和y_test也是黄金价格列表,其中包含第二天的黄金价格,分别对应X_train和X_test中的每个列表:

将数据转换为Numpy数组 现在X_train和X_test是嵌套列表(二维列表),y_train是一维列表。我们需要将它们转换为更高维度的numpy数组,这是TensorFlow在训练神经网络时接受的数据格式:

4.5构建LSTM模型

创建LSTM网络

我们建立了一个LSTM网络,它是一种递归神经网络,旨在解决梯度消失问题:

训练模型 

4.6模型评价

接下来,我们使用MAPE(平均绝对百分比误差)度量来评估我们的时间序列预测:

可视化结果

将实际和预测的Price值返回到它们的原始刻度:

调查模型预测的价格与实际价格的接近程度:

可以看到,LSTM模型预测的价格与实际价格有很大的吻合!在测试数据上得到的Loss and Accuracy (1-MAPE)值也证实了模型的良好性能!: 🏆损失:0.001 🏆准确率:97%

5.结论 

        本实验基于Kaggle上提供的从2013年到2023年的黄金价格数据集,运用长短期记忆网络(LSTM)构建了黄金价格预测模型。该数据集详细记录了每日的黄金价格信息,包括开盘价、收盘价、高点、低点和交易量等,为模型的训练提供了丰富的数据支持。

        实验结果表明,LSTM模型在预测黄金价格方面展现出了卓越的性能。预测价格与实际价格高度吻合,证明了模型在捕捉黄金价格变化趋势方面的有效性。同时,模型在测试数据上取得了较低的损失值和较高的准确率(以1-MAPE衡量),具体数值为模型损失0.001和模型准确率97%,进一步验证了模型的稳定性和可靠性。

通过本次实验,我们可以得出以下结论:

  1. LSTM模型能够充分利用历史数据中的时间序列信息,有效地预测黄金价格的未来走势。

  2. 模型对于黄金价格变化趋势的捕捉能力强,可以为投资者提供有价值的参考信息,帮助他们制定更为精准的投资策略。

  3. 本实验所采用的LSTM模型在黄金价格预测领域具有广泛的应用前景,可以进一步拓展到其他金融时间序列预测任务中。

        需要注意的是,虽然本实验取得了较为理想的预测结果,但金融市场仍然受到众多不可预测因素的影响。因此,在实际应用中,我们需要持续关注市场动态,结合其他分析方法和技术手段,以提高预测精度和稳定性。同时,随着深度学习技术的不断发展,我们可以进一步探索和改进模型结构,以更好地适应复杂多变的金融市场环境。

源代码

在本笔记中,我们将建立一个时间序列模型来预测黄金的未来价格,这对交易者来说非常有用。为此,我们使用了10年(2013 - 2023年)的历史黄金价格数据。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_percentage_error
import tensorflow as tf
from keras import Model
from keras.layers import Input, Dense, Dropout
from keras.layers import LSTM
import warnings
warnings.filterwarnings('ignore')df = pd.read_csv('Gold Price (2013-2023).csv')
df.head()
如您所见,该数据集包括每日黄金价格信息,包括每日开盘价、最高价和最低价以及每天的最终价格(price),以及每天的交易量和价格变化。
df.shape
df.info()
df.describe()
特征子集选择
由于我们不会使用Vol.和Change %特征来预测价格,我们将删除这两个特征:
df.drop(['Vol.', 'Change %'], axis=1, inplace=True)
转换数据
日期特征以对象的形式存储在数据帧中。为了提高计算速度,我们将其数据类型转换为datetime,然后按升序对该特征进行排序:
df['Date'] = pd.to_datetime(df['Date'])
df.sort_values(by='Date', ascending=True, inplace=True)
df.reset_index(drop=True, inplace=True)
“,”符号在数据集中是冗余的。首先,我们将其从整个数据集中移除,然后将数值变量的数据类型更改为float:
NumCols = df.columns.drop(['Date'])
df[NumCols] = df[NumCols].replace({',': ''}, regex=True)
df[NumCols] = df[NumCols].astype('float64')
df.head()
df.duplicated().sum()
df.isnull().sum().sum()
可视化黄金价格历史数据
互动黄金价格图表:
fig = px.line(y=df.Price, x=df.Date)
fig.update_traces(line_color='black') 
fig.update_layout(xaxis_title="Date", yaxis_title="Scaled Price",title={'text': "Gold Price History Data", 'y':0.95, 'x':0.5, 'xanchor':'center', 'yanchor':'top'},plot_bgcolor='rgba(255,223,0,0.8)')
将数据分割为训练集和测试集
由于我们不能对时间序列数据中的未来数据进行训练,所以我们不应该对时间序列数据进行随机分割。在时间序列分割中,测试集总是晚于训练集。我们将最后一年的时间用于测试,其他时间用于培训:
test_size = df[df.Date.dt.year==2022].shape[0]
test_size
黄金价格训练和测试集
plt.figure(figsize=(15, 6), dpi=150)
plt.rcParams['axes.facecolor'] = 'yellow'
plt.rc('axes',edgecolor='white')
plt.plot(df.Date[:-test_size], df.Price[:-test_size], color='black', lw=2)
plt.plot(df.Date[-test_size:], df.Price[-test_size:], color='blue', lw=2)
plt.title('Gold Price Training and Test Sets', fontsize=15)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Price', fontsize=12)
plt.legend(['Training set', 'Test set'], loc='upper left', prop={'size': 15})
plt.grid(color='white')
plt.show()
数据缩放
由于我们的目标是仅根据其历史数据预测价格,我们使用MinMaxScaler缩放价格以避免密集的计算:
scaler = MinMaxScaler()
scaler.fit(df.Price.values.reshape(-1,1))
重构数据并创建滑动窗口
利用前一个时间步长来预测下一个时间步长称为滑动窗口。这样,时间序列数据就可以表示为监督学习。我们可以通过使用前一个时间步骤作为输入变量,并使用下一个时间步骤作为输出变量来做到这一点。前一个时间步长的数量称为窗口宽度。这里我们将窗口宽度设置为60。因此,X_train和X_test将是包含60个时间戳价格的嵌套列表。y_train和y_test也是黄金价格列表,其中包含第二天的黄金价格,分别对应X_train和X_test中的每个列表:
window_size = 60
# 训练集:
train_data = df.Price[:-test_size]
train_data = scaler.transform(train_data.values.reshape(-1,1))
X_train = []
y_train = []for i in range(window_size, len(train_data)):X_train.append(train_data[i-60:i, 0])y_train.append(train_data[i, 0])# 测试集:
test_data = df.Price[-test_size-60:]
test_data = scaler.transform(test_data.values.reshape(-1,1))
X_test = []
y_test = []for i in range(window_size, len(test_data)):X_test.append(test_data[i-60:i, 0])y_test.append(test_data[i, 0])
将数据转换为Numpy数组
现在X_train和X_test是嵌套列表(二维列表),y_train是一维列表。我们需要将它们转换为更高维度的numpy数组,这是TensorFlow在训练神经网络时接受的数据格式:
X_train = np.array(X_train)
X_test  = np.array(X_test)
y_train = np.array(y_train)
y_test  = np.array(y_test)X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_test  = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
y_train = np.reshape(y_train, (-1,1))
y_test  = np.reshape(y_test, (-1,1))print('X_train Shape: ', X_train.shape)
print('y_train Shape: ', y_train.shape)
print('X_test Shape:  ', X_test.shape)
print('y_test Shape:  ', y_test.shape)
创建LSTM网络
我们建立了一个LSTM网络,它是一种递归神经网络,旨在解决梯度消失问题:# 模型定义:
def define_model():input1 = Input(shape=(window_size,1))x = LSTM(units = 64, return_sequences=True)(input1)  x = Dropout(0.2)(x)x = LSTM(units = 64, return_sequences=True)(x)x = Dropout(0.2)(x)x = LSTM(units = 64)(x)x = Dropout(0.2)(x)x = Dense(32, activation='softmax')(x)dnn_output = Dense(1)(x)model = Model(inputs=input1, outputs=[dnn_output])model.compile(loss='mean_squared_error', optimizer='Nadam')model.summary()return model
# 模型训练:
model = define_model()
history = model.fit(X_train, y_train, epochs=150, batch_size=32, validation_split=0.1, verbose=1)
模型评价
接下来,我们使用MAPE(平均绝对百分比误差)度量来评估我们的时间序列预测:
result = model.evaluate(X_test, y_test)
y_pred = model.predict(X_test) MAPE = mean_absolute_percentage_error(y_test, y_pred)
Accuracy = 1 - MAPEprint("Test Loss:", result)
print("Test MAPE:", MAPE)
print("Test Accuracy:", Accuracy)
可视化结果
将实际和预测的Price值返回到它们的原始刻度:
y_test_true = scaler.inverse_transform(y_test)
y_test_pred = scaler.inverse_transform(y_pred)
调查模型预测的价格与实际价格的接近程度:
plt.figure(figsize=(15, 6), dpi=150)
plt.rcParams['axes.facecolor'] = 'yellow'
plt.rc('axes',edgecolor='white')
plt.plot(df['Date'].iloc[:-test_size], scaler.inverse_transform(train_data), color='black', lw=2)
plt.plot(df['Date'].iloc[-test_size:], y_test_true, color='blue', lw=2)
plt.plot(df['Date'].iloc[-test_size:], y_test_pred, color='red', lw=2)
plt.title('Model Performance on Gold Price Prediction', fontsize=15)
plt.xlabel('Date', fontsize=12)
plt.ylabel('Price', fontsize=12)
plt.legend(['Training Data', 'Actual Test Data', 'Predicted Test Data'], loc='upper left', prop={'size': 15})
plt.grid(color='white')
plt.show()

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

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

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

相关文章

网络安全等级保护相关标准及发展

目录 等保标准 等保定级 发展 等保标准 2016年11月发布的《网络安全法》第二十一条提出“国家实行网络安全等级保护制度”。 等级保护标准体系: (1)安全等级类标准 主要包括GB/T 22240-2008《信息安全技术 信息系统安全保护等级保护定…

汽车IVI中控开发入门及进阶(二十五):CVBS视频流

前言: AHD和CVBS是两种视频格式,在车载摄像头中,有支持传统CVBS模拟视频的摄像头,也有支持新的高分辨率AHD格式的摄像头。 CVBS视频是经典的模拟视频格式,在视频经常显示在小型监视器上的车辆上仍然最受欢迎。如果想要车辆的最大分辨率,可选择AHD格式,即高分辨率模拟视…

启智CV机器人,ROS,ubuntu 20.04 【最后一步有问题】

资料: https://wiki.ros.org/kinetic/Installation/Ubuntu https://blog.csdn.net/qq_44339029/article/details/120579608 装VM。 装ubuntu20.04 desktop.iso系统。 装vm工具: sudo apt update sudo dpkg --configure -a sudo apt-get autoremove o…

守护任务用来防止资源冲突

背景:有三个任务,他们都需要操作数码管。每个任务对应三个数码管,共9个数码管。硬件上9个数码管的控制使用一套硬件完成。 策略:每个任务都往自己的队列里面发数据,单独建立一个监听任务:处理所有队列的数…

网络编程(七)

网络编程(七) UNIX域套接字(本地间进程间通信的技术)(S文件)基于TCP传输基于UDP传输 UNIX域套接字(本地间进程间通信的技术)(S文件) socket同样也可以用于本…

echarts-series的x,y轴的规则

series的data与x,y轴的匹配规则 如果series的data为[1,2,3,4,5,6] 1.如果x,y轴都是类目轴,且data没有与x,y轴的值匹配上,则无效。 2.如果x,y轴都为类目,data中能够跟类目轴上的字符串对应上,轴,有效。 3.如果都为value.,则按数值…

掌握Element UI:加速你的网页设计过程!

Element UI 是一套为开发者、UI/UX设计师和产品经理准备的采用Vue 2.0作为基础框架实现的组件库,提供配套的设计资源,可以帮助设计快速成型。即时设计也内置Element UI Kit资源,但有些小伙伴还是对此不太了解,接下来本文会详细带你…

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton

“神经网络之父”和“深度学习鼻祖”Geoffrey Hinton在神经网络领域数十年如一日的研究,对深度学习的推动和贡献显著。 一、早期贡献与突破 反向传播算法的引入:Hinton是将反向传播(Backpropagation)算法引入多层神经网络训练的…

室内外无缝定位技术:连接虚拟与现实的新桥梁

随着科技的快速发展,人们对于位置信息的精确度和实时性要求日益提高。在这样一个背景下,室内外无缝定位技术应运而生,成为连接虚拟与现实世界的关键桥梁。它不仅为人们提供了更加便捷、高效的生活体验,还推动了物联网、智能制造等…

Java面试八股之怎么降低锁竞争

怎么降低锁竞争 减少锁的持有时间: 尽量缩短线程持有锁的时间,只在必要时才获取锁,一旦操作完成立即释放锁。可以通过将同步代码块的范围缩小到最小必要程度来实现,避免在锁保护的代码块中执行耗时操作或等待操作,比如…

Java集合基础知识点系统性总结篇

目录 集合一、图解集合的继承体系?([图片来源](https://www.cnblogs.com/mrhgw/p/9728065.html))点击查看大图二、List,Set,Map三者的区别?三、List接口的实现3.1、Arraylist 、 LinkedList、Vector3.2、Arraylist 、 LinkedList、…

MacOS - 为什么 Mac 安装软件后安装包在桌面上无法删除?

只要你将这磁盘里面的软件放到应用程序里面去了,那么用鼠标选中这个跟磁盘一样的东西,然后按下键盘上的 Command E 即可移除桌面上的这个磁盘。

气压、湿度、震动开关、声音、红外火焰传感器 | 配合Arduino使用案例

BMP180 气压传感器 BMP180 是一种用于测量气压的科学仪器。可以获取到温度、气压、海拔。 先在 arduino ide 中安装依赖 /****** Arduino 接线 ***** Arduino 传感器* VCC 5v* GND GND* A4 SDA * A5 SCL ***********************/#include &l…

ubuntu使用oh my zsh美化终端

ubuntu使用oh my zsh美化终端 文章目录 ubuntu使用oh my zsh美化终端1. 安装zsh和oh my zsh2. 修改zsh主题3. 安装zsh插件4. 将.bashrc移植到.zshrcReference 1. 安装zsh和oh my zsh 首先安装zsh sudo apt install zsh然后查看本地有哪些shell可以使用 cat /etc/shells 将默…

③单细胞学习-pbmc的Seurat 流程

目录 1,数据读取 2,线粒体基因查看 3,数据标准化 4,识别高变基因 5,进行数据归一化 6,进行线性降维 7,确定细胞簇 8,UMAP/tSNE降维(保存pbmc_tutorial.rds&#…

如何用TCC方案轻松实现分布式事务一致性

本文作者:小米,一个热爱技术分享的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! 哈喽,大家好!我是小米,一个热爱技术的活力小青年,今天要和大家分享的是一种在分布式系统中实现事务的一种经典方案——TCC(Try Confirm Canc…

第一篇 逻辑门(与门、或门、非门、异或门)

一、实验目的 了解DE1-SOC开发板一些外设。 掌握常用组合逻辑门电路的基本原理。 学习Verilog HDL的基本语法。 学习使用ModelSim工具对设计的电路进行仿真,包括编写Testbench仿真代码,以及ModelSim工具的使用。 熟悉使用Quartus软件从创建Quartus工…

汽车MCU虚拟化--对中断虚拟化的思考(2)

目录 1.引入 2.TC4xx如何实现中断虚拟化 3.小结 1.引入 其实不管内核怎么变,针对中断虚拟化无非就是上面两种,要么透传给VM,要么由Hypervisor统一分发。汽车MCU虚拟化--对中断虚拟化的思考(1)-CSDN博客 那么,作为车规MCU龙头…

Docker基础篇之将本地镜像发布到私有库

文章目录 1. Docker Registry简介2. 将本地镜像推送到私有库 1. Docker Registry简介 Docker Registry是官方提供的工具,可以用于构建私有镜像仓库。 2. 将本地镜像推送到私有库 下载Docker Registry docker pull registry现在我们可以从镜像中看到下载的Regist…

Go语言垃圾回收(GC原理)

1. GC回收机制 1.1 V1.3标记清除法 (1)概述 1.STW暂停 STW(暂停业务逻辑,找出可达和不可达对象) 2.对可达对象做上标记 标记完成之后,对象5和对象6不可达,被GC清除.之后STW结束. (2).缺点 STW :让程序暂停,程序出现卡顿.标记需要扫描整个heap.清除数据会产生heap碎片. 1.…