[R-SIG-Finance] timout using "evalWithTimeout" in looped rugarch estimation
Johannes Moser
jzmoser at gmail.com
Fri May 9 13:58:34 CEST 2014
Dear all,
I`ve set up a double loop which loops through different GARCH-orders and
ARMA-orders in a rugarch estimation (of several models and error
distributions) and each time writes the AIC and other information into a
data frame.
The resulting data frame should be used for the pre-selection of a
model, which then will be examined manually.
A small part of the model estimation steps using "ugarchfit" take very
long time. So I implemented a timeout function using "evalWithTimeout"
which stops the current estimation step and proceeds with the next step
in the loop and estimates the next model.
The timeout function is wrapped into a "tryCatch" function which assures
thet the loop keeps running after e.g. convergence problems.
A small toy model works fine:
#######################################################################
require('R.utils')
abc <- matrix(NA,10,3)
foo <- function() {
print("Tic");
for (kk in 1:50) {
print(kk);
Sys.sleep(0.1);
}
print("Tac");
}
for (i in 1:10){
ptm <- proc.time()
tryCatch( { abc[i,1] <- evalWithTimeout({foo()} ,timeout=(4+i*0.2)
,onTimeout="silent" )
abc[i,2] <- 1
}
, error = function(x) x)
tt<- proc.time() - ptm
abc[i,3]<-tt[3]
}
abc
#####################################################################
However, in the rugarch setup the "evalWithTimeout" doesn't seem to stop
the "ugarchfit" estimation reliably. E.g. in one instance the recorded
time for a step was 1388.03 seconds even though the limit was set to be
300 seconds. The next example illustrates my setup in a simplified
version (unfortunately my results depend on the data I have used, so you
will not be able to reproduce them):
#####################################################################
require('rugarch')
quiet1 <- read.table( "dax_quiet1.txt" , header=T)
tempdata <- quiet1$logreturns
g_order <- matrix(NA,5,2)
g_order[1,]<-c(1,1)
g_order[2,]<-c(1,8)
g_order[3,]<-c(9,6)
g_order[4,]<-c(9,8)
g_order[5,]<-c(3,10)
overview <- data.frame(matrix(NA,5,2))
for(i in 1:5){
ptm <- proc.time()
spec <- ugarchspec(
variance.model = list(model = "fGARCH", garchOrder =
g_order[i,], submodel = "TGARCH", external.regressors = NULL,
variance.targeting = FALSE),
mean.model = list(armaOrder = c(0,0), external.regressors =
NULL), distribution.model = "sged")
tryCatch( {tempgarch <- evalWithTimeout({ugarchfit(spec=spec,
data=tempdata ,solver="hybrid")} ,timeout=20 ,onTimeout="silent" )
overview[i,1]<-infocriteria(tempgarch)[1]
}
, error = function(x) x)
tt<- proc.time() - ptm
overview[i,2]<-tt[3]
}
overview
# If the timeout is set set to 20, this setup leads to:
# 2.87 sec.
# 6.95 sec.
# 125 sec. ... here, tryCatch interrupted the process
# 51.73 sec.
# 27.11 sec.
# for the 5 different estimation steps.
# timeout set to 300:
# 2.81 sec.
# 6.85 sec.
# 743.58 sec.
# 41.70 sec.
# 26.85 sec.
# no process was interrupted by tryCatch
#######################################################################
As can be seen even from this simplified example, when the timeout was
set to be 20 there still was a process that took 125 seconds (which is
more than 5 times longer!).
I would be very thankful for any ideas or comments!
Best, Johannes
More information about the R-SIG-Finance
mailing list