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

AR(3)模型时序预测效果不佳、后期预测值下降问题求助

AR(3)时间序列预测精度差、峰值后回落问题排查

问题描述

使用AR(3)模型开展时间序列预测、预估未来数据时,预测结果精度差,无法定位问题原因,且无法解释预测序列到达峰值后持续下降的趋势。

复现代码

import pandas as pd

df2 = pd.DataFrame({
     "Month" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
     "Sales Count": [10,15,24,30,33,45,67,70,75,88,92,95,98,105,115]
})

df2.index = df2.Month
df2 = df2.drop('Month',axis=1)

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(df2['Sales Count'],order=(3,0,0))
model = model.fit()

pred = model.predict(1,27)

模型输出预测值

  • 1: 10.924977
  • 2: 19.647766
  • 3: 31.068473
  • 4: 35.592394
  • 5: 36.422376
  • 6: 52.956438
  • 7: 81.115237
  • 8: 74.101817
  • 9: 77.985398
  • 10: 95.468273
  • 11: 95.013056
  • 12: 96.333352
  • 13: 99.131086
  • 14: 108.245458
  • 15: 120.136458
  • 16: 122.627635
  • 17: 122.961509
  • 18: 121.735104
  • 19: 119.397032
  • 20: 116.308360
  • 21: 112.751786
  • 22: 108.946149
  • 23: 105.057805
  • 24: 101.210451
  • 25: 97.493384
  • 26: 93.968447
  • 27: 90.675809

预测结果可视化

AR(3)预测结果图

核心问题原因

  • 违反AR模型平稳性前提:AR模型要求输入序列为平稳序列,本次使用的销售数据存在明确单调上涨趋势,属于非平稳序列。代码中设置差分项d=0未做去趋势处理,模型错误将短期波动规律识别为长期规律,外推时自然会出现峰值后回落的错误走势。平稳AR模型的长期预测本身就会收敛到序列均值,无趋势设定下不可能长期保持上涨走势。
  • 阶数选择无依据:直接主观指定p=3未做校验,应通过ACF/PACF截尾特征、AIC/BIC信息准则筛选最优阶数,阶数失配会直接导致模型无法正确捕捉序列自相关关系。
  • 调用过时API:代码导入的statsmodels.tsa.arima_model.ARIMA是statsmodels旧版废弃接口,新版已将ARIMA迁移至statsmodels.tsa.arima.model.ARIMA路径,旧接口多步外推逻辑存在已知bug,容易出现趋势偏移。

修正方案

  1. 先做平稳性校验:用ADF单位根检验验证序列平稳性,若检验p值大于0.05说明序列非平稳,先做差分处理,根据差分结果确定合理的d值,不要默认用d=0。
  2. 自动选最优阶数:可借助pmdarima库的auto_arima方法遍历p、d、q参数组合,选择AIC值最小的最优阶数,避免主观定阶的误差。
  3. 替换新版API:使用statsmodels新版ARIMA接口,若数据存在明确线性趋势,可在拟合时传入trend='t'参数添加线性趋势项,适配带持续趋势的序列。
  4. 修正示例代码:
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from pmdarima import auto_arima

df2 = pd.DataFrame({
     "Month" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],
     "Sales Count": [10,15,24,30,33,45,67,70,75,88,92,95,98,105,115]
})
df2.index = df2.Month
df2 = df2.drop('Month',axis=1)

# 自动筛选最优参数
best_order = auto_arima(df2['Sales Count'], suppress_warnings=True, error_action='ignore').order
# 拟合带线性趋势的ARIMA模型
model = ARIMA(df2['Sales Count'], order=best_order, trend='t')
model_fit = model.fit()
# 生成预测结果
pred = model_fit.predict(start=1, end=27)

内容的提问来源于stack exchange,提问作者user19354061

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:45:54