天天看点

Python 数据分析实例——时间序列分析

作者:昌华量化
Python 数据分析实例——时间序列分析

在生产和科学研究中,对某一个或者一组变量进行观察测量,将在一系列时刻所得到的离散数字组成的序列集合称为时间序列。时间序列分析是根据系统观察得到的时间序列数据,通过曲线拟合和参数估计来建立数学模型的理论和方法。时间序列分析常用于国民宏观经济控制、市场潜力预测、气象预测、农作物害虫灾害预报等方面。

1.基本模型

自回归移动平均模型(ARMA(p,q))是时间序列中最为重要的模型之一,主要由两部分组成:AR代表p阶自回归过程;MA代表q阶移动平均过程。其公式如下:

Python 数据分析实例——时间序列分析

在时间序列中,ARIMA模型在ARMA模型的基础上多了差分的操作。

2.时间序列建模的基本步骤

(1)获取被观测系统的时间序列数据。

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

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

(4)由以上得到ARIMA模型。然后开始对得到的模型进行模型检验。

3.ARIMA实战解剖

【例1】

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           

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

# 获取数据
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=pd.Series(dta)
dta.index = pd.Index(sm.tsa.datetools.dates_from_range('2001','2090'))
dta.plot(figsize=(12,8))           

数据绘图如图1所示。

Python 数据分析实例——时间序列分析

图1 数据绘图

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)           

时间序列一阶差分图如图2所示。

Python 数据分析实例——时间序列分析

图2 时间序列一阶差分

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

#二阶差分
fig = plt.figure(figsize=(12,8))
ax2= fig.add_subplot(111)
diff2 = dta.diff(2)
diff2.plot(ax=ax2)           

时间序列二阶差分图如图3所示。

Python 数据分析实例——时间序列分析

图3 时间序列二阶差分

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