机器学习(五)——时间序列ARIMA模型

article/2025/9/23 6:50:15

ARIMA模型

平稳性: 
平稳性就是要求经由样本时间序列所得到的拟合曲线 
在未来的一段期间内仍能顺着现有的形态“惯性”地延续下去

平稳性要求序列的均值和方差不发生明显变化

严平稳与弱平稳: 
严平稳:严平稳表示的分布不随时间的改变而改变。 
弱平稳:期望与相关系数(依赖性)不变 
未来某时刻的t的值Xt就要依赖于它过去的信息,所以需要依赖性

1.导包

#美国消费者信心指数
import pandas as pd
import numpy as np
import statsmodels #时间序列
import seaborn as sns
import matplotlib.pylab as plt
from scipy import  stats
import matplotlib.pyplot as plt


2.数据预处理

#1.数据预处理
Sentiment = pd.read_csv('confidence.csv', index_col='date', parse_dates=['date'])
#index_col=0, parse_dates=[0]
print(Sentiment.head())
#切分为测试数据和训练数据
n_sample = Sentiment.shape[0]
n_train = int(0.95 * n_sample)+1
n_forecast = n_sample - n_train
ts_train = Sentiment.iloc[:n_train]['confidence']
ts_test = Sentiment.iloc[:n_forecast]['confidence']sentiment_short = Sentiment.loc['2007':'2017']
sentiment_short.plot(figsize = (12,8))
plt.title("Consumer Sentiment")
plt.legend(bbox_to_anchor = (1.25,0.5))
sns.despine()
plt.show()

结果:注意pandas默认的时间格式是2017-01-01

 


3.时间序列的差分d——将序列平稳化

#2.时间序列的差分d——将序列平稳化
sentiment_short['diff_1'] = sentiment_short['confidence'].diff(1)
# 1个时间间隔,一阶差分,再一次是二阶差分
sentiment_short['diff_2'] = sentiment_short['diff_1'].diff(1)sentiment_short.plot(subplots=True, figsize=(18, 12))sentiment_short= sentiment_short.diff(1)fig = plt.figure(figsize=(12,8))
ax1= fig.add_subplot(111)
diff1 = sentiment_short.diff(1)
diff1.plot(ax=ax1)fig = plt.figure(figsize=(12,8))
ax2= fig.add_subplot(111)
diff2 = dta.diff(2)
diff2.plot(ax=ax2)plt.show()

结果:

ARIMA模型原理

自回归模型AR 
描述当前值与历史值之间的关系,用变量自身的历史时间数据对自身进行预测 
自回归模型必须满足平稳性的要求 
p阶自回归过程的公式定义:

yt是当前值 u是常数项 P是阶数 ri是自相关系数 et是误差 
(P当前值距p天前的值的关系)

自回归模型的限制 
1、自回归模型是用自身的数据进行预测 
2、必须具有平稳性 
3、必须具有相关性,如果自相关系数(φi)小于0.5,则不宜采用 
4、自回归只适用于预测与自身前期相关的现象

移动平均模型MA 
移动平均模型关注的是自回归模型中的误差项的累加 
q阶自回归过程的公式定义: 


移动平均法能有效地消除预测中的随机波动

I是差分模型

需要确定P和Q, 
d是做几阶差分,一般1阶就可以了

选择P与Q的方法: 
自相关函数ACF(autocorrelation function) 
有序的随机变量序列与其自身相比较自相关函数反映了同一序列在不同时序的取值的相关性 
公式: 


变量与自身的变化,yt和yt-1到yt和yt-k的相关系数 
k阶滞后点 
Pk的取值范围【-1,1】

 
虚线表示95%,置信区间

偏自相关函数(PACF)(partial autocorrelation function) 
1、对于一个平稳AR(p)模型,求出滞后k自相关系数p(k)时 
实际上得到的并不是x(t)与x(t-k)之间单纯的相关关系 
2、x(t)同时还会受到中间k-1个随机变量x(t-1)、x(t-2)……、x(t-k+1)的影响,而这k-1个随机变量又都和x(t-k)具有相关关系,所以自相关系数p(k)里实际掺杂了其他变量对x(t)与x(t-k)的影响 
3、剔除了中间k-1个随机变量x(t-1)、x(t-2)、……、x(t-k+1)的干扰之后 
x(t-k)对x(t)影响的相关程度 
4、ACF还包含了其他变量的影响 
而偏自相关系数PACF是严格这两个变量之间的相关性
 

4.通过ACF和PACF确定p、q的值

   4.1 建立ACF自相关函数和PACF偏自相关函数

注意:建立acf不能和差分同时run

  #3.1.分别画出ACF(自相关)和PACF(偏自相关)图像
fig = plt.figure(figsize=(12,8))ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(sentiment_short, lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(sentiment_short, lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')
fig.tight_layout()

结果:

 

接下来确定ARIMA模型的p、d、q三个参数 
ARIMA(p,d,q) 
确认方法: 

  4.2可视化结果:四个图的整合函数,可以改参数直接调用

  #3.2.可视化结果def tsplot(y, lags=None, title='', figsize=(14, 8)):fig = plt.figure(figsize=figsize)layout = (2, 2)ts_ax   = plt.subplot2grid(layout, (0, 0))hist_ax = plt.subplot2grid(layout, (0, 1))acf_ax  = plt.subplot2grid(layout, (1, 0))pacf_ax = plt.subplot2grid(layout, (1, 1))y.plot(ax=ts_ax)ts_ax.set_title(title)y.plot(ax=hist_ax, kind='hist', bins=25)hist_ax.set_title('Histogram')smt.graphics.plot_acf(y, lags=lags, ax=acf_ax)smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax)[ax.set_xlim(0) for ax in [acf_ax, pacf_ax]]sns.despine()plt.tight_layout()return ts_ax, acf_ax, pacf_axtsplot(sentiment_short, title='Consumer Sentiment', lags=36)
plt.show()

5..建立模型——参数选择

通过导入import itertools来遍历 p属于[0 ,4],q属于[0, 4] d=0

#4.建立模型——参数选择
arima200 = sm.tsa.ARIMA(ts_train, order=(2,0,0)).fit()#(p,d,q)
#model_results = arima200.fit()
#遍历,寻找适宜的参数
import itertoolsp_min = 0
d_min = 0
q_min = 0
p_max = 8
d_max = 0
q_max = 8# Initialize a DataFrame to store the results,,以BIC准则
results_bic = pd.DataFrame(index=['AR{}'.format(i) for i in range(p_min,p_max+1)],columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])for p,d,q in itertools.product(range(p_min,p_max+1),range(d_min,d_max+1),range(q_min,q_max+1)):if p==0 and d==0 and q==0:results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nancontinuetry:model = sm.tsa.ARIMA(ts_train, order=(p, d, q),#enforce_stationarity=False,#enforce_invertibility=False,)results = model.fit()results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.bicexcept:continue
results_bic = results_bic[results_bic.columns].astype(float)

画出热度图:

fig, ax = plt.subplots(figsize=(10, 8))
ax = sns.heatmap(results_bic,mask=results_bic.isnull(),ax=ax,annot=True,fmt='.2f',)
ax.set_title('BIC')
plt.show()

 结果如下:

输出AIC、BIC评价指标

模型选择的几种方法:AIC,BIC,HQ准则

选择最优模型的指导思想是从两个方面去考察:一个是似然函数最大化,另一个是模型中的未知参数个数最小化。似然函数值越大说明模型拟合的效果越好,但是我们不能单纯地以拟合精度来衡量模型的优劣,这样回导致模型中未知参数越来越多,模型变得越来越复杂,会造成过拟合。所以一个好的模型应该是拟合精度和未知参数个数的综合最优化配置。

AIC准则
AIC准则是由日本统计学家Akaike与1973年提出的,全称是最小化信息量准则(Akaike Information Criterion)。它是拟合精度和参数个数的加权函数: 
AIC=2(模型参数的个数)-2ln(模型的极大似然函数)

BIC准则
AIC为模型选择提供了有效的规则,但也有不足之处。当样本容量很大时,在AIC准则中拟合误差提供的信息就要受到样本容量的放大,而参数个数的惩罚因子却和样本容量没关系(一直是2),因此当样本容量很大时,使用AIC准则选择的模型不收敛与真实模型,它通常比真实模型所含的未知参数个数要多。BIC(Bayesian InformationCriterion)贝叶斯信息准则是Schwartz在1978年根据Bayes理论提出的判别准则,称为SBC准则(也称BIC),弥补了AIC的不足。SBC的定义为: 
BIC = ln(n)(模型中参数的个数) - 2ln(模型的极大似然函数值)

小结
在进行ARMA参数的选择是,AIC准则和BIC准则的提出可以有效弥补根据自相关图和偏自相关图定阶的主观性,在有限的阶数范围内帮助我们寻找相对最优拟合模型。
 

AIC=-2 ln(L) + 2 k  中文名字:赤池信息量 

BIC=-2 ln(L) + ln(n)*k 中文名字:贝叶斯信息量 

HQ=-2 ln(L) + ln(ln(n))*k  

其中L是在该模型下的最大似然,n是数据数量,k是模型的变量个数。
 

即在AIC标准下和BIC标准下取得损失值最小,模型最优。

#模型评价准则
train_results = sm.tsa.arma_order_select_ic(ts_train, ic=['aic', 'bic'], trend='nc', max_ar=4, max_ma=4)print('AIC', train_results.aic_min_order)
print('BIC', train_results.bic_min_order)

结果:

在AIC准则下:AIC(4,3)

在BIC准则下:BIC(1,1)

结果p,q值不一。

不一致需要我们重新审判

6.模型检验

  6.1残差检验

主要针对残差进行正态性检验和自相关性检验。
残差满足正态性,主要是为了残差集中于某一个数值,如果该值与0很接近,则它实际服从均值为0的正态分布,即它是一个白噪声。白噪声是指功率谱密度在整个频域内均匀分布的噪声。白噪声或白杂讯,是一种功率频谱密度为常数的随机信号或随机过程。换句话说,此信号在各个频段上的功率是一样的,由于白光是由各种频率(颜色)的单色光混合而成,因而此信号的这种具有平坦功率谱的性质被称作是“白色的”,此信号也因此被称作白噪声。
       残差满足非自相关性,主要是为了在残差中不再包括AR或者MA过程产生的序列。
正态性检验可以使用shapiro.test函数来检查,当p-value>0.05时表明满足正态分布,该值越大越好,直到接近于1.
残差的自相关性可以用函数tsdiag(model)来迅速检验。该函数会列出残差的散点图,自相关性acf检验和Box.test的检验值(pvalue大于0.05即满足非自相关性)。

为什么残差要是白噪声?
答:得到白噪声序列,就说明时间序列中有用的信息已经被提取完毕了,剩下的全是随机扰动,是无法预测和使用的,残差序列如果通过了白噪声检验,则建模就可以终止了,因为没有信息可以继续提取。如果残差不是白噪声,就说明残差中还有有用的信息,需要修改模型或者进一步提取

resid = model_results.resid #赋值
fig = plt.figure(figsize=(12,8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(), lags=40, ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(resid, lags=40, ax=ax2)
plt.show()

    6.2做D-W检验

德宾-沃森(Durbin-Watson)检验。德宾-沃森检验,简称D-W检验,是目前检验自相关性最常用的方法,但它只使用于检验一阶自相关性。因为自相关系数ρ的值介于-1和1之间,所以 0≤DW≤4。

DW=O=>ρ=1   即存在正自相关性 
DW=4<=>ρ=-1 即存在负自相关性 
DW=2<=>ρ=0  即不存在(一阶)自相关性 
因此,当DW值显著的接近于O或4时,则存在自相关性,而接近于2时,则不存在(一阶)自相关性。这样只要知道DW统计量的概率分布,在给定的显著水平下,根据临界值的位置就可以对原假设H0进行检验。
 

print(sm.stats.durbin_watson(model_results.resid.values))

结果:

  6.3观察是否符合正态分布,QQ图

这里使用QQ图,它用于直观验证一组数据是否来自某个分布,或者验证某两组数据是否来自同一(族)分布。在教学和软件中常用的是检验数据是否来自于正态分布。

resid = model_results.resid#残差
fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111)
fig = qqplot(resid, line='q', ax=ax, fit=True)

结果:

6.4Ljung-Box检验(白噪声检验)

Ljung-Box test是对randomness的检验,或者说是对时间序列是否存在滞后相关的一种统计检验。对于滞后相关的检验,我们常常采用的方法还包括计算ACF和PCAF并观察其图像,但是无论是ACF还是PACF都仅仅考虑是否存在某一特定滞后阶数的相关。LB检验则是基于一系列滞后阶数,判断序列总体的相关性或者说随机性是否存在。 
时间序列中一个最基本的模型就是高斯白噪声序列。而对于ARIMA模型,其残差被假定为高斯白噪声序列,所以当我们用ARIMA模型去拟合数据时,拟合后我们要对残差的估计序列进行LB检验,判断其是否是高斯白噪声,如果不是,那么就说明ARIMA模型也许并不是一个适合样本的模型。
 

r,q,p = sm.tsa.acf(resid.values.squeeze(), qstat=True)
data = np.c_[range(1,41), r[1:], q, p]
table = pd.DataFrame(data, columns=['lag', "AC", "Q", "Prob(>Q)"])
print(table.set_index('lag'))

结果:

结果分析:原假设为白噪声(相关系数为零)检验的结果就是看最后一列前十二行的检验概率(一般观察滞后1~12阶),如果检验概率小于给定的显著性水平,比如0.05、0.10等就拒绝原假设,即为非白噪声。

就结果来看,如果取显著性水平为0.05或者0.1,结果不小于显著性水平,那么相关系数与零没有显著差异,即为白噪声序列。

 

7.模型预测

模型确定之后,就可以开始进行预测了,我们对未来5年的数据进行预测。

ts_train 从2007-01——2016-05  113个数据

ts_test  从2016-06——2018-08   27个数据

 

#6.模型预测
predict_sunspots = model_results.predict('2016-06','2018-08', dynamic=True)
print(predict_sunspots)
fig, ax = plt.subplots(figsize=(12, 8))
ax = Sentiment.ix['2007':].plot(ax=ax)
predict_sunspots.plot(ax=ax)
结果:

 

从图形来,预测结果较为合理。至此,本案例的时间序列分析也就结束了。


 


http://chatgpt.dhexx.cn/article/GbqeFaDb.shtml

相关文章

时间序列分析之ARIMA模型预测

转载自 http://blog.sina.com.cn/s/blog_70f632090101bnd8.html#cmt_3111974 今天学习ARIMA预测时间序列。 指数平滑法对于预测来说是非常有帮助的,而且它对时间序列上面连续的值之间相关性没有要求。但是,如果你想使用指数平滑法计算出预测区间&#x…

ARIMA模型学习笔记

ARIMA模型学习笔记 目录 ARIMA模型学习笔记ARIMA模型时间序列平稳性什么是平稳性严平稳弱平稳 平稳性检验ADF检验(Augmented Dickey-Fuller test)单位根ADF检验的原理ADF检验的python实现 数据平稳化对数变换平滑法移动平均法指数平均法 差分法 ARIMA模型介绍AR(Autoregressive…

什么是 ARIMA模型

转自:https://blog.csdn.net/HHXUN/article/details/79858672 ARIMA模型的全称叫做自回归移动平均模型,全称是(ARIMA, Autoregressive Integrated Moving Average Model)。也记作ARIMA(p,d,q),是统计模型(statistic model)中最常见的一种用来…

时间序列预测——ARIMA(差分自回归移动平均模型)(1))

时间序列预测——ARIMA(差分自回归移动平均模型) ARIMA(p,d,q)中,AR是"自回归",p为自回归项数;I为差分,d为使之成为平稳序列所做的差分次数&#…

ARIMA乘法季节模型

目录 ARIMA乘法季节模型 例题1 例题 2 例题3 ARIMA乘法季节模型 序列的季节效应、长期趋势效应和随机波动之间有着复杂的相互关联性,简单的季节模型不能充分地提取其中的相关关系,这时常采用乘积季节模型。 例题1 我国1949-2008年年末人口总数(单…

AR、MA、ARMA和ARIMA模型------时间序列预测

ARMA模型的全称是自回归移动平均模型,它是目前最常用的拟合平稳序列的模型。它又可以细分为AR模型、MA模型和ARMA三大类。都可以看做是多元线性回归模型。 AR模型 具有如下结构的模型称为阶自回归模型,简记为。 即在t时刻的随机变量的取值是前期的多元…

ARIMA模型(一)定义与介绍

了解ARIMA模型,就需要先了解数据的一个平稳性。 1. 平稳性: 平稳性就是要求经由样本时间序列所得到的拟合曲线,在未来的一段时间内仍能顺着现有状态“惯性”地延续下去;平稳性要求序列的均值和方差不发生明显变化; 方差越大,数据波动越大,方差计算公式如下式所示…

ARIMA模型原理及实现

https://www.jianshu.com/p/305c4961ee06 1、数据介绍 再介绍本篇的内容之前,我们先来看一下本文用到的数据。本文用到的中国银行股票数据下载:http://pan.baidu.com/s/1gfxRFbH,提取码d3id。 我们先来导入一下我们的数据,顺便…

时间序列预测,非季节性ARIMA及季节性SARIMA

Python 3中使用ARIMA进行时间序列预测的指南 在本教程中,我们将提供可靠的时间序列预测。我们将首先介绍和讨论自相关,平稳性和季节性的概念,并继续应用最常用的时间序列预测方法之一,称为ARIMA。 介绍 时间序列提供了预测未来价…

时间序列(四)ARIMA模型与差分

ARIMA模型 平稳性: 平稳性就是要求经由样本时间序列所得到的拟合曲线 在未来的一段期间内仍能顺着现有的形态“惯性”地延续下去 平稳性要求序列的均值和方差不发生明显变化 严平稳与弱平稳: 严平稳:严平稳表示的分布不随时间的改变而改…

数学建模之时间序列预测(ARIMA)

Auto-TS 自动化时间序列预测 1、Auto-TS介绍 Auto-TS 是 AutoML 的一部分,它将自动化机器学习管道的一些组件。这自动化库有助于非专家训练基本的机器学习模型。 是一个开源 Python 库,主要用于自动化时间序列预测。它将使用一行代码自动训练多个时间…

【时间序列预测-ARIMA模型】

转载 https://blog.csdn.net/qq_35495233/article/details/83514126 参考【概念】https://blog.csdn.net/TU_JCN/article/details/88130820 【实战】https://www.cnblogs.com/54hys/p/10127055.html 另外,重点参考https://www.jianshu.com/p/4130bac8ebec 了解ARIMA…

ARIMA的参数与数学形式

什么是 ARIMA模型 ARIMA模型的全称叫做自回归移动平均模型,全称是(ARIMA, Autoregressive Integrated Moving Average Model)。也记作ARIMA(p,d,q),是统计模型(statistic model)中最常见的一种用来进行时间序列 预测的模型。 1. ARIMA的优缺点 优点&a…

ARIMA模型

时间序列分析分为两大类:频域分析和时域分析。频域分析也称为谱分析,是一种非常有用的纵向数据分析方法。时域分析主要关心从序列值之间的相关关系对时间序列发展规律。 在时域分析里,生成时间序列数据的随机过程按照统计规律的特征是否随着时…

Arima相关概念

https://www.cnblogs.com/bradleon/p/6832867.html https://www.cnblogs.com/bradleon/p/6827109.html 平稳性:就是要求经由样本时间序列所得到的拟合曲线在未来的一段期间内仍能顺着现有的形态“惯性”地延续下去。平稳性要求序列的均值和方差不发生明显变化 严平…

2019年最新手游脚本开发教程

2019年最新手游脚本开发教程 链接:https://pan.baidu.com/s/1JqZBWhXes4-kUKEgAFHpcQ 提取码:xp0f 复制这段内容后打开百度网盘手机App,操作更方便哦

html游戏脚本,网页游戏脚本软件道

----3.增加多媒体特性 Command对象 Command对象的主要目的是执行参数化的存储过程 JAR will be empty - no content was marked for inclusion! 例子: Col1=CustomerNumberTextWidth10 Col2=CustomerNameTextWidth30 该例给出了方…

前端搭建打字通游戏(内附源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 打字通功能介绍✨ 页面搭建✨ 样式代码✨ 功能实现 ✨ 写在前面 上周我们实通过前端基础实现了名言生成器,当然很多伙伴再评论区提出了想法,后续我们会考虑实现的,今天还是继续按照我们…

Android+按键精灵代码,安卓按键精灵怎么编写脚本 编写脚本教程

按键精灵评分: 大小:23.96MB 语言:简体中文 授权:免费版下载地址 在安卓上使用按键精灵,可以模拟我们抢红包、抢火车票,而且连自动签到也是可以的,只要我们编写好脚本就可以了。那么安卓按键精灵…

手游问道服务器维护到几点,问道手游10月27日更新什么?维护到几点?

问道手游10月27日更新什么内容?问道手游10月27日维护到几点?相信很多玩家想知道吧,接下来就跟随小编一起来看看吧,希望对大家有所帮助。 10月27号更新了什么内容 各位亲爱的道友: 为保证服务器的运行稳定和服务质量&am…