时间序列中p,q值选择

1.模型识别:

对平稳时间序列Yn,求得其自相关函数(ACF)和偏自相关函数(PACF)序列。
若PACF序列满足在p步截尾,且ACF序列被负指数函数控制收敛到0,则Yn为AR(p)序列。
若ACF序列满足在q步截尾,且PACF序列被负指数函数控制收敛到0,则Yn为MA(q)序列。
若ACF序列和PACF序列满足皆不截尾,但都被负指数函数控制收敛到0,则Yn为ARMA序列。

2.模型定阶:

对于有N个观察值的序列,求得相应于AR(p)、MA(q) 和 ARMA(p,q)三种模型的残差方差,出现模型最小残差方差时的模型阶数就是各个模型的最佳阶数。

3.模型参数估计:

AR模型的参数可以根据ACF序列构成的矩阵及其矩阵之间的转化关系求得。
MA模型的参数采用线性迭代法即可求出。
ARMA模型参数估计方法是按上述求解AR模型和MA模型参数的方法分别对AR和MA模型进行参数估计,即可得到ARMA模型的参数。

4.模型估计函数:

根据对应的模型以及估计参数等带入估计函数计算出估计值。

python中使用Statsmodel库进行p,q值选择

最近工作中用到时间序列模型中的ARMA(ARIMA),需要自动选择p,q值,但是我查到的资料都是根据自相关图和偏自相关图来观察拖尾和截尾,以此来选择p,q值,刚开始时一筹莫展,后来灵机一动,为何不看下导入的statsmodel库中对应画图的函数调用时用的源代码呢:

import statsmodelsprint statsmodels.__file__

根据输出找到源代码所在位置,用来画偏自相关图的代码部分为:

acf_x, confint = pacf(x, nlags=nlags, alpha=alpha, method=method)if use_vlines:ax.vlines(lags, [0], acf_x, **kwargs)ax.axhline(**kwargs)# center the confidence interval TODO: do in acf?confint = confint - confint.mean(1)[:,None]kwargs.setdefault('marker', 'o')kwargs.setdefault('markersize', 5)kwargs.setdefault('linestyle', 'None')ax.margins(.05)ax.plot(lags, acf_x, **kwargs)ax.fill_between(lags, confint[:,0], confint[:,1], alpha=.25)

从画图部分可以看到置信区间上界为confint[:,0],下界线为 confint[:,1],又有:

confint = confint - confint.mean(1)[:,None]

因此可以写个循环,当出现截尾时返回当前p,q值,也就可以确定选择AR或MA模型了,如果两者都拖尾,则需要用赤池信息准则,或者贝叶斯信息准则或别的准则来进一步判断,那就是另一回事了,除了运行时间稍微有点长外并没有什么困难的了。

代码如下:

1、判断时间序列稳定性

#用来检查时间序列稳定性的,代码中选用的临界值为5%,p-value选用的为0.1,这个可以根据实际进行修改。from statsmodels.tsa.arima_model import ARIMA
from statsmodels.tsa.stattools import adfuller, acf, pacfdef testStationarity(timeSer):stationarity = Falsedftest = adfuller(timeSer)dfoutput = Series(dftest[:4], index=['Test Statistic', 'p-value', 'lags', 'nobs'])for key, value in dftest[4].items():dfoutput['Critical values (%s)' % key] = valueif dfoutput['Test Statistic'] < dfoutput['Critical values (5%)']:if dfoutput['p-value'] < 0.1:stationarity = Truereturn stationarity

2、选择合适的p,q值

(由于自动判断,因此收敛速度状况并没有做判断,这个是因为我使用的数据在满足第一个在置信区间内的值后即是局部最优,实际中因数据的不同代码需要部分修改,这里只是提供了一个思路。)

def p_q_choice(timeSer, nlags=40, alpha=.05):kwargs = {'nlags': nlags, 'alpha': alpha}acf_x, confint = acf(timeSer, **kwargs)acf_px, confint2 = pacf(timeSer, **kwargs)confint = confint - confint.mean(1)[:, None]confint2 = confint2 - confint2.mean(1)[:, None]for key1, x, y, z in zip(range(nlags), acf_x, confint[:,0], confint[:,1]):if x > y and x < z:q = key1breakfor key2, x, y, z in zip(range(nlags), acf_px, confint2[:,0], confint[:,1]):if x > y and x < z:p = key2breakreturn p, q

附录:
ARIMA模型运用的流程

  1. 根据时间序列的散点图、自相关函数和偏自相关函数图识别其平稳性。

  2. 对非平稳的时间序列数据进行平稳化处理。直到处理后的自相关函数和偏自相关函数的数值非显著非零

  3. 根据所识别出来的特征建立相应的时间序列模型。
    平稳化处理后,若偏自相关函数是截尾的,而自相关函数是拖尾的,则建立AR模型;
    若偏自相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。

  4. 参数估计,检验是否具有统计意义。

  5. 假设检验,判断(诊断)残差序列是否为白噪声序列。

  6. 利用已通过检验的模型进行预测。

时间序列ARMA中p,q选择相关推荐

  1. matlab之ARMA(p,q)模型

    学完MA(q),再接再厉啊! 已知零均值平稳时间序列ARMA(p,q)的自协方差函数,求系数. %ARMA(2,2) p=2;q=2; r=[5.61,-1.1,0.23,0.43,-0.1];%r1 ...

  2. 时间序列预测任务的模型选择最全总结

    在第一部分,将了解多种时间序列的模型,如 经典的时间序列模型 监督学习模型 基于深度学习的模型 在第二部分,将建立几个时间序列模型来预测股市的应用案例,并了解一些时间序列建模技术.这些模型将相互比较, ...

  3. python怎么做q检验_关于eviews做时间序列模型的残差Q统计量检验我决定写一些!...

    本文目的:1.做arima模型的时候你需要在模型拟合完之后做残差的Q统计量检验,但是你又不会看结果: 2.你会看结果,但是是否发现疑问:为什么直接在模型中选择残差检验中的Q统计量检验得出的结果与选择r ...

  4. 1、下列时间序列模型中,哪一个模型可以较好地拟合波动性的分析和预测。

    感想 这对我来说应该算是一个超纲的题目,我从没接触过时间序列预测的问题,我这里也弥补一下. problem 1.下列时间序列模型中,哪一个模型可以较好地拟合波动性的分析和预测. A. AR模型 B. ...

  5. 在 Visual Studio 中使用 Q# 进行量子编程

    1 量子计算机与量子编程 1.1 量子计算机 Quantum computing is computing using quantum-mechanical phenomena, such as su ...

  6. hotelling变换_基于Hotelling-T²的偏最小二乘(PLS)中的变量选择

    hotelling变换 背景 (Background) One of the most common challenges encountered in the modeling of spectro ...

  7. GAN(生成对抗网络)在合成时间序列数据中的应用(第二部分——利用GAN生成时间序列数据)

    GAN(生成对抗网络)在合成时间序列数据中的应用(第二部分–TimeGAN 与合成金融输入) (本文基本是对Jasen 的<Machine Learning for Algorithmic Tr ...

  8. 时间序列模型中,哪一个模型可以较好地拟合波动性的分析和预测

    注:转载出处: http://blog.csdn.net/ztf312/ 在此感谢原博主的整理分享! 题目:下列时间序列模型中,哪一个模型可以较好地拟合波动性的分析和预测? AR模型 MA模型 ARM ...

  9. python的for语句条件_Python中的条件选择和循环语句

    Python中的条件选择和循环语句 同C语言.Java一样,Python中也存在条件选择和循环语句,其风格和C语言.java的很类似,但是在写法和用法上还是有一些区别.今天就让我们一起来了解一下. 一 ...

最新文章

  1. 返回一个一维整数数组中最大子数组的和02
  2. LINUX 三剑客之awk
  3. jack对海量数据库的一些总结
  4. 全志A33-gpio驱动程序
  5. c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析
  6. python基础小白题3
  7. Windows下启动,关闭Nginx命令
  8. php 获取字符串长度 包含空格,php中常用的字符串长度函数strlen()与mb_strlen()实例解释...
  9. java左手握右手_在队列中,向中看齐举哪个手?
  10. swiftui动画之tab自定义切换动画_Unity动画系统详解1:在Unity中如何制作动画?
  11. ActiveMQ(一):ActiveMQ的下载安装(win10)
  12. apple苹果IOS内购申请教程协议、税务和银行业务配置
  13. 抓包工具神器,fiddler全解
  14. 为什么要有红黑树?什么是红黑树?
  15. ibm z系列服务器图片,IBM Z系列本本最清晰图片全面曝光(图)
  16. 美团外卖前端可视化界面组装平台 —— 乐高
  17. Java将图片压缩100KB以下,压缩图片,将几MB的图片压缩成100KB
  18. 解决java获取系统时间差8个小时 专题
  19. 《原力计划-打卡挑战》总榜名单揭晓!!
  20. 苹果这一次太强硬!如果你的 App 拒绝支持这些技术,将在2020年4月30日后全面下架!...

热门文章

  1. 字符串切割函数strtok、strtok_s、strtok_r的区别
  2. 回测好,为什么实盘不靠谱?
  3. GICv3软件overview手册之GICv3基本功能(4)
  4. MySQL5.7找到data文件夹
  5. 【GIT】git常用命令
  6. 【Kaggle竞赛】Kaggle竞赛了解
  7. 汇编基址变址寻址方式的使用
  8. C语言BCC异或效验
  9. 查看linux服务器的品牌和型号
  10. SQL——行转列,列转行