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

如何用statsmodels ARIMA预测第151个值?解决索引匹配KeyError问题

解决ARIMA预测时的KeyError问题

你的问题核心在于预测时传入的start参数不在训练数据的索引范围内:训练模型用的是前150行数据(对应索引是2018-01-02到2018-08-06左右的工作日),而close.index[150]是第151行的日期(2018-08-07),这个日期并没有包含在训练数据的索引里,所以模型无法匹配到对应的位置,直接抛出了KeyError。

下面给你两种可行的解决方法:

方法1:用位置索引指定预测点

这是最直接的处理方式,直接通过序列的位置来定义预测的起点和终点。训练数据有150行,我们要预测的是紧接着的下一个点(对应原数据的第151行),代码如下:

from statsmodels.tsa.arima_model import ARIMA

# 用前150行训练ARIMA模型
model = ARIMA(close[:150], order=(1,1,1))
model_fit = model.fit(disp=0)

# 预测训练数据之后的第1个点:start=150对应训练集的下一个位置
pred = model_fit.predict(start=150, end=150, dynamic=False, typ='levels')

# 手动给预测结果设置目标日期的索引
pred.index = [close.index[150]]
print(pred)

运行后就能得到对应2018-08-07的预测值,方便和真实值做对比。

方法2:指定时间序列的明确频率(推荐)

因为你的数据是工作日序列,先把索引转为带明确频率的DatetimeIndex,让statsmodels能直接识别后续的工作日日期,不用手动处理位置:

import pandas as pd
from statsmodels.tsa.arima_model import ARIMA

# 将索引转为DatetimeIndex,并指定频率为工作日('B'代表Business Day)
close.index = pd.DatetimeIndex(close.index, freq='B')

# 训练模型
model = ARIMA(close[:150], order=(1,1,1))
model_fit = model.fit(disp=0)

# 直接传入目标日期作为start参数
pred = model_fit.predict(start=close.index[150], end=close.index[150], dynamic=False, typ='levels')
print(pred)

设置freq='B'后,模型能理解时间序列的规律(自动跳过周末),所以可以直接用目标日期作为预测起点,不会再出现索引匹配错误。

结果验证

两种方法都能输出第151行的预测值,你可以通过pred[0]提取具体数值,和close[150]的真实值做对比,评估模型的预测效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:24:11