目录

1. 时序建模标准流程

完整建模流程图

2. 经典时序数据集

常用单变量数据集

数据加载示例

3. ARIMA模型实战

参数解释

建模示例

4. SARIMA模型解析

季节参数

摘要图解读要点

5. 差分处理技术

趋势差分(n阶差分)

季节差分

综合案例:AirPassengers完整建模

步骤1:数据探索

步骤2:平稳性处理

步骤3:SARIMA建模

步骤4:预测反变换

关键问题解决方案


1. 时序建模标准流程

完整建模流程图

2. 经典时序数据集

常用单变量数据集

数据集 特点 适用模型
AirPassengers 明显趋势+季节性(月度航空乘客) SARIMA
Sunspots 周期性波动(太阳黑子) ARMA/ARIMA
JohnsonJohnson 季度财报数据 季节ARIMA
Nile 年度尼罗河流量 简单AR/趋势模型

数据加载示例

import pandas as pd
from statsmodels.datasets import get_rdataset

# 加载AirPassengers数据集
data = get_rdataset('AirPassengers')
series = data.data['value']
series.index = pd.date_range(start='1949-01', periods=len(series), freq='M')

# 可视化
series.plot(figsize=(12,5), title='Monthly Airline Passengers (1949-1960)')
plt.ylabel('Passengers')
plt.show()

3. ARIMA模型实战

参数解释

  • p:自回归阶数(PACF截尾点)

  • d:差分次数(使序列平稳)

  • q:移动平均阶数(ACF截尾点)

建模示例

from statsmodels.tsa.arima.model import ARIMA

# 1. 数据准备(已确保平稳)
train = series[:'1959-12']
test = series['1960-01':]

# 2. 拟合ARIMA(2,1,1)模型
model = ARIMA(train, order=(2,1,1))
results = model.fit()

# 3. 模型摘要
print(results.summary())

# 4. 预测与评估
forecast = results.get_forecast(steps=12)
pred_mean = forecast.predicted_mean
pred_ci = forecast.conf_int()

# 5. 可视化
plt.figure(figsize=(12,6))
plt.plot(train, label='Training')
plt.plot(test, label='Actual')
plt.plot(pred_mean, label='Forecast')
plt.fill_between(pred_ci.index, 
                pred_ci.iloc[:,0], 
                pred_ci.iloc[:,1], 
                color='k', alpha=0.1)
plt.legend()
plt.title('ARIMA(2,1,1) Forecast vs Actual')
plt.show()

4. SARIMA模型解析

季节参数

  • P:季节AR阶数

  • D:季节差分次数

  • Q:季节MA阶数

  • m:季节周期(月度=12,季度=4)

摘要图解读要点

  1. 系数显著性:P>|z|应<0.05

  2. 信息准则:AIC/BIC越小越好

  3. 残差诊断

    • Ljung-Box检验(p>0.05)

    • Jarque-Bera检验(残差正态性)

  4. 系数值范围

    • AR系数应位于(-1,1)保证平稳

    • MA系数应位于(-1,1)保证可逆

5. 差分处理技术

趋势差分(n阶差分)

# 一阶差分(消除线性趋势)
diff_1 = series.diff(1).dropna()

# 二阶差分(消除二次趋势)
diff_2 = series.diff(1).diff(1).dropna()

# 自动确定差分阶数
from pmdarima.arima import ndiffs
n_adf = ndiffs(series, test='adf')  # 基于ADF检验
print(f'推荐差分阶数: {n_adf}')

季节差分

# 月度数据的季节差分(周期=12)
seasonal_diff = series.diff(12).dropna()

# 组合差分(趋势+季节)
combined_diff = series.diff(1).diff(12).dropna()

# 可视化对比
fig, axes = plt.subplots(3,1, figsize=(12,9))
series.plot(ax=axes[0], title='Original')
diff_1.plot(ax=axes[1], title='Trend Differencing (d=1)')
combined_diff.plot(ax=axes[2], title='Trend+Seasonal Differencing (d=1,D=12)')
plt.tight_layout()

综合案例:AirPassengers完整建模

步骤1:数据探索

# 分解季节性
from statsmodels.tsa.seasonal import seasonal_decompose
result = seasonal_decompose(series, model='multiplicative')
result.plot()
plt.tight_layout()

步骤2:平稳性处理

# 对数变换处理异方差
log_series = np.log(series)

# 组合差分
diff_series = log_series.diff(1).diff(12).dropna()

# 验证平稳性
adfuller(diff_series)  # p应<0.05

步骤3:SARIMA建模

from statsmodels.tsa.statespace.sarimax import SARIMAX

# 拟合SARIMA(1,1,1)(1,1,1,12)模型
model = SARIMAX(log_series,
                order=(1,1,1),
                seasonal_order=(1,1,1,12))
results = model.fit()

# 模型诊断
results.plot_diagnostics(figsize=(12,8))
plt.tight_layout()

步骤4:预测反变换

# 获得预测值(对数尺度)
forecast = results.get_forecast(steps=24)
pred_mean = forecast.predicted_mean
pred_ci = forecast.conf_int()

# 指数变换还原
final_pred = np.exp(pred_mean)
true_values = np.exp(log_series[-24:])

# 计算MAPE
mape = np.mean(np.abs(final_pred - true_values)/true_values) * 100
print(f'MAPE: {mape:.2f}%')

关键问题解决方案

  1. 过拟合判断

    • 比较AIC/BIC与样本外误差

    • 检查系数是否接近可逆边界

  2. 预测值漂移

    • 检查是否漏检季节性

    • 尝试乘法模型替代加法模型

  3. 残差相关性

    • 增加MA阶数

    • 考虑外部变量或更复杂模型

  4. 长期预测失效

    • 改用递归策略

    • 结合其他预测方法(如Prophet)

@浙大疏锦行

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐