差分变换
通常情况下,非平稳序列可通过 差分变换 转化为平稳序列
fig, axs = plt.subplots(4, 1) ##### 非平稳序列 np.random.seed(12345) ut = np.random.randint(-30, 30, size=(100)) xt = np.cumsum(ut) + 500 axs[0].plot(xt) ##### 差分变换 df = pd.DataFrame(xt) df_diff1_1 = df.diff() ### 1阶差分,步长为1 df_diff1_2 = df.diff(2) ### 1阶差分,步长为2 df_diff2 = df_diff1_1.diff() ### 2阶差分,步长为1 axs[1].plot(df_diff1_1) axs[2].plot(df_diff1_2) axs[3].plot(df_diff2) plt.show()
二阶差分是 对 一阶差分 的差分
输出:非平稳序列、一阶差分/步长1、1阶差分/步长2、2阶差分/步长1

可以看到 原始数据 非平稳,后面的基本上是平稳序列;
平稳性检测
时间序列处理
事实上,在处理时间序列时,我们首先要检测 序列的平稳性,大致流程如下

还用 差分变换 那节的例子,来解释下 ADF 检测的用法
np.random.seed(12345) ut = np.random.randint(-30, 30, size=(100)) xt = np.cumsum(ut) print(ts.adfuller(xt)) # (-1.5243530203505073, 0.5214317018385488, 0, 99, {'1%': -3.498198082189098, '5%': -2.891208211860468, '10%': -2.5825959973472097}, 845.9136155157069) ##### 差分变换 df = pd.DataFrame(xt) df_diff1_1 = df.diff() ### 1阶差分,步长为1 print(ts.adfuller(df_diff1_1[1:])) # (-3.849731498648273, 0.0024375726243445746, 12, 86, {'1%': -3.5087828609430614, '5%': -2.895783561573195, '10%': -2.5850381719848565}, 740.2735055354956) df_diff1_2 = df.diff(2) ### 1阶差分,步长为2 print(ts.adfuller(df_diff1_2[2:])) # (-4.012534867488554, 0.001346278712964153, 11, 86, {'1%': -3.5087828609430614, '5%': -2.895783561573195, '10%': -2.5850381719848565}, 736.1426417807885) df_diff2 = df_diff1_1.diff() ### 2阶差分,步长为1 print(ts.adfuller(df_diff2[2:])) # (-5.307353752105175, 5.286830381426628e-06, 10, 87, {'1%': -3.5078527246648834, '5%': -2.895382030636155, '10%': -2.584823877658872}, 744.9060722567168)
输出 第 1 个值我们称为 test result,第 2 个值我们称为 p-value;
ADF 检验的假设是 存在单位根,有两种方式检验 假设 是否成立:
1. 如果 test result 显著小于 3 个置信度(1%、5%、10%) 的临界统计值,说明是 拒绝 原假设的;
2. 如果 p-value 小于 0.05,说明是 拒绝 原假设的;
实例解读
原始数据(非平稳) 检测结果为 -1.5,大于三个临界值 -3.4,-2.8,-2.5,说明 原假设成立,存在单位根,证明为 非平稳序列;
p-value 为 0.5,远大于 0.05,原假设成立,存在单位根,证明为 非平稳序列;
这个逻辑挺绕的,总结一下,要想 序列平稳,test result 和 p-value 都要小;
参考资料:
https://www.zhihu.com/question/29128649 什么是时间序列模型,什么是弱平稳和严格平稳?
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.diff.html 差分
https://www.lizenghai.com/archives/595.html 基于Python的ADF单位根检验方法——时间序列平稳检验
https://www.zhihu.com/question/25946431 如何将非平稳的时间序列变为平稳的时间序列?
https://blog.csdn.net/qtlyx/article/details/53456480 时间序列分析这件小事(六)--非平稳时间序列与差分
https://blog.csdn.net/dingming001/article/details/73732102 差分变换进阶【有空再看看】
浙公网安备 33010602011771号