Python时间序列:如何向ARIMA预测结果回加趋势与季节分量?
问题解答
你使用的是seasonal_decompose的加法模型(model='additive'),该模型的核心假设是:
原始时间序列 = 趋势分量(trend) + 季节分量(seasonal) + 残差分量(resid)
因此最终的序列预测值只需要把三个分量的对应时间预测值相加即可,具体操作步骤如下:
步骤1:获取预测时间段的季节分量
季节性分量是固定周期重复的,你首先要确认分解时使用的周期长度(如果调用seasonal_decompose时没有指定period参数,statsmodels会根据输入序列频率自动推断,可通过result.seasonal的周期规律确认,比如日度数据周周期为7、年周期为365)。
假设你需要预测未来n步,对应季节分量的提取代码示例:
import numpy as np period = 7 # 替换为你实际使用的分解周期 # 取最后一个完整周期的季节值,重复后截取前n个作为未来季节分量 future_seasonal = result.seasonal.tail(period).repeat(np.ceil(n/period).astype(int)).head(n)
步骤2:预测未来时间段的趋势分量
分解得到的result.trend是平滑序列,首尾会存在少量空值,先去除空值后可以用简单的线性外推、或者单独训练一个简易预测模型得到未来的趋势值,参考代码:
from sklearn.linear_model import LinearRegression # 处理trend的有效数据 trend_valid = result.trend.dropna() # 将时间索引转换为数值特征用于线性拟合 X = np.arange(len(trend_valid)).reshape(-1, 1) y = trend_valid.values # 训练线性回归模型 lr = LinearRegression() lr.fit(X, y) # 外推未来n步的trend值 future_X = np.arange(len(trend_valid), len(trend_valid)+n).reshape(-1, 1) future_trend = lr.predict(future_X)
步骤3:获取残差预测值并合并结果
你已经用auto_arima训练好了残差模型,直接预测对应n步的残差值,再和上面两个分量相加即可:
# 假设你训练好的auto_arima模型名为arima_model future_resid = arima_model.predict(n_periods=n) # 三个分量按索引对齐后相加,得到最终原始序列的预测值 final_pred = future_resid.values + future_seasonal.values + future_trend # 可以给结果加上对应的时间索引方便后续使用 future_dates = pd.date_range(start=df_close.index.max() + pd.Timedelta(days=1), periods=n, freq='1D') final_pred = pd.Series(final_pred, index=future_dates)
注意事项
- 所有分量的时间频率必须和你当初分解时的日度频率保持一致,避免索引错位导致相加错误
- 如果后续你更换为乘法模型
model='multiplicative',则最终预测值改为三个分量相乘即可
内容的提问来源于stack exchange,提问作者roschach
相关产品推荐
相关产品推荐

