SARIMAX get_forecast() 未按预期工作

SARIMAX get_forecast() not working as expected

我正在做一个预测股票价格的时间序列分析项目,我在使用 get_forecast() 时遇到问题,而 get_predictions() 工作正常,并且模型拟合成功:

mod = sm.tsa.statespace.SARIMAX(ts_log, order=(1, 1, 1))
results = mod.fit()

print(results.fittedvalues) >>> 输出:观察中所有日期的股票收盘价(最后日期为“2020-05-18”)

然后,当我尝试使用 get_forecast()(参见下面的代码)时,输出的不是前 10 个 'out-of-sample' 预测,而是 returns 10 'in-sample' 预测...

pred2 = results.get_forecast(steps=10)   
pred2_ci = pred2.conf_int()

print(pred2_ci) >>> 输出:从日期“2018-11-26”开始的 10 个 'in-sample' 预测,而不是从日期“2020-05-”开始的 10 个 'out-of-sample' 预测19'....

完整代码在这里(绘图函数和线条除外):

Main = pd.read_csv("StockPrices.csv")
Main1 = Main.drop(['Open', 'High', 'Low', 'Volume', 'Turnover', 'Date'], axis=1)
Main2 = Main1.loc[Main1['Equity'] == 'ABN AMRO Bank']
Main2.set_index('Date2', inplace=True)
Main2.index = pd.DatetimeIndex(Main2.index).to_period('D')
Main2 = Main2.drop(['Equity'], axis=1)
Main["Date2"] = pd.to_datetime(Main["Date"])

ts = Main2['Last']
ts_log = np.log(ts)
moving_avg = pd.Series(ts_log).rolling(12).mean()

ts_log_moving_avg_diff = ts_log - moving_avg
ts_log_moving_avg_diff.dropna(inplace=True)
ts_log_diff = ts_log - ts_log.shift()
ts_log_diff.dropna(inplace=True)

decomposition = seasonal_decompose(ts_log, freq=70)
trend = decomposition.trend
seasonal = decomposition.seasonal
residual = decomposition.resid

ts_log_decompose = residual
ts_log_decompose_pd = pd.Series(ts_log_decompose)
ts_log_decompose_pd.dropna(inplace=True)

lag_acf = acf(ts_log_diff, nlags=20)
lag_pacf = pacf(ts_log_diff, nlags=20, method='ols')

model = ARIMA(ts_log, order=(1, 1, 0))
results_AR = model.fit(disp=-1)

model = ARIMA(ts_log, order=(0, 1, 1))
results_MA = model.fit(disp=-1)

model = ARIMA(ts_log, order=(1, 1, 1))
results_ARIMA = model.fit(disp=-1)

predictions_ARIMA_diff = pd.Series(results_ARIMA.fittedvalues, copy=True)
predictions_ARIMA_diff_cumsum = predictions_ARIMA_diff.cumsum()
predictions_ARIMA_log = pd.Series(ts_log.iloc[0], index=ts_log.index)
predictions_ARIMA_log = predictions_ARIMA_log.add(predictions_ARIMA_diff_cumsum, fill_value=0)
predictions_ARIMA = np.exp(predictions_ARIMA_log)

mod = sm.tsa.statespace.SARIMAX(ts_log, order=(1, 1, 1)) 
results = mod.fit()

pred2 = results.get_forecast(steps=10)
pred2_ci = pred2.conf_int() 

print(pred2_ci) >>> 这是有问题的行:输出给出样本内预测而不是样本外预测,原因不明……

请点击以下链接查看图片,这个问题已经让我抓狂了整整一周,样本于 2020 年 5 月结束,但据称第一个样本外预测是在 2018 年!! !:

enter image description here

enter image description here

enter image description here

这看起来像是一个处理数据的错误,其中的周期索引有间隙。 SARIMAX 可以处理缺失值,所以可以从:

开始
new_index = pd.period_range(ts_log.index[0], ts_log.index[-1], freq=ts_log.index.freq)
ts_log = ts_log.reindex(new_index)

我还认为您希望始终使用 freq='B' 而不是 freq='D',因为股票数据通常仅按工作日频率定义。