使用ARIMA做时间序列预测时未来预测结果呈直线问题排查
问题原因与解决方案
核心问题1:差分参数计算函数完全错误
你的differencing_parameter函数没有正确执行二阶差分的平稳性检验——代码中first_diff和second_diff都是对原始序列做ADF检验,完全没有生成一阶差分序列来做二阶平稳性判断。这直接导致d的取值逻辑完全失效,比如当原始序列不平稳但一阶差分后平稳时,函数会错误返回d=2,引发过度差分,最终让模型输出无趋势的恒定值。
核心问题2:ARIMA阶数参数逻辑矛盾
你在模型初始化时固定写order=(1, 2, d),但ARIMA的order格式是(p, d, q),其中第二个位置的参数就是差分次数。这里你既手动计算了d,又固定写死了差分次数为2,属于重复设置且逻辑冲突,进一步导致模型拟合错误。
核心问题3:滚动预测的不必要重复计算
未来预测时每次循环都重新计算d,但序列加入单步预测值后,平稳性不会突变,重复计算不仅冗余,还可能因微小波动导致d值反复变化,干扰模型稳定性。
修正后的代码
1. 修复差分参数计算函数
from statsmodels.tsa.stattools import adfuller def differencing_parameter(set_df): # 原始序列的ADF平稳性检验 orig_adf = adfuller(set_df) # 生成一阶差分序列 first_diff = [set_df[i] - set_df[i-1] for i in range(1, len(set_df))] # 一阶差分序列的ADF检验(对应二阶差分的平稳性判断) first_diff_adf = adfuller(first_diff) if orig_adf[1] > 0.05: # 原始序列不平稳,检查一阶差分 if first_diff_adf[1] > 0.05: d = 2 # 二阶差分后平稳 else: d = 1 # 一阶差分后平稳 else: d = 0 # 原始序列已平稳 return d
2. 修正ARIMA模型阶数设置
将order=(1, 2, d)改为order=(1, d, 2),把计算得到的差分参数d放在正确的位置:
# 在previous_prediction中 model = ARIMA(training_set, order=(1, d, 2)) # 在future_prediction中 model = ARIMA(set_df, order=(1, d, 2))
3. 优化未来滚动预测逻辑
初始计算一次d即可,无需每次循环重复计算:
def future_prediction(df, periodos): model_future_predictions = [] set_df = list(df[kafsimo]) # 仅初始化时计算一次差分参数 d = differencing_parameter(set_df) for i in range(periodos): model = ARIMA(set_df, order=(1, d, 2)) model_fit = model.fit() yhat = model_fit.forecast()[0] model_future_predictions.append(yhat) set_df.append(yhat) return model_future_predictions, set_df
额外建议
- 不要固定
p=1和q=2的参数值,推荐使用pmdarima库的auto_arima函数自动搜索最优(p, d, q)阶数,这能显著提升预测的准确性和稳定性。 - 除了ADF检验,可结合自相关图(ACF)和偏自相关图(PACF)辅助判断差分次数和阶数参数。
内容的提问来源于stack exchange,提问作者mariniou77
相关产品推荐
相关产品推荐

