用Python实现时间序列模型实战——Day 26-27: 时间序列分析项目实战

news2024/9/20 10:06:52
一、学习内容

在本次项目实战中,我们将使用一个复杂的时间序列数据集,展示完整的时间序列分析流程,包括:

  1. 数据探索与预处理:初步分析数据的特征,处理缺失值和异常值,进行必要的转换。
  2. 建模:使用多个模型(例如 ARIMA、SARIMA、LSTM)对数据进行建模,并比较它们的表现。
  3. 预测与评估:对模型的预测结果进行评估,通过均方误差 (MSE)、均方根误差 (RMSE) 等指标进行对比。

我们可以使用来自 yfinance 的股票市场数据来替代原数据进行时间序列分析。yfinance 提供了方便的 API 来获取股票历史数据。接下来我们将使用 yfinance 获取股票数据并进行时间序列分析。

二、使用 yfinance 的完整项目实战案例
2.1 Python 代码实现
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.statespace.sarimax import SARIMAX
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
from sklearn.preprocessing import MinMaxScaler
import yfinance as yf

# 1. 数据加载与探索
stock_ticker = 'AAPL'  # 选择苹果公司作为示例
data = yf.download(stock_ticker, start='2015-01-01', end='2022-01-01')

# 使用调整后的收盘价作为时间序列数据
stock_data = data[['Adj Close']]

# 2. 数据可视化
plt.figure(figsize=(14, 7))
plt.plot(stock_data.index, stock_data['Adj Close'], label='Apple Stock Price')
plt.title('Apple Stock Price from 2015 to 2022')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.grid(True)
plt.show()

# 3. 数据拆分
train_size = int(len(stock_data) * 0.8)
train, test = stock_data.iloc[:train_size], stock_data.iloc[train_size:]

# 4. 模型1:ARIMA
p, d, q = 5, 1, 0
arima_model = ARIMA(train['Adj Close'], order=(p, d, q))
arima_model_fit = arima_model.fit()

arima_pred = arima_model_fit.predict(start=len(train), end=len(train)+len(test)-1, typ='levels')

# 5. 模型2:SARIMA
sarima_model = SARIMAX(train['Adj Close'], order=(1,1,1), seasonal_order=(1,1,1,12))
sarima_model_fit = sarima_model.fit()

sarima_pred = sarima_model_fit.predict(start=len(train), end=len(train)+len(test)-1, typ='levels')

# 6. 模型3:LSTM
# 数据标准化
scaler = MinMaxScaler(feature_range=(0, 1))
train_scaled = scaler.fit_transform(train[['Adj Close']])

# 构建 LSTM 数据格式
def create_lstm_data(data, time_steps=1):
    X, y = [], []
    for i in range(len(data) - time_steps):
        X.append(data[i:(i + time_steps), 0])
        y.append(data[i + time_steps, 0])
    return np.array(X), np.array(y)

time_steps = 10
X_train, y_train = create_lstm_data(train_scaled, time_steps)

# Reshape input to be [samples, time steps, features]
X_train = X_train.reshape(X_train.shape[0], time_steps, 1)

# 构建 LSTM 模型
lstm_model = Sequential()
lstm_model.add(LSTM(50, return_sequences=True, input_shape=(time_steps, 1)))
lstm_model.add(LSTM(50, return_sequences=False))
lstm_model.add(Dense(1))

lstm_model.compile(optimizer='adam', loss='mean_squared_error')
lstm_model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=1)

# LSTM 预测
test_scaled = scaler.transform(test[['Adj Close']])
X_test, y_test = create_lstm_data(test_scaled, time_steps)
X_test = X_test.reshape(X_test.shape[0], time_steps, 1)

lstm_pred_scaled = lstm_model.predict(X_test)
lstm_pred = scaler.inverse_transform(lstm_pred_scaled)

# 7. 模型对比与结果可视化
plt.figure(figsize=(14, 7))
plt.plot(test.index, test['Adj Close'], label='Actual Price')
plt.plot(test.index, arima_pred, label='ARIMA Prediction', color='red')
plt.plot(test.index, sarima_pred, label='SARIMA Prediction', color='green')
plt.plot(test.index[time_steps:], lstm_pred, label='LSTM Prediction', color='blue')
plt.title('Model Predictions vs Actual Stock Price')
plt.xlabel('Date')
plt.ylabel('Price (USD)')
plt.legend()
plt.grid(True)
plt.show()

# 8. 模型评估
arima_mse = mean_squared_error(test['Adj Close'], arima_pred)
sarima_mse = mean_squared_error(test['Adj Close'], sarima_pred)
lstm_mse = mean_squared_error(test['Adj Close'][time_steps:], lstm_pred)

print(f'ARIMA MSE: {arima_mse}')
print(f'SARIMA MSE: {sarima_mse}')
print(f'LSTM MSE: {lstm_mse}')
2.2 代码解释
  • 数据加载与预处理:使用 yfinance 获取苹果公司 (AAPL) 从 2015 年到 2022 年的股票价格数据,主要分析调整后的收盘价 (Adj Close)。

  • 数据可视化:使用 matplotlib 绘制股票价格的时间序列图,可以看到股票价格的历史趋势。

  • 数据拆分:将数据集分为 80% 的训练集和 20% 的测试集。

  • ARIMA 模型:使用 ARIMA 模型对训练数据进行建模,并预测测试集的股票价格。

  • SARIMA 模型:SARIMA 模型可以捕捉时间序列中的季节性变化。在这个例子中,我们使用了季节性成分为 12 个月的 SARIMA 模型。

  • LSTM 模型:LSTM 模型通过深度学习方法捕捉时间序列的长序列依赖关系。我们将数据标准化,并创建 LSTM 需要的格式来进行训练和预测。

  • 模型对比与可视化:将 ARIMA、SARIMA 和 LSTM 模型的预测结果与实际数据进行对比,绘制预测曲线和实际价格的图表。

  • 模型评估:使用均方误差 (MSE) 评估每个模型的性能,MSE 越低,模型的预测性能越好。

ARIMA MSE: 776.4477055228828
SARIMA MSE: 62.18438569258952
LSTM MSE: 23.93587715477301
三、结果分析
3.1 ARIMA 模型
  • ARIMA 模型适合平稳的时间序列,能够捕捉自回归和移动平均成分。
3.2 SARIMA 模型
  • SARIMA 模型适合具有季节性变化的时间序列,能够更好地捕捉数据中的季节性波动。
3.3 LSTM 模型
  • LSTM 模型通过深度学习方法,可以捕捉更复杂的时间序列模式,特别适合长时间依赖的序列。
3.4 模型评估
  • 通过对比 ARIMA、SARIMA 和 LSTM 模型的均方误差,我们可以判断哪个模型在股票价格预测中表现更好。
四、总结

通过本项目,我们展示了如何使用 yfinance 获取股票市场数据,并应用多种时间序列模型(ARIMA、SARIMA、LSTM)进行建模与预测。每个模型有其优势和适用场景,在金融领域的应用中可以根据具体数据选择合适的模型。

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

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

相关文章

EmguCV学习笔记 VB.Net 12.2 WeChatQRCode

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

BGP 路由反射器

转载:BGP 路由反射器 / 实验介绍: / 原理概述 缺省情况下,路由器从它的一个 IBGP 对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体,这个原则称为BGP水平分割 原则,该原则的根本作用是防止 AS 内部的 BGP 路由…

卷王阿里又开启价格战,大模型价格降价85%!

我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 9月19日,就是昨天,一年一度的云计算盛…

【每天学点AI】一个例子带你了解Python装饰器到底在干嘛!

今天我们来聊聊一种能给你的代码变得“加料”的神器——Python装饰器。 就像一杯咖啡,原本它是苦的,为了让它符合我的口味,我给它添加了糖,添加之后就完美的符合了我的口味。 那么,装饰器又是如何给代码进行“加料”呢…

1 elasticsearch安装

【0】官网参考 https://www.elastic.co/guide/en/elasticsearch/reference/7.11/targz.html 【1】Centos7 下载安装 【1.1】下载 官网:Download Elasticsearch | Elastic 选择好自己想要的相关版本即可; 【2】Centos7.X 前置环境配置(uli…

Request 跨线程访问问题

优质博文:IT-BLOG-CN 此篇文章是基于 Tomcat Request Cookie 丢失问题 文章的一个延续 一、Request 跨线程访问问题 问题代码摘要 为了方便选择发起get请求,然后只需要传递一个参数就行,核心步骤是要把request传递到异步线程里面去&#xf…

ssm自助购药小程序 LW PPT源码调试讲解

第二章开发技术介绍 此系统的关键技术和架构,Java技术、B/S结构、Ssm框架和Mysql数据库,是本系统的关键开发技术,对系统的整体、数据库、功能模块、系统页面以及系统程序等设计进行了详细的研究与规划。 2.1 系统开发平台 在线自助购药小程…

Linux入门攻坚——33、Mini Linux制作-2

前面是通过自定义内核配置制作的一个非常精简的Linux,这个Linux只能执行已经移植的有限的几个命令程序,为了使其具有更多功能,且控制其大小,使用kernel busybox。 busybox模拟实现了linux的各种命令程序。BusyBox 是一个集成了三…

【WPF】01 微软官方介绍开篇

这篇引入微软的首页介绍,比较全面,用于个人学习查看的内容,方便查找,后续将根据实战情况,逐步积累应用到的方法实现的效果等。 WPF 介绍 Windows Presentation Foundation (WPF) 是下一代显示系统,用于生…

微型丝杆加工的基本环境要求

微型丝杆是现代工业中常见的传动装置,广泛应用于各种机械设备和自动化系统中。而在潮湿、腐蚀性气体或高温等特殊环境下,微型丝杆需要具备特殊的环境适应性和防腐性能,以确保其长期稳定可靠地工作。那么微型丝杆的加工对环境有什么要求呢&…

IDEA中其他操作

删除类文件 点击想要删除的类-鼠标右键-Delete即可删除。需要注意的是如果该类中有代码引用了其他相关代码的话,需要先删除其他相关代码才能删除该类。 修改类名称 点击选中类-鼠标右键-Refactor-Rename 修改模块名 与修改类名称是一样的操作,只是在…

物流系统打单软件 佳易王物流运单怎么打印教程

一、前言 物流系统打单软件 佳易王物流运单怎么打印教程 1、佳易王物流管理系统可同时打印物流单和标签 2、如果一台电脑上有多台打印机,软件可以设置物流或标签对应的打印机,系统自动识别打印机。 二、软件程序图文说明 1、上图为 物流单在空白单上打…

JS在线加密解密工具

快捷工具网得JS加密解密工具为您提供JS加密解密,js加解密工具,JS在线加解密,JS代码在线加解密,该工具基于eval方法的加密与解密功能,用户可将js代码加密成eval方法执行形式的代码,也可将eval方法加密过的代码进行解密操作。是一款非常简便实用的在线Java…

身份证实名认证的应用场景-身份证识别api

引言 在互联网时代,虚拟身份和真实身份的界限逐渐模糊。为了保证线上平台的安全性和可信度,身份证实名认证逐渐成为必不可少的验证方式。它通过身份信息的核验,确保用户是真实的个人,防止虚假身份带来的各类风险。本文将探讨身份证…

使用vite+react+ts+Ant Design开发后台管理项目(一)

前言 本文将引导开发者从零基础开始,运用、react、react-router、react-redux、Ant Design、less、tailwindcss、axios等前沿技术栈,构建一个高效、响应式的后台管理系统。通过详细的步骤和实践指导,文章旨在为开发者揭示如何利用这些技术工…

Zabbix 部署----安装Zabbix(业务主机)

目录 1、另外准备一台虚拟机(192.xx.xx.20) 设置主机名 关闭防火墙、selinux 准备zabbix-repo 安装zabbix-agent 配置主服务器地址 启动zabbix-agent:10050 1、另外准备一台虚拟机(192.xx.xx.20) 设置主机名 hostname web1 关闭防火墙、selinux syst…

RS®AREG100A 汽车电子雷达回波发生器

AREG100A 汽车电子雷达回波发生器 轻松进行可靠的汽车电子雷达传感器生产测试 综述 R&SAREG100A 汽车电子雷达回波发生器是一款强大的智能解决方案,可用于生产过程中的汽车电子雷达传感器测试。借助 R&SAREG100A,生产工程师可获得多种优势&am…

二、编译原理-词法分析

一、词法分析器的作用 1、词法分析器的作用 读入字符流,组成词素,输出词法单元序列 过滤空白、换行、制表符、注释等 将词素添加到符号表中,以便编译的各个阶段取用 2、词法单元、模式、词素 (1)词法单元 (token…

Halcon OCR检测 免训练版

一.前言: 目前新版的Halcon已经具备了DeepOcr的功能可以涵盖大部分的识别场景,缺点是有些特殊的应用场景依然需要大量的图片训练,而且Halcon22之前的版本DeepOCR是不支持训练的,我们都知道传统的OCR项目是通过Blob分析&#xff0…

Linux中的进程入门

冯诺依曼体系结构 操作系统(Operator System) 进程控制块(PCB) struct task_struct{//该进程的所有属性//该进程对应的代码和属性地址struct task_struct* next; }; struct task_struct 内核结构体——>创建内核结构体对象(task_struct)…