在 ARIMA 模型中模拟季节性的傅里叶项

机器算法验证 时间序列 有马 傅里叶变换
2022-04-02 15:26:43

我想使用傅立叶项来模拟 ARIMA 模型中的季节性。使用傅立叶项而不是季节性 ARIMA 模型的原因是时间序列的频率非常高(672),并且我想对一些特殊的日子进行建模,就好像它们是不同的工作日一样(例如,我想将复活节星期一视为如果是星期天)。我最初想通过使用季节性假人来做到这一点,但 671 个季节性假人可能太多了。因此,我想使用傅里叶项,我会针对特殊日子进行调整以获得正确的回归量。

现在,我有两个问题:

  1. 有人对在 ARIMA 模型中使用傅立叶项作为回归量有很好的参考吗?我只找到博客之类的在线参考资料(例如http://robjhyndman.com/hyndsight/dailydata/),但没有我可以引用的论文或书籍。
  2. 有人对这种方法是否有用有意见吗?

注意:我必须使用 ARIMA 模型,所以我不需要有关替代方法的建议。

2个回答
  1. 在我看来,这种方法足够直观,很多人一定看过它,但我也无法在我的 bib 文件中找到有用的参考。在International Journal of Forecasting (IJF)上搜索“Fourier ARIMA”或类似内容不会产生任何非常有用的信息。Ludlow & Enders (2000, IJF )确实结合了 ARIMA 和傅立叶项,但不像您想象的那样作为回归量。

    在 Google Scholar 上进行类似的搜索会发现几千个您需要改进的点击量。这篇较旧的论文似乎使用了这种方法(所以它至少已经存在了 30 年),但我不确定你是否想引用它。

  2. 我想说这种方法非常有用。Rob Hyndman似乎同意:用长季节进行预测和每周数据预测我看到您必须使用 ARIMA 模型(为什么?),但请注意他写道 TBATS 的性能相当好。Rob最近对forecast软件包的更新也很重要。

    (不要忽视这些,因为它们“只是博客条目” 。Rob Hyndman是预测大师之一,在社区中非常活跃,并且是IJF的主编。我更相信他写的任何东西其他人在期刊上发表。)

也许你可以看看这个https://medium.com/intive-developers/forecasting-time-series-with-multiple-seasonalities-using-tbats-in-python-398a00ac0e8a

本文将 tbats 和 SARIMAX 与傅立叶项进行了比较。

你的问题的答案:

带有傅立叶项的 SARIMAX 可以应用一个技巧 [4] 来利用 SARIMAX 中的外生变量来模拟具有傅立叶项的附加季节性。我们将继续使用 SARIMA 的季节性部分对每周模式进行建模。对于年度季节性模式,我们将使用上述技巧。我比较了傅立叶项数的多种选择,其中 2 提供了最准确的预测。因此,我们将使用 2 个傅立叶项作为外生变量。

# prepare Fourier terms
exog = pd.DataFrame({'date': y.index})
exog = exog.set_index(pd.PeriodIndex(exog['date'], freq='D'))
exog['sin365'] = np.sin(2 * np.pi * exog.index.dayofyear / 365.25)
exog['cos365'] = np.cos(2 * np.pi * exog.index.dayofyear / 365.25)
exog['sin365_2'] = np.sin(4 * np.pi * exog.index.dayofyear / 365.25)
exog['cos365_2'] = np.cos(4 * np.pi * exog.index.dayofyear / 365.25)
exog = exog.drop(columns=['date'])
exog_to_train = exog.iloc[:(len(y)-365)]
exog_to_test = exog.iloc[(len(y)-365):]
# Fit model
arima_exog_model = auto_arima(y=y_to_train, exogenous=exog_to_train, seasonal=True, m=7)
# Forecast
y_arima_exog_forecast = arima_exog_model.predict(n_periods=365, exogenous=exog_to_test)