时间序列模型算法 - ARIMA (一)

这篇具有很好参考价值的文章主要介绍了时间序列模型算法 - ARIMA (一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.时间序列模型概述

时间序列是研究数据随时间变化而变化的一种算法。是一种预测性分析算法。它的基本出发点就是事物发展都有连续性,按照它本身固有的规律进行。

时间序列的常用算法包括:
时间序列模型算法 - ARIMA (一)
有这几个那如何选择模型呢

首先我们要知道时间序列就是按照时间顺序排列,随时间变化的随机过程,也就是说有对应的均值、方差、协方差等。
时间序列可以解决在只有时间(序列项)而没有其他可控变量下对未来数据的预测问题,常用于经济预测、股市预测、天气预测等。

如果随机过程随着时间变化,则此过程是非平稳的,相反,如果随机过程的特征不随时间变化,则此过程为平稳的

  • 如果导致非平稳的原因确定:ES、MA、AR、ARMA
  • 如果是平稳序列:ARIMA

1.1 时间序列的不同分类

时间序列是按时间顺序排列的、随时间变化且相互关联的数据序列。分析时间序列的方法构成数据分析的一个重要领域,即时间序列分析。

时间序列根据研究的依据不同,可有不同的分类。

  1. 按研究对象的多少划分,有一元时间序列和多元时间序列。
  2. 按时间的连续性将时间序列分为离散时间序列和连续时间序列两种。
  3. 按序列的统计特性划分,有平稳时间序列和非平稳时间序列。

如果一个时间序列的概率分布与时间t无关,则称该序列为严格的(狭义)平稳时间序列。

如果序列的一、二阶矩存在,而且对任意时刻t满足:

(1)均值为常数

(2)协方差为时间间隔 T 的函数。则称为宽平稳(广义)时间序列。以后研究的时间序列主要是宽平稳时间序列。

  1. 按时间序列的分布规律划分,有高斯型时间序列和非高斯型时间序列。

1.2 确定性时间序列分析方法概述

一个时间序列可以分解为以下四部分:

(1)长期趋势变动。它指时间序列朝一定方向持续上升或下降,或停留在某一水平上,它反映了客观事物的主要变化趋势。

(2)季节变动。

(3)循环变动。通常指周期为一年以上,由非季节因素引起的波形相似的波动。

(4)不规则变动。通常为突然变动和随机变动。

1.3 三种时间序列模型

通常用 T t T_t Tt 表示长期趋势项, S t S_t St 表示季节变动趋势项, C t C_t Ct 表示循环变动趋势项, R t R_t Rt 表示随机干扰项。常见的确定性时间序列模型有以下类型:

(1)加法模型

y t = T t + S t + C t + R t y_t = T_t + S_t + C_t + R_t yt=Tt+St+Ct+Rt

(2)乘法模型

y t = T t ∗ S t ∗ C t ∗ R t y_t = T_t * S_t * C_t * R_t yt=TtStCtRt

(3)混合模型

y t = T t ∗ S t + R t y_t = T_t * S_t + R_t yt=TtSt+Rt

y t = S t + T t ∗ C t ∗ R t y_t = S_t + T_t * C_t * R_t yt=St+TtCtRt

其中 y t y_t yt 是观测目标的观测记录, E ( R t ) = 0 E(R_t) = 0 E(Rt)=0 E ( R t 2 ) = σ 2 E(R^2_{t}) = σ^2 E(Rt2)=σ2

2.指标平滑ES

2.1 一次指数平滑法

线性回归算法中,每个经验点的权重是一致的,即很早以前的经验数据也可能对预测数据有较大的影响。很多实际场景中,未来一段时间的趋势可能和在最近一段时间的趋势关系更加紧密。比如小明去年数学考试成绩一直不及格,今年连续多次考试90多分,预测小明下一次数学考试的成绩,情理上90多分的可能性更高。采用传统的线性回归算法,预测结果可能是70多分。

指数平滑法原则认为,时间越靠过去的经验数据对趋势的影响越小。我们假定时间t的观测值为y(t),时间t的预测值为S(t),则时间t+1的预测值S(t+1)为
S t + 1 = a y t + ( 1 − a ) S t S_{t+1}=ay_t+(1-a)S_t St+1=ayt+(1a)St
a的取值范围在(0,1),a越大,最近时间点的观测值对预测值的影响越大

另外还有二次指数平滑、三次指数平滑,就不介绍,懒得写

3.ACF与PACF

首先来说ACF与PACF是用来确定模型AR(p,)、MA(q,)、ARMA(p,q)、ARIMA(p,l,q),中p、q。方法如下:
时间序列模型算法 - ARIMA (一)

  • 截尾:落在置信区间(95%的点都符合该规则)

如何用PACF图和ACF图来确定p、q值
通常我们确定了模型后,看模型的数据的阶数和2倍标准差范围。

这里先解释一下 阶数就是历史观测项,比如当前时间t数据为 x t x_t xt阶数为7,表示 x t − 7 x_{t-7} xt7

🥳开始可以对照上面的表进行分析

acf、pacf图如下图
时间序列模型算法 - ARIMA (一)

可以看到acf图中q到7阶段时,后续的值逐渐倾向于0的,是符合拖尾的,在pacf图中p到1阶段时,后续的值逐渐倾向于0的。所以模型为AR(1),

假设选择模型为ARMA

其acf、pacf图如下图
时间序列模型算法 - ARIMA (一)
ACF和PACF都呈现衰减趋于零,在1阶位置就开始基本落在2倍标准差范围,所以是ARMA(1,1)模型

4.AR

AR是线性时间序列分析模型,通过自身当前数据与历史之前的数据之间的相关关系(自相关)来建立回归方程,
在时间序列中,当前观测值可以通过历史的观测值,结合相关性获得,公式如下:

Y t = c + Φ 1 Y t − 1 + Φ 2 Y t − 2 + . . . . . . + Φ p Y t − p + ξ t Y_t=c+\Phi_{1}Y_{t-1}+\Phi_{2}Y_{t-2}+......+\Phi_{p}Y_{t-p}+\xi_{t} Yt=c+Φ1Yt1+Φ2Yt2+......+ΦpYtp+ξt

公式中 ξ t \xi_{t} ξt为噪声, Y t − 1 Y_{t-1} Yt1, Y t − 2 Y_{t-2} Yt2是历史观测项, p p p是历史观测值

5.MA

过将一段时间序列中白噪声序列进行加权和,可以得到移动平均方程。
在时间序列中,当前观测值是由历史的误差的线性组合成的,这些误差互相独立分布且服从正态分布。公式如下:
Y t = c + ξ t + θ 1 ξ t − 1 + θ 2 ξ t − 2 + . . . . . . + θ q ξ t − q Y_t=c+\xi_{t}+\theta_{1}\xi_{t-1}+\theta_{2}\xi_{t-2}+......+\theta_{q}\xi_{t-q} Yt=c+ξt+θ1ξt1+θ2ξt2+......+θqξtq

6.ARMA

自回归移动平均模型是与自回归和移动平均模型两部分组成。
ARMA(p,q)模型全称为自回归移动平均模型,公式如下:
Y t = c + Φ 1 Y t − 1 + Φ 2 Y t − 2 + . . . . . . + Φ p Y t − p + ξ t + θ 1 ξ t − 1 + θ 2 ξ t − 2 + . . . . . . + θ q ξ t − q Y_t=c+\Phi_{1}Y_{t-1}+\Phi_{2}Y_{t-2}+......+\Phi_{p}Y_{t-p}+\xi_{t}+\theta_{1}\xi_{t-1}+\theta_{2}\xi_{t-2}+......+\theta_{q}\xi_{t-q} Yt=c+Φ1Yt1+Φ2Yt2+......+ΦpYtp+ξt+θ1ξt1+θ2ξt2+......+θqξtq

7.ARIMA

ARIMA(p,d,q)模型全称为差分自回归移动平均模型
(Autoregressive Integrated Moving Average Model,简记ARIMA).
自回归(AR),差分(I),移动平均(MA)
趋势参数:

  • p:趋势自回归阶数。
  • d:趋势差分阶数。
  • q:趋势移动平均阶数。

ARIMA与ARMA模型公式都是一样的,区别在于,ARIMA公式中的Y变成差分算子(即Y是经过原始Y值差分计算了一次的新值),保证了数据 的稳定性。

7.1 差分

差分(difference)又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。它将原函数f(x) 映射到f(x+a)-f(x+b) 。差分运算,相应于微分运算,是微积分中重要的一个概念。总而言之,差分对应离散,微分对应连续。差分又分为前向差分、向后差分及中心差分三种。

通常情况下我们用到的是前向差分公式如下:

x k = x 0 + k h , ( k = 0 , 1 , . . . , n ) x_k=x_0+kh,(k=0,1,...,n) xk=x0+kh,(k=0,1,...,n)
△ f ( x k ) = f ( x k + 1 ) − f ( x k ) \triangle f(x_k)=f(x_{k+1})-f(x_k) f(xk)=f(xk+1)f(xk)

差分的阶

称为阶的差分,即前向阶差分 ,如果数学运用根据数学归纳法,有其中,为二项式系数。特别的,有前向差分有时候也称作数列的二项式变换

😍以物理学中来理解,一个汽车位移与时间的问题。

一阶导数表示速度,二阶差分表示速度的导数加速度。同样的,在时间序列模型中,一阶差分表示相邻时间的数据的变化情况,二阶差分就表示这种变化的变化强弱。

8. ARIMA实践

8.1 读取数据

🥰这里的数据集AirPassengers.csv,百度都搜到得

import numpy as np
import pandas as pd
from datetime import datetime
import matplotlib.pylab as plt
data=pd.read_csv('AirPassengers.csv',encoding='utf-8')
data.head(5)

时间序列模型算法 - ARIMA (一)

8.2 画图,观察数据是否非平稳

def draw_ts(timeSeries):
    f = plt.figure(facecolor='white')
    timeSeries.plot(color='blue')
    plt.legend()
    plt.show()
draw_ts(data)

时间序列模型算法 - ARIMA (一)
🐻从图中看,序列是非平稳时间序列。

8.3 差分,观察数据

一阶差分

data['diff_1']=data.diff()
draw_ts(data['diff_1'])

时间序列模型算法 - ARIMA (一)
二阶差分,我们通常最多就做到二阶差分就行

data['diff_2']=data['diff_1'].diff()
draw_ts(data['diff_2'])

时间序列模型算法 - ARIMA (一)
🐻大致可以看图,差分为平稳时间序列

8.4 单位根检验,确定数据为平稳时间序列

单位根检验背后的直觉是它确定趋势定义时间序列的强度。

有许多单位根测试,Augmented Dickey-Fuller可能是更广泛使用的之一。它使用自回归模型并优化跨多个不同滞后值的信息标准。

测试的零假设是时间序列可以用单位根表示,它不是静止的(具有一些时间依赖的结构)。替代假设(拒绝零假设)是时间序列是静止的。

  • 空假设(H0):如果未被拒绝,则表明时间序列具有单位根,这意味着它是非平稳的。它有一些时间依赖的结构。
  • 替代假设(H1):零假设被拒绝;
    它表明时间序列没有单位根,这意味着它是静止的。它没有时间依赖的结构。

我们使用测试中的p值来解释这个结果。在下面的代码反馈结果也会出现p。低于阈值的p值(例如5%或1%)表明我们拒绝零假设(静止),否则高于阈值的p值表明我们未能拒绝零假设(非静止)。

  • p值> 0.05:无法拒绝原假设(H0),数据具有单位根并且是非平稳的。
  • p值<=0.05:拒绝原假设(H0),数据没有单位根并且是静止的。

我们先用原数据进行检验看看。

def testStationarity(ts):
    dftest = adfuller(ts)
    # 对上述函数求得的值进行语义描述
    dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
    for key,value in dftest[4].items():
        dfoutput['Critical Value (%s)'%key] = value
    return dfoutput
testStationarity(data)

时间序列模型算法 - ARIMA (一)
上图我们只需关注p值,其余的参数解释如下:

  • Test Statistic:ADF检验的结果
  • p-value:p值
  • Lags Used:滞后数量
  • Number of Observations Used:用于ADF回归和临界值计算的数量
  • Critical Value:临界值1%、5%、10%

下面我们用1阶差分来检验

diff_1=data.diff()
diff_1 = diff_1.dropna()
testStationarity(diff_1)

时间序列模型算法 - ARIMA (一)
🐯从结果来看还无法拒绝原假设(原假设为是平稳时间序列),这时候我们通常对原数据先进行对数处理,再进行一次差分。

del data['diff_1']
del data['diff_2']
ts_log = np.log(data)
draw_ts(ts_log)

时间序列模型算法 - ARIMA (一)

logdiff_1=ts_log.diff(12)
logdiff_1 = logdiff_1.dropna()
logdiff_2=logdiff_1.diff(1)
logdiff_2=logdiff_2.dropna()
testStationarity(logdiff_2)

时间序列模型算法 - ARIMA (一)
🙊p值小于0.05,拒绝原假设(原假设为是平稳时间序列),故数据为平稳时间序列

8.5 Q检验,检验是否数据具有相关性

检验当前时刻t到滞后时刻k(Lags Used), y t y_t yt与y_{t-k}的相关性。
由上小节得到的滞后值为12.

from statsmodels.stats.diagnostic import acorr_ljungbox
acorr=acorr_ljungbox(logdiff_2,lags=12)
acorr

时间序列模型算法 - ARIMA (一)
🏀这里acorr[0]为这12个时刻的统计值,acorr[1],为t时刻的统计值与滞后的12时刻的相关性。
从结果可以看出,p值较小,拒绝原假设(没有相关性),故数据有序列相关性

8.6 确定AR和MA,画ACF、PACF判断

from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
pacf = plot_pacf(logdiff_2, lags=20)
plt.title('PACF')
pacf.show()

acf = plot_acf(logdiff_2, lags=20)
plt.title('ACF')
acf.show()

时间序列模型算法 - ARIMA (一)
时间序列模型算法 - ARIMA (一)
🏉从图可得 p=1,q=1

8.7 使用AIC、BIC最小准则确定p、q

import statsmodels.tsa.stattools as st
model = st.arma_order_select_ic(logdiff_2, max_ar=5, max_ma=5, ic=['aic', 'bic', 'hqic'])
model.bic_min_order 

返回(2,3)

8.8 拟合ARIMA或者ARMA模型

使用差分后的数据

from statsmodels.tsa.arima_model import ARMA
model_arma = ARMA(logdiff_2, order = model.bic_min_order)
result_arma = model_arma.fit(disp = -1, method = 'css')

使用原始数据

from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(data, order=(1,1,1))
result = model.fit()

8.9 检验模型效果:残差检验

残差检验,对已经训练好的模型,对模型的残差,进行可视化,
对残差进行可视化,判断残差是否符合正态分布

  • 若为正态分布则恭喜你,模型建立完毕
  • 若不为正态分布,则说明残差中还有有用信息,需要你优化模型啦
resid = result.resid
from statsmodels.graphics.api import qqplot
qqplot(resid, line='q', fit=True)
plt.show()

时间序列模型算法 - ARIMA (一)

8.10 预测

pred = result.predict(start=1, end =len(data) + 10 ) # 从训练集第0个开始预测(start=1表示从第0个开始),预测完整个训练集后,还需要向后预测10个
print(len(pred))
print(pred[-10:]) # 有负数,表明是一阶差分之后的
# 此时可以画出预测的曲线和data_diff进行比较

时间序列模型算法 - ARIMA (一)文章来源地址https://www.toymoban.com/news/detail-427110.html

8.11 将预测的平稳值还原为非平稳序列

result_fina = np.array(pred[0:-10]) + (np.array(data.shift(1)))
result_fina

# 如果还取了对数,进行如下操作
# result_log_rev = np.exp(result_fina)
# result_log_rev.dropna(inplace=True)

到了这里,关于时间序列模型算法 - ARIMA (一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python时间序列分析--ARIMA模型实战案例

    **本文将介绍使用Python来完成时间序列分析ARIMA模型的完整步骤与流程,绘制时序图,平稳性检验,单位根检验,白噪声检验,模型定阶,参数估计,模型检验等完整步骤。Python建立时间序列分析–ARIMA模型实战案例 时间序列指的是将带有同一指标单位的数值按照产生时间的先

    2024年01月17日
    浏览(50)
  • SPSS软件实操——ARIMA时间序列预测模型

    时间序列预测——ARIMA模型 https://blog.csdn.net/beiye_/article/details/123317316?spm=1001.2014.3001.5501 ​​​​​​​​​​​​​​ 案例:基于ARIMA模型对螺纹钢价格预测——以南昌市为例 钢铁作为我国经济发展主要战略原材料,其价格成本也是工程造价预算的重要组成部分,利用时间

    2024年01月25日
    浏览(47)
  • 用Python语言进行时间序列ARIMA模型分析

    应用时间序列 时间序列分析是一种重要的数据分析方法,应用广泛。以下列举了几个时间序列分析的应用场景: 1.经济预测:时间序列分析可以用来分析经济数据,预测未来经济趋势和走向。例如,利用历史股市数据和经济指标进行时间序列分析,可以预测未来股市的走向。

    2024年02月03日
    浏览(68)
  • ARIMA模型时间序列数据分析(附python代码)

    ARIMA模型建模流程  1 )平稳性检验与差分处理 我们选取原始数据 bus 中的“ prf_get_person_count ”列,并截取前 32 个站点的数据进行平稳性检验,这里采用的是 ADF 检验确定数据的平稳性,导入 statsmodels 包下的 adfuller 函数,该函数返回 adf 值与概率 p 值。若原始序列不平稳,就

    2024年02月01日
    浏览(56)
  • Python中的ARIMA模型、SARIMA模型和SARIMAX模型对时间序列预测

    最近我们被客户要求撰写关于时间序列预测的研究报告,包括一些图形和统计输出。  使用ARIMA模型,您可以使用序列过去的值预测时间序列。在本文中,我们从头开始构建了一个最佳ARIMA模型,并将其扩展到Seasonal ARIMA(SARIMA)和SARIMAX模型。 时间序列是在定期时间间隔内记

    2024年02月04日
    浏览(55)
  • 使用Google大模型Bard(PaLM)理解时间序列预测模型ARIMA

    Google Bard的新模型使用的是PaLM,暂时不支持中文,本次测试使用Bard模型来辅助理解一个时间序列预测模型ARIMA。 A: ARIMA stands for Autoregressive Integrated Moving Average. It is a statistical model that is used to forecast time series data. ARIMA models are based on the idea that the current value of a time series can be

    2024年02月08日
    浏览(48)
  • 组合预测模型 | ARIMA-LSTM时间序列预测(Python)

    预测结果 基本介绍 ARIMA-LSTM时间序列预测(Python完整源码和数据) ARIMA-LSTM时间序列预测,AQI预测(Python完整源码和数据) 组合模型预测 ARIMA和LSTM都是用于时间序列预测的经典模型。ARIMA是一种基于差分和自回归移动平均模型的统计方法,它可以用来捕捉时间序列中的趋势和季

    2024年02月16日
    浏览(45)
  • numpy 多项式函数回归与插值拟合模型;ARIMA时间序列模型拟合

    参考: https://blog.csdn.net/mao_hui_fei/article/details/103821601 1、多项式函数回归拟合 x ^3+ x ^2… 2、多项式函数插值拟合 对于插值函数 interp1d(phone_time, phone_x, kind=‘cubic’),无法直接获取多项式的参数与具体函数表达式。这是因为该函数使用样条插值方法,它的内部实现是基于一组数

    2024年02月16日
    浏览(77)
  • 应用时间序列分析——有季节效应的非平稳序列分析-ARIMA加法模型-R语言

            ARIMA模型也可以对具有季节效应的序列建模。根据季节效应提取的方式不同,又分为ARIMA加法模型和ARIMA乘法模型。         ABIMA加法模型是指序列中季节效应和其他效应之间是加法关系,即                                                            

    2023年04月19日
    浏览(47)
  • 机器学习——时间序列ARIMA模型(三):AR、MA、ARMA、ARIMA模型定义及公式介绍及股价预测案例代码

    使用自身的数据进行预测,且只适用于预测与自身前期相关的现象。 注意:需满足具有平稳性的要求,需满足自相关性,自相关系数需大于0.5。 p阶自回归公式: y t = μ + ∑ i = 1 p γ i y t − i + e t y_{t}=μ+sum_{i=1}^pgamma_{i}y_{t-i}+e_{t} y t ​ = μ + i = 1 ∑ p ​ γ i ​ y t − i ​ + e

    2024年02月02日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包