I have been trying to build my own GARCH(1,1) model. However the solvers I have used so far have either failed to return the optimized parameters or taking way too long to optimize (maybe not converging?). So far I have tried optim() (with Nelder-Mead & BFGS), nlm() with no success. I have included my code with the "solnp" optimizer which is actually used in the "rugarch" package as well.Thought that might solve the issue, however it didn't. Would really appreciate if someone can point out where I am making mistakes. Thanks!
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 & 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