一、学习内容
1. 一步预测与多步预测的区别与方法
-
一步预测: 一步预测指的是仅预测下一个时间步的值。模型只预测未来一个时间点,然后终止。这种预测方法通常用于短期预测,且误差较小。
-
多步预测: 多步预测指的是预测多个未来时间点。多步预测可以分为两种方法:
- 直接多步预测:同时预测多个未来时间点的值。
- 递归多步预测:先进行一步预测,然后将预测值用于下一步的输入,继续预测后续的多个时间点。
2. 时间序列的滚动预测与滑动窗口方法
-
滚动预测: 滚动预测是一种递归多步预测方法,在每一步预测后,将预测值作为下一个时间步的输入,并滚动窗口前进。这种方法适合于连续预测,但误差可能随着预测步长增加而累积。
-
滑动窗口: 滑动窗口方法是将一定数量的过去观测值作为窗口输入,预测下一个时间点的值。随着时间步进,窗口不断前移,用新的观测值替换旧的观测值。
3. 预测区间的计算
预测区间(或置信区间)表示模型预测值的不确定性范围。通常我们使用模型的残差来计算预测区间,它是对未来某个时间点值的估计范围,通常包含 95% 或 99% 的可能性。
预测区间的计算公式为:
其中 是预测值, 是正态分布下的临界值(例如对于 95% 置信区间,),是预测的标准误差。
二、实战案例
我们将使用 statsmodels
对时间序列数据进行一步预测和多步预测,并计算预测区间。
1. 数据生成
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
# 生成模拟的时间序列数据
np.random.seed(42)
n_obs = 150
time = pd.date_range(start='2000-01-01', periods=n_obs, freq='M')
data = 0.5 * np.arange(n_obs) + np.random.normal(0, 1, n_obs)
# 创建数据框
ts_data = pd.DataFrame({'Date': time, 'Value': data})
ts_data.set_index('Date', inplace=True)
# 绘制时间序列
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data')
plt.title('Simulated Time Series Data')
plt.legend()
plt.show()
代码解释:
- 我们生成了一个模拟时间序列,包含趋势和噪声,用于模型训练和预测。
结果输出:
2. 一步预测
# 构建 ARIMA 模型 (p=1, d=1, q=1)
arima_model = ARIMA(ts_data['Value'], order=(1, 1, 1)).fit()
# 一步预测 (One-step forecast)
one_step_forecast = arima_model.forecast(steps=1)
one_step_conf_int = arima_model.get_forecast(steps=1).conf_int()
print(f"One-step forecast: {one_step_forecast}")
print(f"One-step forecast confidence interval: \n{one_step_conf_int}")
代码解释:
- 使用 ARIMA 模型进行一步预测,并输出预测值和置信区间。预测区间表示模型预测值的不确定性范围。
结果输出:
One-step forecast: 2012-07-31 74.700013
Freq: M, dtype: float64
One-step forecast confidence interval:
lower Value upper Value
2012-07-31 71.990793 77.409233
3. 多步预测
# 多步预测 (Multi-step forecast)
multi_step_forecast = arima_model.forecast(steps=12)
multi_step_conf_int = arima_model.get_forecast(steps=12).conf_int()
# 绘制多步预测结果
plt.figure(figsize=(10, 6))
plt.plot(ts_data.index, ts_data['Value'], label='Original Data')
plt.plot(pd.date_range(start=ts_data.index[-1], periods=12, freq='M'), multi_step_forecast, label='Multi-step Forecast')
plt.fill_between(pd.date_range(start=ts_data.index[-1], periods=12, freq='M'),
multi_step_conf_int.iloc[:, 0],
multi_step_conf_int.iloc[:, 1], color='gray', alpha=0.3, label='Confidence Interval')
plt.title('Multi-step Forecast with Confidence Intervals')
plt.legend()
plt.show()
代码解释:
- 使用 ARIMA 模型进行未来 12 个月的多步预测,并绘制预测结果及其置信区间。置信区间反映了预测的不确定性。
结果输出:
4. 滚动预测
# 滚动预测 (Rolling forecast)
history = [x for x in ts_data['Value'][:120]]
rolling_predictions = list()
for t in range(30):
model = ARIMA(history, order=(1, 1, 1))
model_fit = model.fit()
yhat = model_fit.forecast()[0]
rolling_predictions.append(yhat)
history.append(ts_data['Value'][120 + t])
# 绘制滚动预测结果
plt.figure(figsize=(10, 6))
plt.plot(ts_data.index, ts_data['Value'], label='Original Data')
plt.plot(ts_data.index[120:150], rolling_predictions, label='Rolling Forecast', linestyle='--')
plt.title('Rolling Forecast')
plt.legend()
plt.show()
代码解释:
- 滚动预测是一种逐步更新预测的方法。我们使用历史数据进行预测,然后将新预测值加入历史数据中,重复此过程以进行多步预测。
结果输出:
三、结果分析
1. 一步预测结果
- 输出了下一步的预测值和置信区间。置信区间通常围绕预测值展开,显示了预测值的可能范围。
2. 多步预测结果
- 多步预测显示了未来 12 个月的预测值及其置信区间。由于多步预测是递归进行的,预测误差可能会随着时间的推移而增加。
3. 滚动预测结果
- 滚动预测结果展示了 30 个时间步的逐步预测。滚动预测适合于需要连续更新预测值的场景。
四、总结
通过使用一步预测、多步预测和滚动预测方法,我们可以为不同场景下的时间序列数据生成合理的预测结果。结合置信区间,我们可以评估预测值的准确性和不确定性。