Python中的时间序列分析模型ARIMA

大家好,时间序列分析广泛用于预测和预报时间序列中的未来数据点。ARIMA模型被广泛用于时间序列预测,并被认为是最流行的方法之一。本文我们将学习如何在Python中搭建和评估用于时间序列预测的ARIMA模型。

ARIMA模型

ARIMA模型是一种用于分析和预测时间序列数据的统计模型。ARIMA方法明确适用于时间序列中的常见结构,为进行精确的时间序列预测提供了简单而强大的方法。

ARIMA是AutoRegressive Integrated Moving Average的缩写。它结合了三个关键方面:

  • 自回归(AR):使用当前观测值与滞后观测值之间的相关性建立的模型。滞后观测值的数量称为滞后阶数或p。

  • 积分(I):通过对原始观测值进行差分来使时间序列平稳。差分操作的次数称为d。

  • 移动平均(MA):模型考虑了当前观测值与应用于过去观测值的移动平均模型的残差错误之间的关系。移动平均窗口的大小为阶数或q。

ARIMA模型的表示为ARIMA(p,d,q),其中p、d和q用整数值替代以指定所使用的确切模型。

采用ARIMA模型时的关键假设:

  • 时间序列是由基础的ARIMA过程生成的。

  • 参数p、d和q必须根据原始观测值进行适当的指定。

  • 在拟合ARIMA模型之前,时间序列数据必须通过差分使其平稳。

  • 如果模型拟合良好,残差应该是不相关且服从正态分布的。

总而言之,ARIMA模型为建模时间序列数据提供了结构化和可配置的方法,用于预测等目的。接下来,本文将介绍如何在Python中拟合ARIMA模型。

Python代码示例

在本教程中,我们将使用Kaggle上提供的Netflix证券数据来使用ARIMA模型预测Netflix价格。

本示例将加载带有“日期”列作为索引的证券价格数据集。

import pandas as pd

net_df = pd.read_csv("Netflix_stock_history.csv", index_col="Date", parse_dates=True)
net_df.head(3)

图片

可以使用pandas的plot函数来可视化价格和成交量随时间的变化,很明显其价格呈指数增长。

net_df[["Close","Volume"]].plot(subplots=True, layout=(2,1));

图片

本示例的数据集已经被分成训练集和测试集,并且开始训练ARIMA模型,然后进行了第一次预测。使用通用的ARIMA模型得到了一个糟糕的结果,生成了一条平直的线,因此本示例决定尝试滚动预测方法。

from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error, mean_absolute_error
import math


train_data, test_data = net_df[0:int(len(net_df)*0.9)], net_df[int(len(net_df)*0.9):]


train_arima = train_data['Open']
test_arima = test_data['Open']


history = [x for x in train_arima]
y = test_arima
# 进行第一次预测
predictions = list()
model = ARIMA(history, order=(1,1,0))
model_fit = model.fit()
yhat = model_fit.forecast()[0]
predictions.append(yhat)
history.append(y[0])

在处理时间序列数据时,由于依赖于先前的观察结果,通常需要进行滚动预测,一种方法是在收到每个新观察结果后重新创建模型。

为了跟踪所有观察结果,可以手动维护一个名为history的列表,该列表最初包含训练数据,并在每次迭代时将新的观察结果追加到其中。这种方法可以帮助我们获得准确的预测模型。

# 滚动预测
for i in range(1, len(y)):
    # 预测
    model = ARIMA(history, order=(1,1,0))
    model_fit = model.fit()
    yhat = model_fit.forecast()[0]
    # 反转转换预测值
    predictions.append(yhat)
    # 观察结果
    obs = y[i]
    history.append(obs)

本示例的滚动预测ARIMA模型在简单实现的基础上显示出了100%的改进,产生了令人印象深刻的结果。

# 报告性能
mse = mean_squared_error(y, predictions)
print('MSE: '+str(mse))
mae = mean_absolute_error(y, predictions)
print('MAE: '+str(mae))
rmse = math.sqrt(mean_squared_error(y, predictions))
print('RMSE: '+str(rmse))
MSE: 116.89611817706545
MAE: 7.690948135967959
RMSE: 10.811850821069696

接下来将实际结果与预测结果进行可视化和比较,很明显本示例的模型进行了高度准确的预测。

import matplotlib.pyplot as plt
plt.figure(figsize=(16,8))
plt.plot(net_df.index[-600:], net_df['Open'].tail(600), color='green', label = 'Train Stock Price')
plt.plot(test_data.index, y, color = 'red', label = 'Real Stock Price')
plt.plot(test_data.index, predictions, color = 'blue', label = 'Predicted Stock Price')
plt.title('Netflix Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Netflix Stock Price')
plt.legend()
plt.grid(True)
plt.savefig('arima_model.pdf')
plt.show()

图片

本文中我们提供了ARIMA模型的概述以及如何在Python中实现时间序列预测,ARIMA方法提供了一种灵活而结构化的方式进行时间序列数据建模,它依赖于先前的观察结果和过去的预测误差。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

华为ensp防火墙虚拟系统在网络中的部署

首先我们要知道虚拟系统是啥,干什么用的,解决什么问题的,说白话就是,我没钱,买不起两台墙,我买一台墙通过虚拟系统的方式逻辑变成两台墙,学过高级路由的都知道vpn,vpn是将路由器器逻…

Spring6(六):提前编译AOT

文章目录 提前编译:AOT1. AOT概述1.1 JIT与AOT的区别1.2 Graalvm1.3 Native Image 2. 演示Native Image构建过程2.1 GraalVM安装(1)下载GraalVM(2)配置环境变量(3)安装native-image插件 2.2 安装…

内存泄漏、new、delete

1. 内存泄漏 内存泄漏&#xff1a;指针被销毁&#xff0c;指针指向的空间依旧存在 2. new过程 与内存分配、构造函数有关 1&#xff09;分配空间&#xff1a;void* mem operator new( sizeof( ) )&#xff0c;内部调用malloc 2&#xff09;static_cast<目标类型>(mem) …

uniapp 实现微信小程序手机号一键登录

app 和 h5 手机号一键登录&#xff0c;参考文档&#xff1a;uni-app官网 以下是uniapp 实现微信小程序手机号一键登录 1、布局 <template><view class"mainContent"><image class"closeImg" click"onCloseClick"src"quic…

2023年【安全员-C证】考试题库及安全员-C证考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试题库根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证考试总结全…

Pytorch数据集读出到transform全过程

最近写代码又遇见了这个问题&#xff0c;又忘记了&#xff0c;于是写一篇博客记录一下。 一般我们使用pytorch获取CIFAR10数据集&#xff0c;一般这样写&#xff1a; mean [0.4914, 0.4822, 0.4465] std [0.2023, 0.1994, 0.2010] transform transforms.Compose([transform…

传统游戏难产 育碧瞄向Web3

出品过《刺客信条》的游戏大厂育碧&#xff08;Ubisoft&#xff09;又在Web3游戏领域有了新动作。 首次试水NFT无功而返后&#xff0c;育碧&#xff08;Ubisoft&#xff09;战略创新实验室与Web3游戏网络Immutable达成合作&#xff0c;将利用Immutable 开发游戏的经验和及生态…

春秋云境靶场CVE-2022-25578漏洞复现(利用htaccess文件进行任意文件上传)

文章目录 前言一、CVE-2022-25578靶场概述二、CVE-2022-25578复现需要知道的知识点1、什么是htaccess文件2、上传htaccess文件的条件是什么&#xff1f;3、htaccess文件的作用是什么&#xff1f; 三、CVE-2022-32991漏洞复现1、信息收集2、找上传点3、上传后蚁剑连接getshell 总…

基于模拟退火算法的TSP问题建模求解(Python)

基于模拟退火算法的TSP问题建模求解&#xff08;Python&#xff09; 一、模拟退火算法&#xff08;Simulated Annealing Algorithm&#xff0c;SAA&#xff09;工程背景模拟退火算法用于优化问题求解原理 二、旅行商问题&#xff08;Travelling salesman problem&#xff0c;TS…

计算机毕业设计选题推荐-二手交易跳蚤市场微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

EMNLP 2023 | DeepMind提出大模型In-Context Learning的可解释理论框架

论文题目&#xff1a;In-Context Learning Creates Task Vectors 论文链接&#xff1a;https://arxiv.org/abs/2310.15916 01. 引言 此外&#xff0c;作者也提到本文的方法与软提示&#xff08;soft-prompt&#xff09;[1]方法类似&#xff0c;soft-prompt也是通过调整大模型内…

Nginx配置开启HTTPS

获取证书文件 Nginx 开启SSL server {listen 443 default ssl;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;proxy_set_header Host $host;ssl_certificate /usr/local/nginx/cert/server.pem;ssl_certificate_key /usr/local/ngin…

java时间类

一、java时间类为什么这么复杂? java的时间类非常复杂&#xff0c;这是由于jdk1.0到jdk1.1的时间类设计存在缺陷&#xff0c;导致使用不方便&#xff0c;线程不安全等问题&#xff0c;所以在jdk1.8&#xff0c;java又重新加入了一些时间类替换之前的时间类&#xff0c;但是jd…

ExoPlayer架构详解与源码分析(8)——Loader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

DNS服务器典型配置

文章目录 安装主程序bind和安全插件bind-root修改主配置文件/etc/named.conf正向解析 安装主程序bind和安全插件bind-root yum install bind-chroot修改主配置文件/etc/named.conf vim /etc/named.conf将listen-on和allow-query的ip或域名换成any 表示为服务器所有的IP地址启…

多svn仓库一键更新脚本分享

之前分享过多git仓库一键更新脚本&#xff0c;本期就分享下svn仓库的一键更新脚本 1、首先需要设置svn为可执行命令行 打开SVN安装程序&#xff0c;选择modify&#xff0c;然后点击 command client tools&#xff0c;安装命令行工具 2、update脚本 echo 开始更新SVN目录&…

【Android 标题文字居中 快速实现】

背景&#xff1a; Android App系统默认setTitle左起展示(图左)&#xff0c;IOS App默认居中展示(图右)。现在美工设计 在Android中标题同样居中显示。 解决&#xff1a; 方案一&#xff1a;(传统方式,比较繁琐) 设置ToolBar样式&#xff0c;内嵌TextView来展示&#xff0c;具…

网络安全准入技术之MAC VLAN

网络准入控制作为主要保障企业网络基础设施的安全的措施&#xff0c;特别是对于中大型企业来说&#xff0c;终端类型多样数量激增、终端管理任务重难度大、成本高。 在这样的一个大背景下&#xff0c;拥有更灵活的动态识别、认证、访问控制等成为了企业网络安全的最核心诉求之…

保姆级教程——pytest【入门篇】

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

【libGDX】初识libGDX

1 前言 libGDX 是一个开源且跨平台的 Java 游戏开发框架&#xff0c;于 2010 年 3 月 11 日推出 0.1 版本&#xff0c;它通过 OpenGL ES 2.0/3.0 渲染图像&#xff0c;支持 Windows、Linux、macOS、Android、iOS、Web 等平台&#xff0c;提供了统一的 API&#xff0c;用户只需要…