1 时间序列与时间序列分析

在生产和科学研究中,对某一个或者一组变量 x(t) 进行观察测量,将在一系列时刻 t1,t2,⋯,tn 所得到的离散数字组成的序列集合,称之为时间序列。

时间序列分析是根据系统观察得到的时间序列数据,通过曲线拟合和参数估计来建立数学模型的理论和方法。时间序列分析常用于国民宏观经济控制、市场潜力预测、气象预测、农作物害虫灾害预报等各个方面。

2 时间序列建模基本步骤

获取被观测系统时间序列数据;

对数据绘图,观测是否为平稳时间序列;对于非平稳时间序列要先进行d阶差分运算,化为平稳时间序列;

经过第二步处理,已经得到平稳时间序列。要对平稳时间序列分别求得其自相关系数ACF 和偏自相关系数PACF,通过对自相关图和偏自相关图的分析,得到最佳的阶层 p和阶数 q

由以上得到的d、q、p ,得到ARIMA模型。然后开始对得到的模型进行模型检验。

3 ARIMA实战解剖

原理大概清楚,实践却还是会有诸多问题。相比较R语言,Python在做时间序列分析的资料相对少很多。下面就通过Python语言详细解析后三个步骤的实现过程。

文中使用到这些基础库: pandas,numpy,scipy,matplotlib,statsmodels。 对其调用如下

from __future__ import print_function

import pandas as pd

import numpy as np

from scipy import stats

import matplotlib.pyplot as plt

import statsmodels.api as sm

from statsmodels.graphics.api import qqplot

3.1 获取数据

这里我们使用一个具有周期性的测试数据,进行分析。

数据如下:

dta=[10930,10318,10595,10972,7706,6756,9092,10551,9722,10913,11151,8186,6422,

6337,11649,11652,10310,12043,7937,6476,9662,9570,9981,9331,9449,6773,6304,9355,

10477,10148,10395,11261,8713,7299,10424,10795,11069,11602,11427,9095,7707,10767,

12136,12812,12006,12528,10329,7818,11719,11683,12603,11495,13670,11337,10232,

13261,13230,15535,16837,19598,14823,11622,19391,18177,19994,14723,15694,13248,

9543,12872,13101,15053,12619,13749,10228,9725,14729,12518,14564,15085,14722,

11999,9390,13481,14795,15845,15271,14686,11054,10395]

dta=np.array(dta,dtype=np.float) //这里要转下数据类型,不然运行会报错

dta=pd.Series(dta)

dta.index = pd.Index(sm.tsa.datetools.dates_from_range('2001','2090')) //应该是2090,不是2100

dta.plot(figsize=(12,8))

plt.show()

3.2 时间序列的差分d

ARIMA 模型对时间序列的要求是平稳型。因此,当你得到一个非平稳的时间序列时,首先要做的即是做时间序列的差分,直到得到一个平稳时间序列。如果你对时间序列做d次差分才能得到一个平稳序列,那么可以使用ARIMA(p,d,q)模型,其中d是差分次数。

fig = plt.figure(figsize=(12,8))

ax1= fig.add_subplot(111)

diff1 = dta.diff(1)

diff1.plot(ax=ax1)

plt.show()

一阶差分的时间序列的均值和方差已经基本平稳,不过我们还是可以比较一下二阶差分的效果

fig = plt.figure(figsize=(12,8))

ax2= fig.add_subplot(111)

diff2 = dta.diff(2)

diff2.plot(ax=ax2)

plt.show()

可以看出二阶差分后的时间序列与一阶差分相差不大,并且二者随着时间推移,时间序列的均值和方差保持不变。因此可以将差分次数d设置为1。

其实还有针对平稳的检验,叫“ADF单位根平稳型检验”,以后再更。

3.3 合适的p,q

现在我们已经得到一个平稳的时间序列,接来下就是选择合适的ARIMA模型,即ARIMA模型中合适的p,q。

第一步我们要先检查平稳时间序列的自相关图和偏自相关图。

dta= dta.diff(1)#我们已经知道要使用一阶差分的时间序列,之前判断差分的程序可以注释掉 //原文有错误应该是diff1= dta.diff(1),而非dta= dta.diff(1)

fig = plt.figure(figsize=(12,8))

ax1=fig.add_subplot(211)

fig = sm.graphics.tsa.plot_acf(dta,lags=40,ax=ax1)

ax2 = fig.add_subplot(212)

fig = sm.graphics.tsa.plot_pacf(dta,lags=40,ax=ax2)

其中lags 表示滞后的阶数,以上分别得到acf 图和pacf 图

通过两图观察得到:

* 自相关图显示滞后有三个阶超出了置信边界;

* 偏相关图显示在滞后1至7阶(lags 1,2,…,7)时的偏自相关系数超出了置信边界,从lag 7之后偏自相关系数值缩小至0

则有以下模型可以供选择:

1. ARMA(0,1)模型:即自相关图在滞后1阶之后缩小为0,且偏自相关缩小至0,则是一个阶数q=1的移动平均模型;

2. ARMA(7,0)模型:即偏自相关图在滞后7阶之后缩小为0,且自相关缩小至0,则是一个阶层p=7的自回归模型; //原文错写为3

3. ARMA(7,1)模型:即使得自相关和偏自相关都缩小至零。则是一个混合模型。

4. …还可以有其他供选择的模型

现在有以上这么多可供选择的模型,我们通常采用ARMA模型的AIC法则。我们知道:增加自由参数的数目提高了拟合的优良性,AIC鼓励数据拟合的优良性但是尽量避免出现过度拟合(Overfitting)的情况。所以优先考虑的模型应是AIC值最小的那一个。赤池信息准则的方法是寻找可以最好地解释数据但包含最少自由参数的模型。不仅仅包括AIC准则,目前选择模型常用如下准则:

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

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

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

构造这些统计量所遵循的统计思想是一致的,就是在考虑拟合残差的同时,依自变量个数施加“惩罚”。但要注意的是,这些准则不能说明某一个模型的精确度,也即是说,对于三个模型A,B,C,我们能够判断出C模型是最好的,但不能保证C模型能够很好地刻画数据,因为有可能三个模型都是糟糕的。

arma_mod20 = sm.tsa.ARMA(dta,(7,0)).fit()

print(arma_mod20.aic,arma_mod20.bic,arma_mod20.hqic)

arma_mod30 = sm.tsa.ARMA(dta,(0,1)).fit()

print(arma_mod30.aic,arma_mod30.bic,arma_mod30.hqic)

arma_mod40 = sm.tsa.ARMA(dta,(7,1)).fit()

print(arma_mod40.aic,arma_mod40.bic,arma_mod40.hqic)

arma_mod50 = sm.tsa.ARMA(dta,(8,0)).fit()

print(arma_mod50.aic,arma_mod50.bic,arma_mod50.hqic)

arma_mod70 = sm.tsa.ARMA(dta,(7,0)).fit()

print(arma_mod70.aic,arma_mod70.bic,arma_mod70.hqic)

arma_mod30 = sm.tsa.ARMA(dta,(0,1)).fit()

print(arma_mod30.aic,arma_mod30.bic,arma_mod30.hqic)

arma_mod71 = sm.tsa.ARMA(dta,(7,1)).fit()

print(arma_mod71.aic,arma_mod71.bic,arma_mod71.hqic)

arma_mod80 = sm.tsa.ARMA(dta,(8,0)).fit()

print(arma_mod80.aic,arma_mod80.bic,arma_mod80.hqic)

把原文的mod名字改了,以qp阶数命名更直观,不过我跑出来的结果和原文不太一样

1619.19185018 1641.69013721 1628.26448199

1657.21729729 1664.71672631 1660.2415079

1605.68656094 1630.68465765 1615.76726295

1597.93598102 1622.93407772 1608.01668303

这样的话应该是ARMA(8,0)模型拟合效果最好。

可以看到ARMA(7,0)的aic,bic,hqic均最小,因此是最佳模型。

3.4 模型检验

在指数平滑模型下,观察ARIMA模型的残差是否是平均值为0且方差为常数的正态分布(服从零均值、方差不变的正态分布),同时也要观察连续残差是否(自)相关。

3.4.1 我们对ARMA(7,0)模型所产生的残差做自相关图

使用ARMA(8,0)

接下来检验下残差序列:

resid = arma_mod80.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)

残差的ACF和PACF图,可以看到序列残差基本为白噪声

3.4.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(arma_mod20.resid.values))

检验结果是2.02424743723,说明不存在自相关性。

3.4.3 观察是否符合正态分布

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

resid = arma_mod20.resid#残差

fig = plt.figure(figsize=(12,8))

ax = fig.add_subplot(111)

fig = qqplot(resid, line='q', ax=ax, fit=True)

3.4.4 残差序列Ljung-Box检验,也叫Q检验

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,那么相关系数与零没有显著差异,即为白噪声序列。

3.5 模型预测

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

predict_sunspots = arma_mod20.predict('2090', '2100', dynamic=True)

print(predict_sunspots)

fig, ax = plt.subplots(figsize=(12, 8))

ax = dta.ix['2001':].plot(ax=ax)

predict_sunspots.plot(ax=ax)

前面90个数据为测试数据,最后10个为预测数据;从图形来,预测结果较为合理。至此,本案例的时间序列分析也就结束了。

参考文献与推荐阅读

转自:

http://blog.csdn.net/u010414589/article/details/49622625

http://blog.csdn.net/hal_sakai/article/details/51965657

matlab估计arma残差,python ARIMA 时间序列相关推荐

  1. matlab估计arma残差,写给你的金融时间序列分析:补完篇

    摘要 本文介绍时间序列分析中的 GARCH 模型,阐述使用 mean model 和 volatility model 对收益率序列联合建模的方法. 1 引言 之前,我们推出了<写给你的时间序列 ...

  2. matlab估计arma garch 条件均值和方差模型

    此示例显示如何估计条件均值和方差模型.最近我们被要求撰写关于arma garch的研究报告,包括一些图形和统计输出. 加载数据并指定模型  加载NASDAQ数据 .为了使数值平稳,将数据转换为收益率. ...

  3. R语言广义矩量法GMM和广义经验似然GEL估计ARMA、CAPM模型分析股票收益时间序列

    最近我们被客户要求撰写关于股票收益时间序列的研究报告,包括一些图形和统计输出. 本文展示了如何通过矩量的广义方法和广义经验似然来估计模型.对这两种方法的理论方面进行了简要讨论,并通过经济学和金融学中的 ...

  4. 经济数据预测 | Python实现ARIMA时间序列金融市场预测

    经济数据预测 | Python实现ARIMA时间序列金融市场预测 目录 经济数据预测 | Python实现ARIMA时间序列金融市场预测 基本介绍 具体内容 程序设计 学习总结 主要参考 基本介绍 A ...

  5. 时序预测 | MATLAB实现ARIMA时间序列预测(GDP预测)

    时序预测 | MATLAB实现ARIMA时间序列预测(GDP预测) 目录 时序预测 | MATLAB实现ARIMA时间序列预测(GDP预测) 预测效果 基本介绍 模型设计 模型分析 学习总结 参考资料 ...

  6. 【Python】时间序列数据分析与预测之Python工具汇总

    本文中总结了十多种时间序列数据分析和预测工具和python库,在我们处理时间序列项目时,可以翻开本文,根据需要选择合适的工具,将会事半功倍! 在处理时间序列项目时,数据科学家或 ML 工程师通常会使用 ...

  7. 【时间序列】简单garch+arma模型,金融时间序列

    matlab->garch+arma模型,金融时间序列模型 1. 原理 1.1 代码参考 2. 代码脚本 2.1 数据处理 2.2 ARMA 2.3 garch 1. 原理 在网上看到zhihu ...

  8. 【时间序列】python与时间序列基本教程4(超过1.9万字 代码超过900行 包括49个图)...

    介绍 代码.数据全部免费,都放在我的gitee仓库里面https://gitee.com/yuanzhoulvpi/time_series,想要使用的可以直接到我这个仓库下载. 本文是继python与 ...

  9. 数学建模中的ARMA模型和ARIMA模型的使用实例(含代码)

    数学建模中的ARMA模型和ARIMA模型的使用实例(含代码) 原文地址:http://blog.csdn.net/qq_34861102/article/details/77659399 对于较少时间 ...

最新文章

  1. 条件注释判断浏览器!--[if !IE]!--[if IE]!--[if lt IE 6]!--[if gte IE 6]
  2. python【蓝桥杯vip练习题库】ADV-69质因数(数论)
  3. 用ironpython驱动你的计算公式
  4. 1:Hello world
  5. jQuery 遍历 - slice() 方法
  6. 正则匹配没有闭合标签_RegExRX for Mac(多功能正则表达式开发工具)
  7. MZOJ 1344 工作依赖
  8. 消息队列应用场景解析
  9. bzoj 4624 农场种植 fft
  10. disable jboss JMXInvokerServlet .
  11. C++基础教程之注释
  12. C#入门学习——超市收银系统
  13. 华滋先生:互联网创业,加入社群是有用的吗?
  14. OpenXML指定位置插入图片
  15. CTA入网认证业务办理
  16. Ubuntu发烧友三部曲 进阶篇
  17. mac要装anaconda吗_在Mac OS X上安装Anaconda
  18. 老大难的GC原理及调优,这下全说清楚了
  19. OSChina 周三乱弹 ——恩 爆照的落落酱什么的最美啦
  20. c#chart 的x轴设置时间格式,第一个坐标从0开始

热门文章

  1. scala可变长度参数(一)
  2. (最短路 Floyd diskstra prim)Frogger --POJ--2253
  3. [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
  4. Button或者ImageButton的背景设为透明或者半透明
  5. matlab有限域多项式除法_MATLAB极小值优化
  6. MPLS ××× 基本实验测试
  7. 2018-08-13 谷歌 protobuf-lite:3.0.1
  8. linux监控进程资源,linux系统资源监控命令
  9. linux下播放wma格式,Ubuntu 20.04中使Rhythmbox支持WMA格式文件播放
  10. python os常用方法_python os模块常用方法