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

