尝试最大化 GARCH(1,1) 时 Optim() 花费的时间太长
Optim() taking too long when trying to maximize GARCH(1,1)
我一直在尝试构建自己的 GARCH(1,1) 模型。然而,到目前为止我使用的求解器要么未能 return 优化参数,要么优化时间太长(可能没有收敛?)。到目前为止,我已经尝试过 optim()(使用 Nelder-Mead 和 BFGS)、nlm() 但没有成功。我已经将我的代码包含在 "solnp" 优化器中,它实际上在 "rugarch" 包中用作 well.Thought 可能会解决问题,但它没有。如果有人能指出我犯错的地方,我将不胜感激。谢谢!
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
当我要求函数打印参数时,我建议重新访问您的模型,例如
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 结果。我知道这不能回答你的问题,但为了获得优化代码的帮助,它应该能够首先找到解决方案。
我一直在尝试构建自己的 GARCH(1,1) 模型。然而,到目前为止我使用的求解器要么未能 return 优化参数,要么优化时间太长(可能没有收敛?)。到目前为止,我已经尝试过 optim()(使用 Nelder-Mead 和 BFGS)、nlm() 但没有成功。我已经将我的代码包含在 "solnp" 优化器中,它实际上在 "rugarch" 包中用作 well.Thought 可能会解决问题,但它没有。如果有人能指出我犯错的地方,我将不胜感激。谢谢!
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
当我要求函数打印参数时,我建议重新访问您的模型,例如
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 结果。我知道这不能回答你的问题,但为了获得优化代码的帮助,它应该能够首先找到解决方案。