python statsmodels时间序列分析

本文是关于Python statsmodels库进行时间序列分析的学习笔记,包括稳定性检验、差分、白噪声检验、模型选择与建立(如ARIMA模型)以及模型诊断等步骤。通过ADF检验确定序列的平稳性,差分使非平稳序列变得平稳,并利用ACF和PACF选择模型。最终通过AIC和BIC选择最佳模型,并进行模型残差的正态性检查。

写在前面,这是一篇单变量时间序列分析学习笔记,参考了很多大佬的文章,东拼西凑才勉强吧时间序列分析理清。在下数据分析萌新一名,有错误的地方欢迎指正,侵删

一、稳定性检验

当一个序列的均值与标准差不随时间变化,则称该序列是一个平稳序列。 ARMA、AR、MA等模型只能用于预测平稳序列,因此需要对序列进行平稳性检验

1、绘图法

如下图a为平稳序列,图b为非平稳序列
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmJfJnY1-1637157590275)(F:\typora imgs\image-20211112222403614.png)]

2、ADF检验

参考: https://www.pianshen.com/article/5826219147/

  • 单位根 当一个自回归过程中:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hQ2lJulv-1637157590279)(https://www.pianshen.com/images/743/58b202cc73c71b7e04cd13da4070c00f.gif)]如果滞后项系数b为1,就称为单位根。当单位根存在时,自变量和因变量之间的关系具有欺骗性,因为残差序列的任何误差都不会随着样本量(即时期数)增大而衰减,也就是说模型中的残差的影响是永久的。这种回归又称作伪回归。如果单位根存在,这个过程就是一个随机漫步(random walk)
  • ADF检验的原理
    ADF检验就是判断序列是否存在单位根:如果序列平稳,就不存在单位根;否则,就会存在单位根。所以,ADF检验的 H0 假设就是存在单位根,如果得到的显著性检验统计量小于三个置信度(10%,5%,1%),则对应有(90%,95,99%)的把握来拒绝原假设
  • ADF检验的python实现
from statsmodels.tsa.stattools import adfuller
result = adfuller(your_data)
print(result)

adfuller的参数

参数 含义
x 一维数组
maxlag 最大滞后数目
regression 回归中的包含项(c:只有常数项,默认;ct:常数项和趋势项;ctt:常数项,线性二次项;nc:没有常数项和趋势项)
autolag 自动选择滞后数目(AIC:赤池信息准则,默认;BIC:贝叶斯信息准则;t-stat:基于maxlag,从maxlag开始并删除一个滞后直到最后一个滞后长度基于 t-statistic 显著性小于5%为止;None:使用maxlag指定的滞后)
store True False,默认
regresults True 完整的回归结果将返回。False,默认

adfuller的返回值

返回值 含义
adf Test statistic,T检验,假设检验值
pvalue 假设检验结果
usedlag 使用的滞后阶数
nobs 用于ADF回归和计算临界值用到的观测值数目
icbest 如果autolag不是None的话,返回最大的信息准则值
resstore 将结果合并为一个dummy
  • 结果解读
(-0.45153867687808574, 0.9011315454402649, 1, 198, {
   
   '5%': -2.876250632135043, '1%': -3.4638151713286316, '10%': -2.574611347821651}, 1172.4579344852016)

t-statistic 的值 -0.451 ,要求小于10%,p-value的值很大,接受原假设,即存在单位根,序列不具有平稳性

二、差分

当序列不具有平稳性的时候,可以通过差分变换使序列变得平稳。所谓差分就是用下一个数减去上一个数,他们的差值形成了一个新的序列

  • 差分的python实现
df = pd.DataFrame([math.sin(x) + 0.2*x + random.choice([-0.2,-0.1,0,0.1,0.2]) for x in range(1,40)]) #伪数据
diff_1 = df.diff(1) # 1阶差分
diff_2 = diff_1.diff(1) # 2阶差分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ms0X1fvF-1637157590282)(F:/typora imgs/差分.png)]
可以发现原本不平稳的序列在差分后变得平稳

三、白噪声检验

参考: https://www.cnblogs.com/travelcat/p/11400307.html
白噪声序列的每个数据都是独立且随机的,没有分析的意义,所以接下来需要判断序列是否为白噪声

  • 原理
    白噪声检验可以通过Ljung-Box检验(LB检验)来进行,构造的统计量如下,用于检验N阶滞后范围内序列的自相关性是否显著,或序列是否为白噪声
    Q=n(n+2)∑k=1Nρ^k2n−k Q = n(n+2)\sum \limits_{k=1} ^{N}\frac{\hat{ρ}^2_k}{n-k} Q=n(n+2)k=1Nnkρ^k2
    Q是服从自由度为N的卡方分布,其中ρ²表示滞后k阶的相关系数,n是样本数量

​ __原假设H0:__原本的数据都是独立的,即总体的相关系数为0,能观察到的某些相关仅仅产生于随机抽样的误差。
​ __责备假设H1:__原本的数据不是独立的

  • LB检验python实现
    我们可以通过statsmodels库轻易实现LB检验
from statsmodels.stats.diagnostic import acorr_ljungbox as lb_test

lb_test参数

参数 含义
x 检验的时间序列
lags int,list or None,检验的延迟数
boxpierce 若为True,则同时输出boxpierce统计量的检验结果(Box-Pierce检验为白噪声检验的另一个版本,是LB检验的前身)

lb_test返回值
​ 返回值是一个元组,里面分别是:(LB统计量值array, LB-p值array,若boxpierce

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值