Automatic ARMA/GARCH selection in parallel

In the original ARMA/GARCH post I outlined the implementation of the garchSearch function. There have been a few requests for the code so … here it is. Quite easy to use too:


spy = getSymbols("SPY", auto.assign=FALSE)
rets = ROC(Cl(spy), na.pad=FALSE)
fit = garchAuto(rets, cores=8, trace=TRUE)

After the last code line above, fit contains the best (according to the AIC statistic) model, which is the return value of garchFit. The function has reasonable defaults, but also provides controls over various aspects of the model selection – check the code.

The function is called garchAuto, following the naming convention of the fGarch package. In fact, I am trying to get it into the fGarch package, but haven’t heard back yet. There are reasons why I don’t feel too optimistic about this happening, hence, my decision to publish it here.

Last, if you wonder why I abandoned the original garchSearch name, the reason is that a similar function from the forecast package is called auto.arima (“auto”, not “search”).


  1. Alex says:

    Hello, thanks for your code. I have actually already coded ArmaGarchSearch() myself but without distribution choice and without parallel (did not know before – thanks for that). My concern is and it was about the length of the estimation data set. I ve tried from 300 to 1500 and then use this for 1 step forecast. But it does not give same forecasts! Right now I calculate ( without parallel – crazy) indicator for windows 300 and then try to compare performance with respect to length of the windows.
    And another question, my forecast values are of order 10^(-4) ( I guess you have the same) while sd~10^(-3). From statistical point of view there is no use of such prediction. What do you use as a signal for long or short? forecast greater or smaller than zero correspondently?
    And I read some papers, such models’ first use is indeed the simulation and pricing derivatives.
    Thanks in advance,

    1. ivannp says:

      At the end, it’s up to you to decide whether this method is worth using or not, so if you think it’s statistically insignificant – I have no issues. The mean return on GSPC since 1950 is 0.0002849584, in other words, right off the bat we are talking very small numbers. Would it be better if we used percentages instead, i.e. multiplying everything by 100? I don’t think so. You are touching here on a very important issue – how to determine whether a system is useful or not. I have been pondering this for a while, so there might be some posts coming on the topic.

  2. DanSan566 says:

    Hi! Thanks for your great code! I’m trying to fit 28 Stocks with an ARMA+GARCH Model from the Dow Jones. It works perfectly for 25. For three stocks I get as result NULL. I’ve tried to fix and failed… I would like to use your code in my bachelor thesis if its okay for you (I will mention your blog and so forth) Here is my code and maybe you have an idea whats going wrong:
    library(quantmod, quietly = TRUE)
    library(PerformanceAnalytics, quietly = TRUE)

    symbols_dj <- c("MRK" ,"HD", "PG")
    getSymbols(symbols_dj, from = "2000-01-01", to = "2006-12-31")
    data <- xts()
    for(i in seq_along(symbols_dj)) {
    symbol_dj <- symbols_dj[i]
    data <- merge(data, Ad(get(symbol_dj)))
    returns <- Return.calculate(data, method = "log")
    returns[1,] <- 0

    garch_models <- sapply(returns, garchAuto, cores=8, trace=TRUE)

  3. ankc says:

    I’m trying to understand how to use the code, do you just load up quantmod and use the code?
    I’m having trouble understanding what source(“garchAuto.R”) does.

    Can you clear that up for me?


  4. Igor says:

    Dear Ivan,

    thank you for your posts. By reading of your blog I gathered very useful information and I found it very educational.
    At the moment I am studying ARMA, ARCH and GARCH modeling and I found that manual search for best combination of P,Q,p,q lags in ARMA(P,Q) – GARCH(p,q), is time demanding.
    Since my understanding of R and advanced econometrics is limited, I have to ask you some basic and maybe stupid questions:

    1) Does your code find the best number of lags for ARMA(P,Q) and than uses squared residuals to find the best number of lags for GARCH(p,q)?
    I am asking it, because I am doing so when calculating ARMA(P,Q) – GARCH(p,q) manually (using Eviews). I would just like to be sure that what I am doing manually is equal to your approach.

    2) I saw that the heading is “Automatic ARMA/GARCH selection in parallel”. Now my stupid question 🙂 Does it mean that your function performs best choices of lags for ARMA(P,Q) and GARCH(p,q), simultaneously (selection in parallel)? When I am doing it in Eviews, firstly I have to do ARMA(P,Q) and based on residuals (squared) I am applying GARCH(p,q). To sum up, without defined ARMA I can not start GARCH. Does your function uses the same order or something else?

    Thank you for any assistance you can provide.

    Best regards,


Leave a Reply