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

如何用ARMA模型(SARIMAX实现)对指定起止日期的未来数据预测?

如何用SARIMAX预测指定起止日期的未来数据

问题背景

给定如下结构的时间序列DataFrame:

lstvals = [30.81,27.16,82.15,31.00,9.13,11.77,25.58,7.57,7.98,7.98]
lstdates = ['2021-01-01', '2021-01-05', '2021-01-09', '2021-01-13', '2021-01-17', '2021-01-21', '2021-01-25', '2021-01-29', '2021-02-02', '2021-02-06']
data = {
    "Dates": lstdates,
    "Market Value": lstvals
}
df = pd.DataFrame(data)
df.set_index('Dates', inplace = True)

实际数据集时间范围为2021-01-01至2023-11-09,需预测2024-01-01至2024-11-09的未来数据。

已通过SARIMAX模型完成测试集预测:

train = df['Market Value'].iloc[:1187]
test = df['Market Value'].iloc[-200:]
# 省略其他初始化代码
ARMAmodel = SARIMAX(y, order = (2,1,2))
ARMAResults = ARMAmodel.fit()

# 测试集预测逻辑
y_pred = ARMAResults.get_forecast(len(test.index))
y_pred_df = y_pred.conf_int(alpha = 0.05) 
y_pred_df["Predictions"] = ARMAResults.predict(start = y_pred_df.index[0], end = y_pred_df.index[-1])
y_pred_df.index = test.index
y_pred_out = y_pred_df["Predictions"] 

# 绘图代码
plt.plot(train, color = "black")
plt.plot(test, color = "red")
plt.ylabel('Market Value ($M)')
plt.xlabel('Date')
plt.xticks(rotation=45)
plt.title("Train/Test/Prediction for Market Data")
plt.plot(y_pred_out, color='green', label = 'Predictions')
plt.legend()
plt.show()

但使用forecast方法指定起止日期时触发错误:

ARMAResults.forecast(start = '2024-01-01', end = '2024-11-09')

错误信息:

TypeError: statsmodels.tsa.statespace.mlemodel.MLEResults.predict() got multiple values for keyword argument 'start'

解决方案

核心原因

forecast()方法不支持直接传入start和end日期参数,它默认从训练数据的最后一个时间点之后开始预测,需传入预测步数,或配合get_forecast()生成未来时间索引后处理。

正确实现方式

方法1:用get_forecast()生成指定日期范围的预测

  1. 生成与原数据时间频率匹配的未来日期索引(示例按日频率,需根据实际数据集调整):
# 生成目标时间段的日期序列,freq参数需和原数据一致
future_dates = pd.date_range(start='2024-01-01', end='2024-11-09', freq='D')
# 若原数据为不规则间隔,可手动构造符合间隔规律的日期列表
  1. 计算预测步数并获取结果:
n_steps = len(future_dates)
# 获取预测结果(含置信区间)
forecast_result = ARMAResults.get_forecast(steps=n_steps)
# 提取预测值并替换索引
forecast_values = forecast_result.predicted_mean
forecast_values.index = future_dates
  1. 如需提取置信区间:
conf_int = forecast_result.conf_int(alpha=0.05)
conf_int.index = future_dates

方法2:用predict()指定整数位置实现

将日期转换为相对于训练数据结束位置的整数索引:

# 训练数据最后一个位置的索引
train_end = len(df) - 1
# 计算未来日期的总步数
n_future_steps = len(pd.date_range(start='2024-01-01', end='2024-11-09', freq='D'))
# 定义预测的起止整数位置
future_start = train_end + 1
future_end = train_end + n_future_steps
# 执行预测并替换索引
forecast_values = ARMAResults.predict(start=future_start, end=future_end)
forecast_values.index = pd.date_range(start='2024-01-01', end='2024-11-09', freq='D')

关键注意事项

  • 必须保证未来日期序列的频率与原数据集完全一致,否则时间轴会出现不匹配问题。
  • 若原数据集为不规则时间序列,需手动构造符合原数据间隔规律的未来日期列表。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 05:32:40