Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测

本文详细介绍了如何使用Python进行时间序列预测,特别是ARIMA、SARIMA和SARIMAX模型的构建与应用。内容涵盖了时间序列预测的重要性、ARIMA模型的组成部分、如何确定差分阶数、找到ARIMA模型的p、d、q参数,以及如何处理季节性和外生变量。文章通过实例展示了如何在Python中实现自动ARIMA预测,解释了模型残差图的意义,并探讨了时间序列预测的准确性指标。
摘要由CSDN通过智能技术生成

最近我们被客户要求撰写关于时间序列预测的研究报告,包括一些图形和统计输出。 

 相关视频:在Python和R语言中建立EWMA,ARIMA模型预测时间序列

使用ARIMA模型,您可以使用序列过去的值预测时间序列。在本文中,我们从头开始构建了一个最佳ARIMA模型,并将其扩展到Seasonal ARIMA(SARIMA)和SARIMAX模型。

1.时间序列预测简介

时间序列是在定期时间间隔内记录度量的序列。

根据频率,时间序列可以是每年(例如:年度预算),每季度(例如:支出),每周(例如:销售数量),每天(例如天气),每小时(例如:股票价格),分钟(例如:来电提示中的呼入电话),甚至是几秒钟(例如:网络流量)。

为什么要预测?

因为预测时间序列(如需求和销售)通常具有巨大的商业价值。

在大多数制造公司中,它驱动基本的业务计划,采购和生产活动。预测中的任何错误都会扩散到整个供应链或与此相关的任何业务环境中。因此,准确地进行预测很重要,以节省成本,这对于成功至关重要。

不仅在制造业中,时间序列预测背后的技术和概念还适用于任何业务。

现在,预测时间序列可以大致分为两种类型。

如果仅使用时间序列的先前值来预测其未来值,则称为  单变量时间序列预测

如果您使用序列以外的其他预测变量(也称为外生变量)进行预测,则称为  多变量时间序列预测

这篇文章重点介绍一种称为ARIMA  建模的特殊类型的预测方法  。

ARIMA是一种预测算法,其基于以下思想:时间序列的过去值中的信息可以单独用于预测未来值。

2. ARIMA模型简介

那么ARIMA模型到底是什么?

ARIMA是一类模型,可以根据自身的过去值(即自身的滞后和滞后的预测误差)“解释”给定的时间序列,因此可以使用方程式预测未来价值。

任何具有模式且不是随机白噪声的“非季节性”时间序列都可以使用ARIMA模型进行建模。

ARIMA模型的特征在于3个项:p,d,q

p是AR项

q是MA项

d是使时间序列平稳所需的差分阶数

如果时间序列具有季节性模式,则需要添加季节性条件,该时间序列将变成SARIMA(“季节性ARIMA”的缩写)。一旦完成ARIMA。

那么,“AR项的阶数”到底意味着什么?我们先来看一下“ d”。

3. ARIMA模型中的p,d和q是什么意思

建立ARIMA模型的第一步是  使时间序列平稳

为什么?

因为ARIMA中的“自回归”一词意味着它是一个  线性回归模型  ,使用自己的滞后作为预测因子。如您所知,线性回归模型在预测变量不相关且彼此独立时最有效。

那么如何使一序列平稳呢?

最常见的方法是加以差分。即,从当前值中减去先前的值。

因此,d的值是使序列平稳所需的最小差分阶数。如果时间序列已经平稳,则d = 0。

接下来,什么是“ p”和“ q”?

“ p”是“自回归”(AR)项的阶数。它指的是要用作预测变量的Y的滞后阶数。而“ q”是“移动平均”(MA)项的阶数。它是指应输入ARIMA模型的滞后预测误差的数量。

4.什么是AR和MA模型

那么什么是AR和MA模型?AR和MA模型的实际数学公式是什么?

AR模型是Yt仅取决于其自身滞后的模型。也就是说,Yt是“ Yt滞后”的函数。

同样,纯  移动平均线(仅MA)模型  是Yt仅取决于滞后预测误差的模型。

误差项是各个滞后的自回归模型的误差。误差Et和E(t-1)是来自以下方程式的误差:

那分别是AR和MA模型。

那么ARIMA模型的方程是什么样的呢?

ARIMA模型是这样的模型,其中时间序列至少差分一次以使其平稳,然后将AR和MA项组合在一起。因此,等式变为:

因此,目的是识别p,d和q的值。 

5.如何在ARIMA模型中找到差分阶数(d)

进行差分的目的是使时间序列平稳。

但是您需要注意不要使序列过分差分。因为,超差分序列可能仍然是平稳的,这反过来将影响模型参数。

那么如何确定正确的差分阶数呢?

正确的差分阶数是获得近似平稳序列的最小差分,该序列围绕定义的平均值波动,并且ACF曲线相当快地达到零。

如果自相关对于许多阶数之后(10个或更多)为正,则该序列需要进一步求差。 

在这种情况下,你不能真正确定两个差分阶数之间的差,然后选择在差分序列中给出最小标准偏差的阶数。

让我们来看一个例子。

首先,我将使用Augmented Dickey Fuller测试()检查该序列是否平稳。

为什么?

因为,仅当序列非平稳时才需要进行差分。否则,不需要差分,即d = 0。

ADF检验的零假设是时间序列是非平稳的。因此,如果检验的p值小于显着性水平(0.05),则拒绝原假设,并推断时间序列确实是平稳的。

因此,在我们的情况下,如果P值> 0.05,我们将继续寻找差分的阶数。

from statsmodels.tsa.stattools import adfuller
from numpy import log
result = adfuller(df.value.dropna())
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
ADF Statistic: -2.464240
p-value: 0.124419

由于P值大于显着性水平,因此让我们对序列进行差分,看看自相关图的样子。

import numpy as np, pandas as pd
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
plt.rcParams.update({'figure.figsize':(9,7), 'figure.dpi':120})

# 导入数据
df = pd.read_csv('wwwusage.csv', names=['value'], header=0)

# 原始数据
fig, axes = plt.subplots(3, 2, sharex=True)
axes[0, 0].plot(df.value); axes[0, 0].set_title('Original Series')
plot_acf(df.value, ax=axes[0, 1])

# 一阶差分
axes[1, 0].plot(df.value.diff()); axes[1, 0].set_title('1st Order Differencing')
plot_acf(df.value.diff().dropna(), ax=axes[1, 1])

# 二阶差分
axes[2, 0].plot(df.value.diff().diff()); axes[2, 0].set_title('2nd Order Differencing')
plot_acf(df.value.diff().diff().dropna(), ax=axes[2, 1])

plt.show()

差分 

对于以上序列,时间序列达到平稳,具有两个不同的阶数。但是,在查看第二次差分的自相关图时,滞后会很快进入负值区域,这表明该序列可能已经过差分。

因此,即使该序列不是完全平稳的(平稳性较弱&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值