You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 21:40:19