Является ли ugarchfit / ugarchforecast недетерминированным? - PullRequest
1 голос
/ 02 ноября 2019

Я немного поигрался с приспособлением модели ARIMA-GARCH к историческим данным S & P 500 с 2005 до конца 2008 года. Код в значительной степени основан на книге Майка Холлса-Мура «Продвинутая алгоритмическая торговля». Идея проста. Сначала мы подгоняем модель arma к журналу возвратов за 500 предыдущих дней и выбираем лучшие параметры p, q. Эти параметры задаются в качестве входных данных для модели GARCH с использованием ugarchfit () из библиотеки 'rugarch'. Прогнозы затем делаются с помощью ugarchforecast ().

Проблема, с которой я сталкиваюсь, состоит в том, что выполнение одного и того же кода два раза подряд дает разные прогнозы для примерно 3% дней. Это код, который я использую:

# Import libraries
library(quantmod)
library(lattice)
library(timeSeries)
library(rugarch)

# Get the S&P 500 data
getSymbols("^GSPC", from="2003-01-01")
spReturns = diff(log(Cl(GSPC["2003-01-01/2009"])))
spReturns[as.character(head(index(Cl(GSPC["2003-01-01/2009"])),1))] = 0

# Create a vector of the forecasts
windowLength = 500 # The rolling window used to make the predictions
foreLength = length(spReturns) - windowLength
forecasts <- vector(mode="character", length=1)

# r stands for the rolling window
for (r in 0:foreLength) {
  # We first select the best ARMA model based on the previous days
  spReturnsOffset = spReturns[(1+r):(windowLength+r)]
  final.aic <- Inf
  final.order <- c(0,0,0)
  for (p in 0:5) for (q in 0:5) {
    if (p==0 && q==0) {next}
    arimaFit = tryCatch(arima(spReturnsOffset, order=c(p, 0, q)), error=function(err) FALSE, warning=function(err) FALSE)
    if(!is.logical(arimaFit)) { 
      current.aic <- AIC(arimaFit) 
      if (current.aic < final.aic) {
        final.aic <- current.aic
        final.order <- c(p, 0, q)
        final.arima <- arimaFit
      }
    } else {next}
  }

  # We now do the ARMA-GARCH fitting, where we pass the best ARMA order found above
  spec = ugarchspec(variance.model=list(garchOrder=c(1,1)), mean.model=list(armaOrder=c(final.order[1],final.order[3]),include.mean=T), distribution.model="sged")
  fit = tryCatch(ugarchfit(spec, spReturnsOffset, solver='hybrid'), error=function(e) e, warning=function(w) w)
  # If the fit does not converge, take 0 as our forecast
  if(is(fit, "warning")) {forecasts[r+1] = 0} 
  else {
    fore = ugarchforecast(fit, n.ahead=1)
    forecasts[r+1] = fore@forecast$seriesFor[1]
    }
}

Я запускал код два раза подряд, и оказалось, что некоторые значения в векторе прогнозов были разными между двумя прогонами. В частности, я заметил следующее:

  1. Модель ARMA дала одинаковые параметры (p, q, AIC) для всех точек обоих прогонов.
  2. В прогоне 1 GARCHмодель выдала 32 предупреждения, во втором прогоне - 41 предупреждение. Многие из этих предупреждений происходили в одних и тех же точках данных, однако в общей сложности было 19 предупреждений, которые произошли только в одном из прогонов.
  3. Очевидно, что прогнозы в этих 19 точках данных различались между двумя прогонами. Тем не менее, было еще 10 точек данных, которые дали разные прогнозы. Таким образом, в общей сложности было 29 из 1000 прогнозов, которые отличались между двумя прогонами.
  4. Было 2 дня в прогоне 1 и 4 дня в прогоне 2, при котором прогнозные значения были> 5 (все другие значения<0,02). Любопытно, что в 5 из 6 этих ненормальных прогнозов было предупреждение в другом прогоне (например, прогноз> 5 в прогоне 1, но предупреждение и, следовательно, нет прогноза в прогоне 2).
  5. Случайно, возможнов каждой 1 из 2000 точек данных я получаю сообщение об ошибке: «Ошибка: оператор $ недопустим для атомарных векторов», что останавливает выполнение кода.

Все это поведение довольно загадочномне. Разве одни и те же входные параметры не должны всегда приводить к одинаковым результатам / ошибкам? Есть ли какое-то случайное семя, используемое в ugarchfit?

Может ли это произойти из-за параметра solver = 'hybrid' в ugarchfit? Но опять же, я не уверен, какой другой решатель использовать здесь, и документация очень расплывчата по этому вопросу.

...