时间序列平稳性检验(ADF)和白噪声检验(Ljung-Box)

在对时间序列做预测前,我们要对数据进行一系列检验,主要是检验数据的稳定性和随机性(白噪声检验),本文主要介绍ADF检验Ljung-Box检验

ADF检验

ADF检验即单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列了。单位根就是指单位根过程,可以证明,序列中存在单位根过程就不平稳,会使回归分析中存在伪回归。

下面给出ADF检验的python代码

from statsmodels.tsa.stattools import adfuller
import pandas as pd
import numpy as np
data = pd.Series([151.0, 188.46, 199.38, 219.75, 241.55, 262.58, 328.22, 396.26, 442.04, 517.77, 626.52, 717.08, 824.38, 913.38, 1088.39, 1325.83, 1700.92, 2109.38, 2499.77, 2856.47, 3114.02, 3229.29, 3545.39, 3880.53, 4212.82, 4757.45, 5633.24, 6590.19, 7617.47, 9333.4, 11328.92, 12961.1, 15967.61],index=np.arange(1978,2011))
re=adfuller(data)
print(re)

(-0.04391111656553118, 0.9547464774274733, 10, 22, {'1%': -3.769732625845229, '5%': -3.005425537190083, '10%': -2.6425009917355373}, 291.54354258641223)

结果分析如下:
-0.04391111656553118是adt检验的结果,简称为T值,表示t统计量。
0.9547464774274733简称为p值,表示t统计量对应的概率值。
10表示延迟。
22表示测试的次数。
第五个是配合T值一起看的,是在99%,95%,90%置信区间下的临界的ADF检验的值。
291.54354258641223最大滞后门限值门限

首先,-0.04391111656553118大于三个置信区间的临界值,即存在单位根。

其次,p值要求小于给定的显著水平(一般是0.05),等于0最好。本数据中,P值 为 0.9547464774274733,大于0.05,即存在单位根。

所以综上所述,此序列不是平稳序列

下面给出平稳序列的结果
(-4.924087490679005, 3.129856642757301e-05, 19, 636, {'1%': -3.4406737255613256, '5%': -2.866095119842903, '10%': -2.5691958123689727}, 14356.744057311003)

T值小于三个置信区间的临界值,且P值小于0.05接近0,所以不存在单位根,是平稳序列。

Ljung-Box检验

Ljung-Box检验即LB检验、随机性检验,用来检验m阶滞后范围内序列的自相关性是否显著,或序列是否为白噪声,Q统计量服从自由度为m的卡方分布。若是白噪声数据,则该数据没有价值提取,即不用继续分析了

下面给出Ljung-Box检验的python代码

from statsmodels.stats.diagnostic import acorr_ljungbox as lb_test
re = lb_test(data, lags=20)#使用的博主自己的数据
prinit(re)
        lb_stat      lb_pvalue
1    471.099659  1.847036e-104
2    899.481638  4.786785e-196
3   1347.384204  7.695651e-292
4   1791.734228   0.000000e+00
5   2207.199800   0.000000e+00
6   2674.155719   0.000000e+00
7   3242.923906   0.000000e+00
8   3686.776794   0.000000e+00
9   4069.902008   0.000000e+00
10  4474.462678   0.000000e+00
11  4865.867510   0.000000e+00
12  5234.470249   0.000000e+00
13  5641.097308   0.000000e+00
14  6133.124076   0.000000e+00
15  6518.637784   0.000000e+00
16  6846.243758   0.000000e+00
17  7193.271970   0.000000e+00
18  7526.968985   0.000000e+00
19  7836.234889   0.000000e+00
20  8179.147428   0.000000e+00

结果分析如下

我们主要看第二列的P值,lags为检验的延迟数,一般指定是20,或是序列长度,每一个P值都小于0.05或等于0,说明该数据不是白噪声数据,数据有价值,可以继续分析。

反之如果大于0.05,则说明是白噪声序列,是纯随机性序列。

  • 18
    点赞
  • 188
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
好的,以下是实现这个过程的 Python 代码示例: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import statsmodels.api as sm from arch import arch_model from statsmodels.tsa.stattools import adfuller from statsmodels.stats.diagnostic import acorr_ljungbox # 读取 Excel 数据 data = pd.read_excel('data.xlsx') # 将日期列转换为时间序列索引 data['DATE'] = pd.to_datetime(data['DATE']) data = data.set_index('DATE') # 对 F4 进行 ADF 检验 result = adfuller(data['F4']) print('ADF Statistic: %f' % result[0]) print('p-value: %f' % result[1]) if result[1] > 0.05: print('The series is not stationary') else: print('The series is stationary') # 对 F4 进行 Ljung-Box 检验 result = acorr_ljungbox(data['F4'], lags=10) print('Ljung-Box test:') print('Statistic:', result[0]) print('p-value:', result[1]) if any(result[1] < 0.05): print('The series is not a white noise') else: print('The series is a white noise') # 按照 AIC 选择最优的 ARIMA-GARCH 参数 aic = [] for p in range(3): for q in range(3): for P in range(3): for Q in range(3): try: model = sm.tsa.ARIMA(data['F4'], order=(p, 1, q)) model_fit = model.fit(disp=0) am = arch_model(model_fit.resid, p=P, q=Q) am_fit = am.fit(disp=0) aic.append((p, q, P, Q, model_fit.aic, am_fit.aic)) except: continue aic_df = pd.DataFrame(aic, columns=['p', 'q', 'P', 'Q', 'ARIMA AIC', 'GARCH AIC']) print(aic_df) best_params = aic_df.loc[aic_df['ARIMA AIC'].idxmin()] print('Best ARIMA-GARCH Parameters:', best_params) # 拟合 ARIMA-GARCH 模型 model = sm.tsa.ARIMA(data['F4'], order=(best_params['p'], 1, best_params['q'])) model_fit = model.fit(disp=0) am = arch_model(model_fit.resid, p=best_params['P'], q=best_params['Q']) am_fit = am.fit(disp=0) # 对模型进行预测 start_index = len(data) - 10 # 预测最后10个数据 end_index = len(data) - 1 forecast = am_fit.forecast(horizon=10) # 计算预测值和实际值的拟合优度 r2 = np.corrcoef(forecast.mean['h.1'], data['F4'][start_index:end_index])[0, 1] ** 2 print('R2:', r2) # 绘制预测结果和实际数据的时序图 plt.plot(data['F4'][start_index:end_index], label='Actual') plt.plot(forecast.mean['h.1'], label='Predict') plt.legend() plt.show() ``` 其中,我们首先读取 Excel 数据,并将日期列转换为时间序列索引。然后,我们对 F4 进行 ADF 检验Ljung-Box 检验,以确定时间序列平稳性白噪声性质。接着,我们循环计算 ARIMA-GARCH 的每组参数的 AIC,并选择拟合优度最佳的一组参数组合。然后,我们使用最优参数拟合 ARIMA-GARCH 模型,并对模型进行预测。最后,我们计算预测值和实际值的拟合优度,并绘制预测结果和实际数据的时序图。 注意,在运行代码之前,需要先安装一些必要的 Python 库,包括 pandas、numpy、matplotlib、statsmodels 和 arch。可以使用 pip 工具来安装这些库,例如: ``` pip install pandas numpy matplotlib statsmodels arch ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青石横刀策马

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值