季节性自回归积分移动平均模型(SARIMA)原理详解与Python实战应用

原理

季节性自回归积分移动平均模型(Seasonal ARIMA, SARIMA)是时间序列分析中处理季节性数据的一种重要方法。SARIMA 模型在 ARIMA 模型的基础上,增加了处理季节性成分的部分。SARIMA 模型的常见表示形式为 SARIMA(p, d, q)(P, D, Q, m),其中:

  • p:非季节性自回归(AR)阶数。
  • d:非季节性差分(I)次数。
  • q:非季节性移动平均(MA)阶数。
  • P:季节性自回归(SAR)阶数。
  • D:季节性差分(SI)次数。
  • Q:季节性移动平均(SMA)阶数。
  • m:季节周期的长度(如月份数据的 m=12,季度数据的 m=4)。
  • SARIMA 模型的数学表达式为:

    (1 - \sum_{i=1}^{p} \phi_i B^i)(1 - \sum_{i=1}^{P} \Phi_i B^{mi}) (1 - B)^d (1 - B^m)^D X_t = (1 + \sum_{j=1}^{q} \theta_j B^j)(1 + \sum_{j=1}^{Q} \Theta_j B^{mj}) \epsilon_t

    其中:

  • \phi_i\phi_i是非季节性和季节性自回归系数。
  • \theta_j\Theta_j 是非季节性和季节性移动平均系数。
  • B 是滞后算子。
  • \epsilon_t 是白噪声误差项。
  • 通过这种表示形式,SARIMA 模型可以同时处理时间序列中的非季节性和季节性成分,使得模型更适用于有明显季节性变化的时间序列数据。

    适用情况

    SARIMA 模型适用于以下情况:

    1. 具有季节性模式:SARIMA 模型特别适用于具有季节性模式的时间序列数据。季节性模式是指时间序列在特定时间间隔内呈现出周期性变化。
    2. 短期和中期预测:SARIMA 模型既可以用于短期预测,也可以用于中期预测,特别是在处理季节性数据时效果显著。
    3. 非平稳时间序列:与 ARIMA 模型类似,SARIMA 模型也适用于非平稳时间序列数据,通过差分处理可以将其转化为平稳时间序列。
    Python 示例代码

    以下是使用 Python 实现季节性自回归积分移动平均模型(SARIMA)的示例代码,利用 statsmodels 库进行建模和预测:

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    from statsmodels.tsa.statespace.sarimax import SARIMAX
    from statsmodels.tsa.stattools import adfuller
    
    # 生成样本数据
    np.random.seed(0)
    data = np.random.randn(120).cumsum() + 10 * np.sin(np.linspace(0, 24, 120))
    
    # 创建数据序列
    data_series = pd.Series(data, index=pd.date_range(start='2020-01', periods=120, freq='M'))
    
    # 可视化数据
    plt.figure(figsize=(12, 6))
    plt.plot(data_series)
    plt.title('Sample Time Series Data with Seasonality')
    plt.show()
    
    # 检查数据平稳性
    result = adfuller(data_series)
    print('ADF Statistic:', result[0])
    print('p-value:', result[1])
    
    # 差分处理使数据平稳
    if result[1] > 0.05:
        data_series_diff = data_series.diff().dropna()
        result_diff = adfuller(data_series_diff)
        print('Differenced ADF Statistic:', result_diff[0])
        print('Differenced p-value:', result_diff[1])
    
    # 应用SARIMA模型
    p = 1  # 非季节性自回归阶数
    d = 1  # 非季节性差分次数
    q = 1  # 非季节性移动平均阶数
    P = 1  # 季节性自回归阶数
    D = 1  # 季节性差分次数
    Q = 1  # 季节性移动平均阶数
    m = 12 # 季节周期
    
    model = SARIMAX(data_series, order=(p, d, q), seasonal_order=(P, D, Q, m)).fit()
    print(model.summary())
    
    # 进行预测
    pred_start = len(data_series)
    pred_end = len(data_series) + 12
    predictions = model.predict(start=pred_start, end=pred_end, dynamic=False)
    
    # 可视化结果
    plt.figure(figsize=(12, 6))
    plt.plot(data_series, label='Original Data')
    plt.plot(predictions, label='Predictions', color='red')
    plt.legend()
    plt.title('Seasonal Autoregressive Integrated Moving Average Model (SARIMA)')
    plt.show()
    

    在上述代码中:

    1. 我们首先生成了一些带有季节性成分的样本数据,并将其创建为一个 Pandas 系列对象。
    2. 使用 adfuller 函数检查数据的平稳性。如果数据不是平稳的,可以通过差分处理使其平稳。
    3. 使用 SARIMAX 类拟合 SARIMA 模型,并打印模型摘要。注意,这里我们指定了 SARIMA(p, d, q)(P, D, Q, m) 模型的阶数。
    4. 使用拟合好的模型进行预测,并将预测结果与原始数据进行可视化。

    结论

    季节性自回归积分移动平均模型(SARIMA)是处理具有季节性模式的时间序列数据的一种有效方法。通过结合自回归、差分、移动平均和季节性成分,SARIMA 模型可以捕捉时间序列中的复杂动态特征,特别是季节性变化。SARIMA 模型适用于具有季节性模式的时间序列数据,并且在短期和中期预测中表现良好。通过选择合适的模型阶数和季节周期,可以显著提高预测的准确性。在实践中,结合数据的具体特征和目标需求,调整模型参数以获得更好的预测效果。

    作者:wodertianna

    物联沃分享整理
    物联沃-IOTWORD物联网 » 季节性自回归积分移动平均模型(SARIMA)原理详解与Python实战应用

    发表回复