写在前面,这是一篇单变量时间序列分析学习笔记,参考了很多大佬的文章,东拼西凑才勉强吧时间序列分析理清。在下数据分析萌新一名,有错误的地方欢迎指正,侵删
一、稳定性检验
当一个序列的均值与标准差不随时间变化,则称该序列是一个平稳序列。 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=1∑Nn−kρ^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

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

被折叠的 条评论
为什么被折叠?



