[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