2023和鲸夏令营创作活动【黄金价格分析预测】

news2024/9/9 7:53:05

2023和鲸夏令营创作活动【黄金价格分析预测】

文章目录

  • 2023和鲸夏令营创作活动【黄金价格分析预测】
    • 一、项目背景
    • 二、数据说明
    • 三、数据预处理
    • 四、数据探索性分析
    • 五、构建LSTM模型预测
      • 1、构建LSTM模型
      • 2、绘制loss的变化曲线
      • 3、进行预测

一、项目背景

本项目的目标是分析并预测2012年至2022年的黄金成交价格。我们将使用时间序列数据,并采用LSTM模型进行预测。

在这里插入图片描述

二、数据说明

数据集包含以下字段:

  • Date:日期
  • Close/Last:收盘价
  • Volume:成交量
  • Open:开盘价
  • High:最高价
  • Low:最低价

数据缺失情况如下:

  • Date:0
  • Close/Last:0
  • Volume:39
  • Open:0
  • High:0
  • Low:0

在接下来的分析中,我们将首先进行数据探索性分析和可视化,然后使用LSTM模型进行预测,并对预测结果进行可视化。

三、数据预处理

在进行数据分析之前,我们需要对数据进行预处理。这包括处理缺失值,转换数据类型等。

import pandas as pd

df = pd.read_csv('gold_data.csv')

df.head()

在这里插入图片描述

# 查看数据信息,包括每列的数据类型和非空值数量
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2547 entries, 0 to 2546
Data columns (total 6 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   Date        2547 non-null   object 
 1   Close/Last  2547 non-null   float64
 2   Volume      2508 non-null   float64
 3   Open        2547 non-null   float64
 4   High        2547 non-null   float64
 5   Low         2547 non-null   float64
dtypes: float64(5), object(1)
memory usage: 119.5+ KB

从上述信息中,我们可以看到,数据集中有2547条记录,其中’Volume’列有39个缺失值。'Date’列的数据类型为object,我们需要将其转换为datetime类型以便进行时间序列分析。

# 处理缺失值
# 由于Volume列存在缺失值,我们选择使用前一天的Volume值进行填充
df['Volume'].fillna(method='ffill', inplace=True)

# 将Date列的数据类型转换为datetime
df['Date'] = pd.to_datetime(df['Date'])

# 再次查看数据信息
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2547 entries, 0 to 2546
Data columns (total 6 columns):
 #   Column      Non-Null Count  Dtype         
---  ------      --------------  -----         
 0   Date        2547 non-null   datetime64[ns]
 1   Close/Last  2547 non-null   float64       
 2   Volume      2547 non-null   float64       
 3   Open        2547 non-null   float64       
 4   High        2547 non-null   float64       
 5   Low         2547 non-null   float64       
dtypes: datetime64[ns](1), float64(5)
memory usage: 119.5 KB

四、数据探索性分析

在进行预测之前,我们先对数据进行探索性分析,以了解数据的基本情况。

import pyecharts.options as opts
from pyecharts.charts import Line

# 绘制收盘价的时间序列图
line = (
    Line(init_opts=opts.InitOpts(width="800px", height="400px"))
    .add_xaxis(df['Date'].tolist())
    .add_yaxis("Close/Last Price", df['Close/Last'].tolist())
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(title_opts=opts.TitleOpts(title="Gold Price Close/Last Time Series"),
                     xaxis_opts=opts.AxisOpts(name="Date"),
                     yaxis_opts=opts.AxisOpts(name="Close/Last Price"))
)

line.render_notebook()

在这里插入图片描述

从上图我们可以看出,黄金的收盘价在2012年至2022年期间总体上呈现出上升的趋势,但在某些时间段内也出现了波动。这种时间序列的特性使得我们可以使用LSTM模型进行预测。

五、构建LSTM模型预测

接下来,我们将使用LSTM模型对黄金价格进行预测。

1、构建LSTM模型

from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# 数据归一化
scaler = MinMaxScaler(feature_range=(-1, 1))
data = scaler.fit_transform(df['Close/Last'].values.reshape(-1, 1))

# 划分训练集和测试集
train_data, test_data = train_test_split(data, test_size=0.2, shuffle=False)

# 转换为tensor
train_data = torch.FloatTensor(train_data).cuda()
test_data = torch.FloatTensor(test_data).cuda()

# 定义LSTM模型
class LSTM(nn.Module):
    def __init__(self, input_size=1, hidden_layer_size=200, output_size=1):
        super().__init__()
        self.hidden_layer_size = hidden_layer_size

        self.lstm = nn.LSTM(input_size, hidden_layer_size)

        self.linear = nn.Linear(hidden_layer_size, output_size)

        self.hidden_cell = (torch.zeros(1,1,self.hidden_layer_size).cuda(),
                            torch.zeros(1,1,self.hidden_layer_size).cuda())

    def forward(self, input_seq):
        lstm_out, self.hidden_cell = self.lstm(input_seq.view(len(input_seq) ,1, -1), self.hidden_cell)
        predictions = self.linear(lstm_out.view(len(input_seq), -1))
        return predictions[-1]

# 训练模型
model = LSTM().cuda()
loss_function = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.001)

epochs = 100
losses = []

for i in range(epochs):
    for seq in train_data:
        optimizer.zero_grad()
        model.hidden_cell = (torch.zeros(1, 1, model.hidden_layer_size).cuda(),
                            torch.zeros(1, 1, model.hidden_layer_size).cuda())

        y_pred = model(seq)

        single_loss = loss_function(y_pred, seq)
        single_loss.backward()
        optimizer.step()

    losses.append(single_loss.item())
    if i%25 == 1:
        print(f'epoch: {i:3} loss: {single_loss.item():10.8f}')

print(f'epoch: {i:3} loss: {single_loss.item():10.10f}')
epoch:   1 loss: 0.00053112
epoch:  26 loss: 0.00000370
epoch:  51 loss: 0.00000417
epoch:  76 loss: 0.00000103
epoch:  99 loss: 0.0000000606

2、绘制loss的变化曲线

# 绘制loss的变化曲线
line = (
    Line(init_opts=opts.InitOpts(width="800px", height="400px"))
    .add_xaxis(range(epochs))
    .add_yaxis("Loss", losses)
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(title_opts=opts.TitleOpts(title="Loss Curve"),
                     xaxis_opts=opts.AxisOpts(name="Epoch"),
                     yaxis_opts=opts.AxisOpts(name="Loss"))
)

line.render_notebook()

在这里插入图片描述

3、进行预测

import numpy as np
# 使用训练好的模型进行预测
model.eval()

test_inputs = train_data[-100:].tolist()
test_outputs = []

for i in range(len(test_data)):
    seq = torch.FloatTensor(test_inputs[-100:]).cuda()
    with torch.no_grad():
        model.hidden = (torch.zeros(1, 1, model.hidden_layer_size).cuda(),
                        torch.zeros(1, 1, model.hidden_layer_size).cuda)
        test_inputs.append(test_data[i])
        test_outputs.append(model(seq).item())

# 反归一化
predicted_price = scaler.inverse_transform(np.array(test_outputs).reshape(-1, 1))

# 绘制预测结果
plt.figure(figsize=(12, 6))
plt.plot(range(len(train_data), len(train_data) + len(predicted_price)), predicted_price, color='r', label='Predicted Price')
plt.plot(range(len(data)), scaler.inverse_transform(data), color='b', label='Actual Price')
plt.legend()
plt.show()

在这里插入图片描述

# 打印预测准确率
print('预测准确率:', 1 - np.mean(np.abs((predicted_price - scaler.inverse_transform(data[len(train_data):])) / scaler.inverse_transform(data[len(train_data):]))))
预测准确率: 0.8444566607225441

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

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

相关文章

SpringBoot——在测试阶段验证Web表现层的接口是否正常

验证请求状态 之前我们实现了在测试环境中开启Web环境&#xff0c;并且在测试阶段发送虚拟请求&#xff0c;并看到了返回的结果&#xff0c;这次我们不止要看他的请求结果&#xff0c;还要看他的请求过程和请求状态 匹配请求状态 首先就是查看请求的状态。主要介绍的就是一个…

基于 Arduino 库实现 ESP32 使能 WiFi AP + TCP Server 的应用

实现步骤&#xff1a; ESP32 开启 WiFi AP 模式创建 WiFi 热点定义 IP 地址创建 TCP Server 测试代码如下&#xff1a; #include <WiFi.h> #include <WiFiClient.h>const char* ssid "cc123"; const char* password "espressif";WiFiServ…

Python-年会抽奖

#!/usr/bin/python # coding:utf-8 # Author:Rauckimport randomclass WhoIsLuck:"""年会抽奖"""# 奖品gift [{name: 一等奖, limit: 3, desc: 泰国5日游手术费报销},{name: 二等奖, limit: 6, desc: iPhone14手机},{name: 三等奖, limit: 30, …

【Linux OS】华为openEuler操作系统与openGauss数据库安装及使用入门

华为openEuler操作系统与openGauss数据库安装及使用入门 1、软件下载1.1、openEuler1.2、openGauss1.3、Data Studio 2、系统安装2.1、创建虚拟机2.2、安装操作系统2.3、登录系统 3、数据库安装及设置3.1、数据库安装3.2、数据库管理3.3、数据库设置 4、数据库访问4.1、Navicat…

Redis:IO多路复用深度解析

目录 一、Multiplexing&#xff08;IO多路复用&#xff09;1.是什么2.能干嘛3.Reactor设计模式4.select, poll, epoll 都是I/O多路复用的具体的实现4.1 select方法4.2 poll方法4.3 epoll方法4.4 三个方法对比 5.5种 I/O 模型总结6.为什么3个都保有 一、Multiplexing&#xff08…

关于如何使用 python 下载 json 格式数据

本章节内容节自《python编程从入门到实践》第十六章&#xff0c;我们将从网络上下载数据&#xff0c;并对数据进行可视化。就可以对其进行分析甚至观察其规律和关联。 学习目标 我们将访问并可视化以下两种常见格式存储的数据&#xff1a; CSV 使用 Python 模块 CSV 来处理以 C…

SpringBoot整合EasyExcel 3.x

文章目录 1 EasyExcel 3.x1.1 简介1.2 引入依赖1.3 简单导出1.3.1 定义实体类1.3.2 自定义转换器1.3.3 定义接口 1.4 简单导入1.5 复杂导出1.5.1 引言1.5.2 自定义注解1.5.3 定义实体类1.5.4 数据映射与平铺1.5.5 自定义单元格合并策略1.5.6 定义接口 1 EasyExcel 3.x 1.1 简介…

string容器语法

文章目录 string容器string基本概念本质&#xff1a;string和char * 区别&#xff1a;特点&#xff1a; string构造函数示例 string赋值操作示例&#xff1a; string字符串拼接示例&#xff1a; string查找和替换示例&#xff1a; string字符串比较示例&#xff1a; string字符…

第六章 rabbitmq高可用集群

在服务之间会采用mq进行消息通信,而rabbitmq本身也如同consul一样,如果只有一个节点那么就可能出现宕机的问题,并且基于mq的特点我们是可以在多个服务之间使用同一个mq来相互通信,因此高可用的架构设计就必不可少 1、rabbitmq集群方案 主备 远程 镜像 多活 构建 2、…

[uni-app]设置运行到微信小程序

1、设置微信小程序开发工具路径 2、检查微信小程序开发工具是否开启了服务端口 服务端口要是没有开启&#xff0c;会报 initialize。 3、在uni-app开发工具中点击运行微信开发者工具&#xff0c;微信开发工具运行成功。

Spark架构体系

StandAlone模式是spark自带的集群运行模式&#xff0c;不依赖其他的资源调度框架&#xff0c;部署起来简单。 StandAlone模式又分为client模式和cluster模式&#xff0c;本质区别是Driver运行在哪里&#xff0c;如果Driver运行在SparkSubmit进程中就是Client模式&#xff0c;如…

谷歌Med-PaLM 2霸榜医学问答领域

谷歌IO大会上&#xff0c;谷歌CEO桑达尔・皮查伊&#xff08;Sundar Pichai&#xff09;向全世界AI开发者发布了谷歌最新的大型语言模型&#xff08;LLMs&#xff09;PaLM 2&#xff0c;作为对标OpenAI最新大模型GPT-4的竞品&#xff0c;PaLM 2展现出了强大的多语言和推理能力。…

概率论与数理统计发展历史简介

概率论与数理统计发展历史简介 1 介绍1.1 概述1.2 概率论发展历史1.3 统计学发展历史1.4 概率论演化 2 在线学习在线 概率与统计 视觉化学习 -- 布朗大学何志坚老师的数理统计讲义鸢尾花书--统计至简 参考 1 介绍 1.1 概述 概率论是与概率有关的数学分支。虽然有几种不同的概…

Linux内核模块开发 第 8 章

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客&#xff08;WaterCutter&#xff09;源 LKMPG 8 sysfs: 与模块交互 sysfs 允许用户通过读写模块中的变量实现与内核模块的交互。这个特性在…

leetcode907. 子数组的最小值之和(单调栈-java)

子数组的最小值之和 leetcode907. 子数组的最小值之和题目描述单调栈解法一代码演示单调栈解法二 单调栈专题 leetcode907. 子数组的最小值之和 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/sum-of-subarray-minimums…

如何快速学习一门计算机语言

如何快速学习一门计算机语言 掌握一门语言的基本数据类型和基本语法。掌握语言里数组和集合工具类的使用掌握循环分支控制掌握一下该计算机语言面向对象或者函数式编程的特征对异常或者错误的处理文件读写&#xff0c;输入输出流字符串的处理日志的打印运行时module或者librar…

【C语言基础】函数

C语言中的函数是模块化编程的基础&#xff0c;通过函数的定义、实参与形参的传递以及函数的调用流程&#xff0c;我们可以实现代码的重用和逻辑的封装。本文将深入探讨C语言函数的定义方式、实参与形参的传递机制&#xff0c;以及函数的调用流程和局部变量与栈内存的关系。 一、…

企业快递管理制定教程

在经济飞速发展的助力之下&#xff0c;现代企业接触到的制度越来越多&#xff0c;除了我们熟知的CRM、OA等等&#xff0c;管理制度进一步细分。企业寄件在企业内部运转中的地位越发重要&#xff0c;随之也产生了快递管理制度。不少人就会问&#xff1a;有必要这么细分吗&#x…

跨应用连接同一个redis,从redis取缓存,对象属性值都为null

本地idea部署和docker部署问题&#xff0c;连接同一个redis&#xff0c;idea项目的redis缓存&#xff0c;docker中取不到&#xff0c;docker中缓存的redis本地取不到 ✅ 原因&#xff1a;idea本地代码实体类未进行代码混淆&#xff0c;docker代码实体类进行了混淆&#xff0c;…

Caused by: java.io.IOException: CreateProcess error=206, 文件名或扩展名太长

java.io.IOException: Cannot run program "D:\javaAPP\jdk\bin\java.exe" (in directory "D:\java\demo"): CreateProcess error206, 文件名或扩展名太长。 Caused by: java.io.IOException: CreateProcess error206, 文件名或扩展名太长。 删除项目.ide…