一、学习内容
1. 季节性调整与周期性预测
季节性调整 是在时间序列分析中常用的技术,旨在去除数据中因季节性波动导致的周期性变化,使数据更易于解释和预测。通常,我们可以使用季节性分解方法来分离时间序列中的趋势、季节性和随机成分。
周期性预测 主要关注数据中的周期性模式,例如每年、每月或每季度发生的重复行为。季节性模式通常可以通过 SARIMA (季节性 ARIMA) 或 Holt-Winters 等模型进行建模。
2. 基于周期性模式的长期预测方法
基于周期性模式的预测方法,通常使用模型如 SARIMA 或 Holt-Winters 模型。这些模型可以捕捉时间序列中的季节性模式,并根据历史周期预测未来的值。
SARIMA 模型 的季节性部分通过在标准 ARIMA 模型中增加季节性自回归和移动平均成分来处理季节性波动。
Holt-Winters 模型 能够同时处理趋势、季节性和残差成分,它是非常经典的时间序列预测模型。
二、实战案例
我们将使用 Python 的 statsmodels
和 holtwinters
模型对带有季节性和周期性的时间序列数据进行预测。
1. 数据生成
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.holtwinters import ExponentialSmoothing
# 生成模拟的时间序列数据(带有季节性和趋势)
np.random.seed(42)
n_obs = 200
time = pd.date_range(start='2000-01-01', periods=n_obs, freq='M')
trend = 0.05 * np.arange(n_obs) # 线性趋势
seasonal = 10 * np.sin(2 * np.pi * time.month / 12) # 季节性
noise = np.random.normal(0, 1, n_obs)
data = trend + seasonal + noise
# 创建数据框
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 with Seasonality and Trend')
plt.legend()
plt.show()
代码解释:
- 我们生成了一个带有线性趋势和季节性波动的模拟时间序列。每个月的数据受到季节性波动(周期性为 12 个月)的影响,并带有噪声干扰。
结果输出:
2. 季节性分解
# 对时间序列进行季节性分解
result = seasonal_decompose(ts_data['Value'], model='additive', period=12)
result.plot()
plt.show()
代码解释:
- 使用
seasonal_decompose
对时间序列进行分解,将其分为趋势、季节性和残差三部分。分解后的结果可以帮助我们理解时间序列的组成部分。
结果输出:
3. SARIMA 模型预测
# 使用 SARIMA 模型进行季节性预测
sarima_model = SARIMAX(ts_data['Value'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
sarima_fitted = sarima_model.fit()
# 进行未来24个月的预测
sarima_forecast = sarima_fitted.forecast(steps=24)
# 绘制SARIMA预测结果
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=24, freq='M'), sarima_forecast, label='SARIMA Forecast')
plt.title('SARIMA Model Forecast')
plt.legend()
plt.show()
代码解释:
- 我们使用 SARIMA 模型对数据进行建模,并预测未来 24 个月的值。SARIMA 模型能够捕捉时间序列中的趋势和季节性模式。
结果输出:
4. Holt-Winters 模型预测
# 使用 Holt-Winters 模型进行预测
hw_model = ExponentialSmoothing(ts_data['Value'], trend='add', seasonal='add', seasonal_periods=12).fit()
hw_forecast = hw_model.forecast(steps=24)
# 绘制 Holt-Winters 预测结果
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=24, freq='M'), hw_forecast, label='Holt-Winters Forecast')
plt.title('Holt-Winters Model Forecast')
plt.legend()
plt.show()
代码解释:
- 使用 Holt-Winters 模型进行建模,预测未来 24 个月的趋势和季节性。Holt-Winters 模型同样适合处理含有季节性和趋势的时间序列。
结果输出:
三、结果分析
1. 季节性分解结果
- 分解图展示了时间序列中的趋势、季节性和随机波动。趋势成分显示了时间序列的线性增长,季节性成分显示了每年的周期性波动。
2. SARIMA 模型预测
- SARIMA 模型的预测结果展示了未来 24 个月的预测值,预测曲线捕捉了季节性波动,并跟随原始数据的趋势变化。
3. Holt-Winters 模型预测
- Holt-Winters 模型同样能够捕捉季节性和趋势,预测结果展示了与 SARIMA 相似的趋势和周期性变化。
四、总结
通过 SARIMA 和 Holt-Winters 模型,我们能够对带有季节性和周期性特征的时间序列数据进行长期预测。季节性分解帮助我们理解数据的组成部分,而基于周期性模式的模型能够提供准确的预测结果。