时间序列预处理 | 白噪声检验
时间序列的平稳性检验完之后应该做什么呢?
若时间序列非平稳,使用差分等方法想办法将序列平稳化,平稳化后再来检验是否为白噪声; 若时间序列平稳,检验序列是否是白噪声 非白噪声,使用各种简单又不失准确的平稳时间序列预测模型进行预测 是白噪声,序列是完全随机的,过去的行为对未来的发展没有丝毫影响,故而没有必要再深入分析了
当序列平稳非白噪声时,使用ARMA等方法进行预测过程中,如何判断模型拟合的是否足够好,是否还存在有价值的信息待提取,一种判断方法就是看拟合后的残差是否为白噪声:
残差为白噪声,说明模型拟合的很好,残差部分为无法捕捉的纯随机数据 残差非白噪声,说明模型哪里出了问题,比如参数没调好,需要继续优化;若如何优化模型也无法使得残差为白噪声,换模型,或者对残差进行二次预测。
白噪声的定义我们在'谈谈时间序列的平稳性'中已经介绍了,只要满足以下3个条件即可:
另外一种常见的定义方式为一个具有零均值同方差的独立同分布的序列为白噪声。
白噪声的检验,常用有以下3种方法:
01
自相关图
由定义知,白噪声完全无自相关性,除0阶自相关系数为1外,理想情况下,延迟k阶的样本自相关系数均为0。实际上由于样本序列的有限性,延迟k阶自相关系数并不完全为0,只要在0值附近即认为无自相关性。
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
white_noise = np.random.standard_normal(size=1000)
fig = plt.figure(figsize=(20, 10))
ax1 = fig.add_subplot(211)
ax2 = fig.add_subplot(223)
ax3 = fig.add_subplot(224)
ax1.plot(white_noise)
ax1.set_title('white noise')
plot_acf(white_noise, ax=ax2)
plot_pacf(white_noise, ax=ax3)
plt.show()
自相关图和偏自相关图中浅蓝色条形的边界为,T为序列的长度。由于随机扰动的存在,自相关系数并不严格等于0,我们期望在95%的置信度下,相关系数均在之间。如果一个序列中有较多自相关系数的值在边界之外,那么该序列很可能不是白噪声序列。上图中自相关系数均在边界之内,为白噪声序列。
02
Box-Pierce检验
其中,为序列的观察期数,为延迟k阶样本自相关系数的估计值。
根据Barlett定理,样本自相关系数近似服从正态分布,那么是否可以简单根据3sigma原则,当存在自相关系数在区间之外,即取值落在了小概率区间内(0.26%),认为存在自相关性。
这种方法和看自相关图方法一致,看的是特定延迟期是否存在相关性。是否可以联合多个自相关系数构造检验统计量的方式来检验序列的纯随机性。
1970年,博克斯(Box)和皮尔斯(Pierce)推导出了Q统计量,用来检测一个时间序列数据所有k阶自相关系数是否联合为零。
样本自相关函数(ACF)和偏自相关函数(PACF)是评估时间序列数据中是否存在特定延迟期相关性的一种有效的定性分析工具,使用假设检验方法可以用更加量化方式联合检验多个延迟期的自相关性,进而判断序列总体的相关性或者说随机性是否存在。
假设条件:
: (滞后阶序列值之间相互独立,序列为独立同分布的白噪声) :, (滞后阶序列值之间有相关性,序列为非独立同分布的白噪声)
其中,为延迟k阶的自相关系数,为最大延迟阶数。
检验统计量:
其中,为序列观察期数,为指定的最大延迟阶数,为延迟k阶自相关系数的估计值。
分布是统计学中一个非常有名的分布,若k个相互独立的随机变量均服从标准正态分布,则这k个随机变量的平方和构成的一个新的随机变量,其分布规律为分布,记为,其中参数k称为自由度。
卡方分布是由正态分布构造而成的一个新的分布,不同的自由度决定不同的卡方分布,自由度越小,分布越偏斜。当自由度k很大时,分布近似为正态分布。
根据Barlett定理,服从标准正态分布,可推导出Q统计量近似服从自由度为m的卡方分布:
所以这种检验白噪声的方式即为白噪声的检验。
说明:卡方分布的自由度很重要,不同的自由度决定不同的卡方分布。而Q统计量中的m(最大延迟阶数)又是手动指定,所以不同的m对应不同分布。可以手动指定m为6、12、24,以包含数据完整的周期,也有一些根据公式计算如。
其实m的设置也无必要太大,一些包的默认最大值为40。检验,检验的是前若干项系数是否均为零,而不是检验所有项的自相关系数。因为平稳时间序列数据具有短期相关性,短期不相关长期更不相关,故不需要计算所有自相关系数。
判断准则:
Q统计量小于选定置信水平下的临界值,或者p值大于显著性水平(如0.05),不能拒绝原假设,可认为序列为白噪声序列;
Q统计量大于选定置信水平下的临界值,或者p值小于显著性水平(如0.05),拒绝原假设,认为至少存在某一阶数的自相关,序列非白噪声。
实践环节:
# 可以使用statsmodels的acorr_ljungbox函数进行检验,指定boxpierce为True'''acorr_ljungbox(x, lags=None, boxpierce=False, model_df=0, period=None,return_df=None, auto_lag=False)x: 观测序列lags为延迟阶数,整数/列表,如果是一个整数,返回延迟1阶~延迟该指定整数阶的检验结果;如果是一个列表,仅返回列表中指定的延迟阶数的检验结果;如果为None,默认值为min((nobs // 2 - 2), 40),nobs就是观测序列中样本个数。boxpierce: 布尔类型,如果为True,不仅返回QLB统计量检验结果还返回QBP统计量检验结果;默认为False,仅返回QLB统计量检验结果。model_df: degreee if freedib,即模型的自由度,默认值为0,一般检验单个序列默认值即可;当检验模型拟合后的残差序列时,残差序列中观测值的个数不能表示自由度(个人理解就是里面随机变量的个数,比如方差中无偏估计的因为已知均值,结合前n-1项就能算出第n项,故自由度为样本个数减1)如ARMA拟合后的残差检验时模型自由度为p+q,计算完Q统计量查找P值时,卡方分布的自由度应为lags-p-q,此时指定model_df=p+q。period: 季节性序列周期大小,帮助确定最大延迟阶数return_df: 是否以DataFrame格式返回结果,默认False以元组方式返回结果auto_lag: 根据自相关性自动计算最佳最大延迟阶数,指定时报错了,pass
返回值:lbvalue: QLB检验统计量(Ljung-Box检验)pvalue: QLB检验统计量下对应的P值(Ljung-Box检验)bpvalue: QBP检验统计量,boxpierce为False时不反回(Box-Pierce检验)bppvalue: QBP检验统计量下对应的P值,boxpierce为False时不反回(Box-Pierce检验)'''
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.stats.diagnostic import acorr_ljungbox
# 随机种子
np.random.seed(123)
# 生成白噪声序列
white_noise=np.random.standard_normal(size=1000)
# 白噪声检验,想要查看QBP检验统计量的结果需要指定boxpierce参数为True
# 不指定boxpierce参数,默认返回QLB检验统计量的结果
res = acorr_ljungbox(white_noise, lags=24, boxpierce=True, return_df=True)
print(res)
# 根据检验统计量值查表
# from scipy import stats
# print(stats.chi2.sf(18.891607, 20))
我们这里只看检验统计量下检验效果,即最后两列。可以可看到,各延迟阶数下的p值均大于0.05,不能拒绝原假设,序列为白噪声。
03
Ljung-Box检验
实际应用中人们发现Q统计量在大样本场合(n很大的场合)检验效果很好(传统检验方法中样本量大于30即认为大样本量,Joel等人指出当样本量在500这个量级时Q统计量检验效果较好),但是在小样本场合不太精确。为了弥补这一缺陷,Box和Ljung于1979年对其进行了改进,推导出LB(Ljung-Box)统计量。
假设条件:
同Box-Pierce假设条件一致。
检验统计量:
为序列观察期数,为指定的最大延迟阶数。
LB统计量同样近似服从自由度为的分布。
由于LB统计量就是Box和Pierce的Q统计量的修正,所以人们习惯把它们统称为Q统计量。
判断准则:
LB统计量小于选定置信水平下的临界值,或者p值大于显著性水平(如0.05),不能拒绝原假设,序列为白噪声;
LB统计量大于选定置信水平下的临界值,或者p值小于显著性水平(如0.05),拒绝原假设,序列非白噪声;
实践环节:
import numpy as npimport matplotlib.pyplot as pltfrom statsmodels.stats.diagnostic import acorr_ljungbox
np.random.seed(123)
white_noise=np.random.standard_normal(size=100)
# 不再指定boxpierce参数,近返回QLB统计量检验结果# 同时设置lags参数为一个列表,相应只返回对应延迟阶数的检验结果res = acorr_ljungbox(white_noise, lags=[6,12,24], return_df=True)print(res)
延迟6阶、12阶时p值较大,增加到延迟24阶时,p值略小但也大于0.05,所以在95%的置信水平下认为序列为白噪声。(但若延迟24阶时,p值小于0.05,则认为序列为非白噪声)
还有一种实现Ljung-Box检验的方式为,调用statsmodels包中的acf函数,计算自相关系数时指定qstat为True,表示返回结果中除返回自相关系数外,另返回自相关系数的独立性检验结果Q(QLB)统计量及对应P值。
import numpy as np
import pandas as pd
import statsmodels as sm
np.random.seed(123)
white_noise=np.random.standard_normal(size=100)
r, q, p = sm.tsa.stattools.acf(white_noise, nlags=12, qstat=True)
df = pd.DataFrame(zip(range(1,41), q, p), columns=['lag', 'lb_stat', 'lb_pvalue'])
print(df)
最后再举一个非白噪声的例子结束:
import matplotlib.pyplot as pltimport statsmodels.api as smdata = sm.datasets.sunspots.load_pandas().datadata = data.set_index('YEAR')
res = acorr_ljungbox(data.SUNACTIVITY, lags=[6,12,24], boxpierce=True, return_df=True)print(res)
data.plot(figsize=(12, 4))plt.show()
参考链接
[1]https://www.zybuluo.com/evilking/note/795616
[2]https://www.statology.org/ljung-box-test-python/
[3]https://www.biz.uiowa.edu/faculty/gsavin/papers/JOE.pdf