Optim() занимает слишком много времени при попытке максимизировать GARCH (1,1)

#r #optimization #finance #solver #volatility

#r #оптимизация #финансы #решатель #волатильность

Вопрос:

Я пытался создать свою собственную модель GARCH (1,1). Однако решатели, которые я использовал до сих пор, либо не смогли вернуть оптимизированные параметры, либо слишком долго оптимизировались (возможно, не сходятся?). До сих пор я пробовал optim() (с Nelder-Mead amp; BFGS), nlm() безрезультатно. Я включил свой код с оптимизатором «solnp», который фактически также используется в пакете «rugarch».Думал, что это может решить проблему, однако это не так. Был бы очень признателен, если бы кто-нибудь указал, где я допускаю ошибки. Спасибо!

 library(tseries)
library(zoo)
AAPL <-get.hist.quote(instrument = "AAPL",
               start = "2015-09-15",
               end = "2016-09-14",
               quote = "AdjClose",
               retclass = "zoo",
               quiet = TRUE)

garch_likelihood <- function(asset,fixed=c(FALSE,FALSE,FALSE)) {
            pars <- fixed
            function(p) {
                    pars[!fixed] <- p  
                    omega <- pars[1]
                    alpha <- pars[2]
                    beta <- pars[3]
    #constructor function
            # object must be a time series class
            if (class(asset) !="zoo")
            stop("asset must be a time series object!!")
            # Calculating log returns
            r <- log(asset)-log(lag(asset,-1))
            #calculating squared returns amp; variance
            r2 <- r^2
            variance.r <- var(r,na.rm = TRUE)
            # Setting up the initial model 
            mod.pregarch <- cbind(r2,variance.r)
            mod.pregarch[2:nrow(mod.pregarch),2] <- 0

    # Using a loop to calculate the conditional variances
    for (i in 2:nrow(mod.pregarch)) {
    # pregarch model: var(t 1) = omega alpha*r(t)^2 beta*var(t)
    mod.pregarch[i,2] <- omega  alpha*mod.pregarch[i-1,1] beta*mod.pregarch[i-1,2]}
    pregarch <-mod.pregarch[,2]
    sum(pregarch)
    pregarch <- cbind(pregarch,rep(0,length(pregarch)))
    #calculating log likelihoods
    for (i in 1:nrow(pregarch)){
    pregarch[i,2] <-  dnorm(r[i,1],mean = 0,sd = sqrt(pregarch[i,1]),log = TRUE)
    }
    ## Loglike.alternative <- -.5*log(2*pi)-.5*log(pregarch[i,1])-.5*(r2[i]/pregarch[[i,1]])
    sum_log.like <- sum(pregarch[,2])
            sum_log.like
            }
            }
pars <- c(0.000005,0.10,0.85) #initial values
garch11.ML <- garch_likelihood(AAPL)
library(Rsolnp)
optim_garch <- solnp(pars =pars,fun = garch11.ML) #Rsolnp solver package
  

Ответ №1:

Я бы посоветовал повторно посетить вашу модель, когда я попрошу функцию распечатать параметры, например

 garch_likelihood <- function(asset,fixed=c(FALSE,FALSE,FALSE)) {
        pars <- fixed
        function(p) {
        print(p)
...}
  

Параметры выглядят в правильном диапазоне следующим образом.

 [1] 0.0000781018 0.0672768675 0.6338644923
[1] 5.796055e-05 6.020388e-02 7.161618e-01
  

Я также использовал optim со следующим вызовом,

 optim_garch <- optim(par =pars ,fn = garch11.ML, control =list(fnscale = -1))
  

Я также получаю следующие предупреждения ()

 warnings()
1: In sqrt(pregarch[i, 1]) : NaNs produced
  

Я не знаком с этой моделью, но если у вас есть представление о границах ваших параметров, вы можете наказать за то, когда параметры приближаются к, чтобы избежать получения результатов NaN. Я знаю, что это не отвечает на ваш вопрос, но для того, чтобы получить помощь в оптимизации вашего кода, он должен быть в состоянии сначала найти решение.