时间序列分析与预测:从平稳性校正到指数平滑建模
立即解锁
发布时间: 2025-09-04 00:57:37 阅读量: 7 订阅数: 32 AIGC 

# 时间序列分析与预测:从平稳性校正到指数平滑建模
## 1. 时间序列平稳性测试与校正
### 1.1 Zivot - Andrews 测试结果
首先进行了 Zivot - Andrews 测试,结果如下:
| 指标 | 值 |
| --- | --- |
| 测试统计量 | -2.551 |
| P 值 | 0.982 |
| 滞后阶数 | 12 |
| 趋势 | 常数 |
| 临界值(1%) | -5.28 |
| 临界值(5%) | -4.81 |
| 临界值(10%) | -4.57 |
原假设为该过程包含一个带有单一结构突变的单位根,备择假设为该过程是趋势和突变平稳的。基于测试的 P 值,我们不能拒绝原假设,即该过程是非平稳的。
### 1.2 使非平稳时间序列平稳的方法
可以使用以下一种或多种变换来使非平稳时间序列平稳:
- 通货紧缩:使用消费者价格指数(CPI)来考虑货币序列中的通货膨胀。
- 应用自然对数:使潜在的指数趋势更接近线性,并减少时间序列的方差。
- 差分:计算当前观测值与滞后值之间的差值。
### 1.3 具体操作步骤
#### 1.3.1 导入库并认证和更新通胀数据
```python
import pandas as pd
import numpy as np
import nasdaqdatalink
import cpi
from datetime import date
from chapter_6_utils import test_autocorrelation
nasdaqdatalink.ApiConfig.api_key = "YOUR_KEY_HERE"
```
这里使用了 `test_autocorrelation` 辅助函数,它结合了之前提到的 ADF 和 KPSS 测试以及 ACF/PACF 图。
#### 1.3.2 下载黄金价格并重新采样为月度值
```python
df = (
nasdaqdatalink.get(dataset="WGC/GOLD_MONAVG_USD",
start_date="2000-01-01",
end_date="2010-12-31")
.rename(columns={"Value": "price"})
.resample("M")
.last()
)
```
使用 `test_autocorrelation` 函数测试可知,月度黄金价格的时间序列确实是非平稳的。
#### 1.3.3 对黄金价格进行通货紧缩处理并绘图
```python
DEFL_DATE = date(2010, 12, 31)
df["dt_index"] = pd.to_datetime(df.index)
df["price_deflated"] = df.apply(
lambda x: cpi.inflate(x["price"], x["dt_index"], DEFL_DATE),
axis=1
)
(
df.loc[:, ["price", "price_deflated"]]
.plot(title="Gold Price (deflated)")
)
```
#### 1.3.4 对通货紧缩后的序列应用自然对数并绘制滚动指标
```python
WINDOW = 12
selected_columns = ["price_log", "rolling_mean_log",
"rolling_std_log"]
df["price_log"] = np.log(df.price_deflated)
df["rolling_mean_log"] = df.price_log.rolling(WINDOW) \
.mean()
df["rolling_std_log"] = df.price_log.rolling(WINDOW) \
.std()
(
df[selected_columns]
.plot(title="Gold Price (deflated + logged)",
subplots=True)
)
```
从图中可以看出,对数变换使指数趋势线性化。
#### 1.3.5 测试序列是否平稳
```python
fig = test_autocorrelation(df["price_log"])
```
统计测试结果显示,ADF 测试统计量为 1.04(P 值为 0.99),KPSS 测试统计量为 1.93(P 值为 0.01),说明通货紧缩和自然对数变换不足以使月度黄金价格时间序列平稳。
#### 1.3.6 对序列进行差分并绘图
```python
selected_columns = ["price_log_diff", "roll_mean_log_diff",
"roll_std_log_diff"]
df["price_log_diff"] = df.price_log.diff(1)
df["roll_mean_log_diff"] = df.price_log_diff.rolling(WINDOW) \
.mean()
df["roll_std_log_diff"] = df.price_log_diff.rolling(WINDOW) \
.std()
df[selected_columns].plot(title="Gold Price (deflated + log + diff)")
```
变换后的黄金价格看起来是平稳的,序列围绕 0 振荡,没有明显趋势,方差大致恒定。
#### 1.3.7 再次测试序列是否平稳
```python
fig = test_autocorrelation(df["price_log_diff"].dropna())
```
统计测试结果显示,ADF 测试统计量为 -10.87(P 值为 0.00),KPSS 测试统计量为 0.30(P 值为 0.10),说明经过一阶差分后,序列在 5% 的显著性水平下变得平稳。
### 1.4 季节性处理
如果数据集显示出季节性模式,可以采用以下解决方案:
- 差分调整:使用高阶差分,例如对于月度数据中的年度季节性,使用 `diff(12)`。
- 建模调整:直接对季节性进行建模,然后从序列中去除。可以使用 `seasonal_decompose` 函数提取季节性成分,或者使用 `np.polyfit()` 拟合多项式并从原始序列中减去。
### 1.5 其他调整方法
- Box - Cox 变换:结合不同的指数变换函数,使分布更接近正态分布。使用 `scipy` 库中的 `boxcox` 函数可以自动找到最佳拟合的 lambda 参数。但要求序列中的所有值都为正。
- `pmdarima` 库:包含 `ndiffs` 和 `nsdiffs` 函数,可以通过统计测试确定需要对序列进行差分的次数以实现平稳性(包括去除季节性)。
```python
from pmdarima.arima import ndiffs, nsdiffs
print(f"Suggested # of differences (ADF): {ndiffs(df['price'], test='adf')}")
print(f"Suggested # of differences (KPSS): {ndiffs(df['price'], test='kpss')}")
print(f"Suggested # of differences (PP): {ndiffs(df['price'], test='pp')}")
print(f"Suggested # of differences (OSCB): {nsdiffs(df['price'], m=12, test='ocsb')}")
print(f"Suggested # of differences (CH): {nsd
```
0
0
复制全文
相关推荐









