单位根检验、航空模型、季节模型

单独写这篇文章的用意是源于我在单位根平稳性检验上面花费了很多时间,在这个过程中,又不断对季节模型有了更为深刻的理解,所以我要单独将这些心得写出来。本篇文章需要结合《收入时间序列——之模型探索篇》来看,其数据源于那篇文章中,这里不再赘述。

一. 平稳性检验

平稳性检验的主要方法是看时序图、ACF图和单位根检验,其中单位根检验方法有ADF、PP、KPSS等。本次ADF和PP检验都拒绝原假设,即认为序列平稳;KPSS拒绝原假设,即认为序列非平稳(KPSS零假设和ADF/PP恰好相反)。当出现不一致时,需要根据属于下面哪种平稳过程来判断,有一种观点认为KPSS检验结果更强更鲁棒,因为ADF和PP检验将差分平稳模型作为零假设,它检验随机游走或带漂移的随机游走效果奇好,但它们都需要假设是否包含常数均值和时间趋势,因此拒绝零假设的功效(low power)较低,而KPSS则完全不需要选择假设类型。

非平稳序列的平稳过程包括差分平稳过程和趋势平稳过程。

差分平稳过程:确定性时序分析对随机性信息浪费严重,通过差分变换为 单位根检验、航空模型、季节模型 可消除随机性趋势,单位根检验、航空模型、季节模型 是平稳序列,单位根检验、航空模型、季节模型 是均值。

趋势平稳过程:确定性趋势无法通过差分消除,通过去除时间函数变换为 单位根检验、航空模型、季节模型可消除确定性趋势,单位根检验、航空模型、季节模型 是时间函数,单位根检验、航空模型、季节模型 是平稳序列,单位根检验、航空模型、季节模型 是均值。

特殊情形下,当KPSS检验结果非平稳、ADF检验结果平稳时,利用差分平稳过程可使序列平稳。当KPSS检验结果平稳、ADF检验结果非平稳时,利用趋势平稳过程可使序列平稳。

下面这张图很好的总结了平稳性检验:

单位根检验、航空模型、季节模型

二. 日收入序列的平稳性检验

(1)ADF检验

这里需要注意一下ADF检验的三种类型,若没有设置regression参数系统默认就是第二种。

单位根检验、航空模型、季节模型

一般ADF检验顺序是类型3->类型2->类型1,即先从有趋势有常数均值(ct)、再到无趋势有常数均值(c)、最后到无趋势无常数均值(nc)。按3->2->1顺序直至检验平稳终止,如果都不平稳就需要采用差分等手段后继续检验。

我尝试了3和2都是平稳,1不是平稳,按上述理论ADF检验结果为平稳:

# 单位根检验 3->2->1
dftest_ct = adfuller(timeseries, regression='ct', autolag='AIC')
(-5.488932371099615, 2.42350869843851e-05, 21, 838, {'1%': -3.9696139315814714, '5%': -3.415742085237588, '10%': -3.1301410687829927}, 19515.823525154956) 

dftest_c = adfuller(timeseries, regression='c', autolag='AIC')
(-4.921922984782108, 3.160487308474228e-05, 21, 838, {'1%': -3.4381774989729816, '5%': -2.8649951426291, '10%': -2.568609799556849}, 19519.837221505346) 

dftest_nc = adfuller(timeseries, regression='nc', autolag='AIC')
(-1.5326196179942781, 0.11774285074636265, 21, 838, {'1%': -2.5684131839645477, '5%': -1.941325263784454, '10%': -1.6165068765453274}, 19539.978409969888)

(2)Eview测试

为了看到更多参数细节,又在EViews上操作测试了一遍:

单位根检验、航空模型、季节模型

ct 类型检验平稳,常数均值和时间趋势的参数均显著,时间趋势参数为9.685562,可以理解为平均每天有不到 9.7元的增长趋势,它是一种确定性趋势,让我联想到Tsay的全球温度案例,呈现出平均每157年增加1摄氏度,并验证了向前一步短期预测时差分平稳模型比趋势平稳模型效果要好一些;c 类型检验平稳,常数均值参数显著;None类型检验非平稳。三种类型里,按AIC和HQC准则,ct 类型值最小;按SC准则,c 类型值最小,所以综合起来可采纳 ct 第三种类型,当然前提条件是模型正确的情形下。

(3)PP检验

由于python没有PP函数,所以我用R运行了一下,PP检验也是平稳:

# PP检验
> pp.test(income_data)

	Phillips-Perron Unit Root Test

data:  income_data
Dickey-Fuller Z(alpha) = -321.79, Truncation lag parameter = 6, p-value = 0.01
alternative hypothesis: stationary

(4)KPSS检验

在python里运行KPSS检验:

# KPSS检测:
def KPSS_test(timeseries):
    from statsmodels.tsa.stattools import kpss
    print('Result of KPSS Test:')
    kpss_test = kpss(timeseries)
    output = pd.Series(kpss_test[0:3], index=['Test Statistic','p-value','Lag Used'])
    for key,value in kpss_test[3].items():
        output['Critical Valuse (%s)' % key] = value
    print(kpss_test)
    print(output)

结果如下:

Result of KPSS Test:
(0.8942571772584017, 0.01, 21, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
Test Statistic             0.894257
p-value                    0.010000
Lag Used                  21.000000
Critical Valuse (10%)      0.347000
Critical Valuse (5%)       0.463000
Critical Valuse (2.5%)     0.574000
Critical Valuse (1%)       0.739000
dtype: float64

p值小于0.05,t 统计量明显大于任何检验水平下的 t 值,由于KPSS是右侧单边检验,故大于临界值拒绝原假设,也即原序列为非平稳。

三. 日收入序列的季节差分

为查看消除季节效应后的结果,我们对原序列做 7 步差分。那么如何判断是否需要进行季节差分呢?判断依据就是看季节性是否缓慢收敛,还记得下面这个ACF图么?

单位根检验、航空模型、季节模型

抛开其它阶的时滞,我们只看季节性滞后7阶的ACF数值,它收敛得很缓慢,说明需要进行季节差分,也正是由于需要季节差分,所以日收入原序列是一个非平稳序列。

# 7步季节差分
diff = income_data.diff(7)
diff.dropna(inplace=True)
draw_series(diff, '7步差分时序')
draw_acf_pacf_lag(diff, 40)
ADF_test(diff)
print(sm.tsa.adfuller(diff)[1])
KPSS_test(diff)

对季节差分后序列的KPSS检验结果为:

Result of KPSS Test:
(0.018510813912912785, 0.1, 21, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
Test Statistic             0.018511
p-value                    0.100000
Lag Used                  21.000000
Critical Valuse (10%)      0.347000
Critical Valuse (5%)       0.463000
Critical Valuse (2.5%)     0.574000
Critical Valuse (1%)       0.739000
dtype: float64

p值大于0.05,t 统计量明显小于任何水平下的临界值,说明无法拒绝原假设,季节差分后序列平稳。

单位根检验、航空模型、季节模型

由此,我们得出:KPSS检验非平稳,ADF和PP检验平稳,原序列是非平稳序列,且是一个差分平稳过程。

四. 航空模型

我们知道,航空模型(airline model)是由Box & Jenkins (1976) 提出,已被广泛应用于季节时间序列的建模,模型为单位根检验、航空模型、季节模型 。这类航空模型表现出如下特点:

  1. 有明显上升趋势,且有周期性
  2. ADF检验非平稳,做正规差分消除趋势、做季节差分消除周期性后,序列平稳

在消除趋势1阶差分、消除季节7步差分后,得到两个MA相乘关系的模型,数学表达式如下:

单位根检验、航空模型、季节模型

航空模型在ACF图上表现出来就是:

1)只在滞后阶数为1、s-1、s、s+1时非零

2)在滞后阶数为s-1、s+1时的ACF实际上是滞后阶数为1、s的相关性交互作用(乘法)

单位根检验、航空模型、季节模型

单位根检验、航空模型、季节模型

单位根检验、航空模型、季节模型

因此就很容易解释为什么我们的日收入ACF图会长下面这个样子:

单位根检验、航空模型、季节模型

再看下经7步季节差分后的ACF/PACF图,显示ACF呈指数级衰减呈震荡状,ACF和PACF都具有拖尾性。

单位根检验、航空模型、季节模型

结合上述7步季节差分后的时序ACF图,发现ACF在1/2/3滞后阶处显著,PACF在1阶滞后显著,即有一个AR(1)模型和一个MA(3)模型,因此判断适用模型 单位根检验、航空模型、季节模型 ;又有ACF在6/7/8滞后阶处显著,PACF在6/7/8滞后阶处显著,即有一个季节MA(1)模型和一个季节AR(1)模型,因此判断适用模型 单位根检验、航空模型、季节模型 ;所以我们可初步拟合季节模型 单位根检验、航空模型、季节模型 ,具体还需要看参数的显著性检验。

下面是航空模型的一些例子:

美国月度航空客运量:

单位根检验、航空模型、季节模型

可口可乐公司股票每股季度对数盈利:

单位根检验、航空模型、季节模型

美国夏威夷Mauna Loa天文台采集的大气二氧化碳的连续空气样本:

单位根检验、航空模型、季节模型

纽约每月出生人口数量:

单位根检验、航空模型、季节模型

五. 季节模型

我通过搜集资料发现,诸如太阳黑子、收入、租用、出库等时序,却表现出另外一种非常相似的模型特点,它们属于只有季节效应的非平稳序列,通过季节差分后平稳,模型为单位根检验、航空模型、季节模型 。表现形式如下:

  1. 没有明显趋势,但有周期性
  2. ACF图上有周期性显著大于2倍标准差的延迟阶,缓慢收敛至0且呈现波浪式振荡
  3. ADF检验平稳,KPSS检验非平稳,做季节差分消除周期性后,序列平稳,并通过KPSS检验

而从下面的具体案例看出,太阳黑子月度数据和本案中的日收入非常相似,有明显周期性,且ADF检验平稳但KPSS检验非平稳,说明生活中这样的季节效应非平稳序列不在少数。实际上Wolfer曾对太阳黑子做过谱分析,发现周期约为11年,和ACF中体现的125个月周期接近。

太阳黑子数量(月度数据,1749年-2013年共计3177个月):

单位根检验、航空模型、季节模型

单位根检验、航空模型、季节模型

3177个月延迟的ACF图

单位根检验、航空模型、季节模型

前150个月延迟的ACF图

直接调用 R 包的太阳黑子月度数据,分别进行ADF和KPSS检验,先看ADF结果,p值低于0.05,无法拒绝原假设,检验结果平稳:

> adf.test(sun_spots)

	Augmented Dickey-Fuller Test

data:  sun_spots
Dickey-Fuller = -7.0245, Lag order = 14, p-value = 0.01
alternative hypothesis: stationary

KPSS检验 t 值大于任何显著水平临界值,检验结果非平稳:

> summary(ur.kpss(sun_spots))

####################### 
# KPSS Unit Root Test # 
####################### 

Test is of type: mu with 9 lags. 

Value of test-statistic is: 1.1505 

Critical value for a significance level of: 
                10pct  5pct 2.5pct  1pct
critical values 0.347 0.463  0.574 0.739

太阳黑子数量(年度数据):

单位根检验、航空模型、季节模型

单位根检验、航空模型、季节模型

直接调用 statsmodels 提供的太阳黑子年度数据,分别进行ADF和KPSS检验,结果如下:

ADF检验 3 -> 2 -> 1 均是非平稳:

# 单位根检验 3->2->1
dftest_ct = adfuller(timeseries, regression='ct', autolag='AIC')
(-2.924374638662088, 0.15446517617076427, 8, 300, {'1%': -3.98926783537037, '5%': -3.425226747185185, '10%': -3.1357131066666666}, 2431.9767343211192)

dftest_c = adfuller(timeseries, regression='c', autolag='AIC')
(-2.837780724938195, 0.05307642172812057, 8, 300, {'1%': -3.4523371197407404, '5%': -2.871222860740741, '10%': -2.571929211111111}, 2430.50034229055)

dftest_nc = adfuller(timeseries, regression='nc', autolag='AIC')
(-0.7522201094158966, 0.39060930373720704, 8, 300, {'1%': -2.5732329666666667, '5%': -1.9419315658148149, '10%': -1.6159638828148148}, 2436.914059295739)

在Jupiter上运行了KPSS检验,结果显示在10%水平上拒绝原假设,在1%/2.5%/5%水平下接受原假设,t 值很接近于5%水平下的临界值。综合来看,我们认为太阳黑子年度数据仍然为非平稳,从ACF图上看在20年延迟阶前还是有明显周期性且自相关性较高,在50阶后周期性及自相关性几乎消失,究其原因是年度数据在月度数据上降频了,所以相比月度数据增加了平稳性。

Result of KPSS Test:
(0.44664560602502423, 0.05704930774783439, 16, {'10%': 0.347, '5%': 0.463, '2.5%': 0.574, '1%': 0.739})
Test Statistic             0.446646
p-value                    0.057049
Lag Used                  16.000000
Critical Valuse (10%)      0.347000
Critical Valuse (5%)       0.463000
Critical Valuse (2.5%)     0.574000
Critical Valuse (1%)       0.739000
dtype: float64

某景区共享单车日租用量:

单位根检验、航空模型、季节模型

单位根检验、航空模型、季节模型

单位根检验、航空模型、季节模型

某商品出库量:

单位根检验、航空模型、季节模型

单位根检验、航空模型、季节模型

六. 总结

我在网上看到很多人在提问:为什么存在周期性但ADF单位根检验却平稳?抑或是ADF检验平稳后直接ARMA模型拟合后效果相差甚远?有人回答是ADF的那三类选项及滞后期选择会影响平稳检验的结果。诚然,如果这些你都尝试过了还觉得不对劲,则很可能假设检验犯了第一类错误(纳伪),所以说在结合观察ACF图后,如果你的时间序列明显存在周期性,而又不存在趋势,不妨再试试KPSS检验,然后做季节差分比对下效果,同时也最好验证下异方差。

这里,我也给出我个人判断平稳性的经验,这是在踩坑后查阅大量资料及思考总结后形成:

(1)时序图

始终在一个水平值(常数均值)附近正常的随机波动(常数方差),为平稳;

有明显趋势、周期性、随时间波动范围变化,为非平稳。

(2)ACF图

短期(一般5阶延迟内或通过AR函数定阶)呈指数级下降收敛至0,为平稳;

长期缓慢收敛至0、周期性显著大于2倍标准差的延迟阶长期存在,为非平稳。

(3)单位根检验

ADF前提条件是没有异方差,如果方差齐性,则按上述3/2/1顺序检验,同时需要做参数显著性检验(p值<0.05表示参数显著),查看估计参数是否显著异于0。

PP检验适用于异方差场合。

KPSS不需要选择趋势类型,因而更具鲁棒性。

当上述结果发生冲突时,应确保在时序图和ACF图大方向前提下,配合单位根检验这样的量化方法(不一定准确)具体分析。就像在本案中,尽管ADF和PP检验为平稳,但从时序图和ACF图判断一定存在长期周期性季节效应,最后查证这是一个差分平稳过程,而且是季节差分。

其实,判断平稳性固然重要,但也不要过于纠结,毕竟黑猫白猫,逮到老鼠才是好猫,一切的结果都是为了模型拟合的更佳。以上是我不断纠结并走了一些弯路,从而总结的一些经验,希望能帮助到你。