# efficient code for nonlinear garch model Classic List Threaded 3 messages Open this post in threaded view
|

## efficient code for nonlinear garch model

 Hi, I'm trying to think of efficient code for NGARCH model, sigma[t]^2=omega + alpha*(R[t-1]-theta*sigma[t-1])^2 + beta*(sigma[t-1)]^2 from book (Elements of Financial Risk Menagment-Peter F Christoffersen page 77). I already coded it the "usual way" but it's taking too long (around 30 s). Now I'm trying somehow to implement -filter- function like in paper - Parameter Estimation of ARMA Models with GARCH/APARCH Errors An R and SPlus Software Implementation - page 6. The problem I can't overcome is that in this model I can't figure out how to present the middle part ( 2 * Alpha * R[t-1]*theta*sigma[t-1]) with filter function or is it even possible to code it this way. Any help would appreciated.Here is my slower code: "Ngarch" <- function(rtn,value){   # Estimation of a non-symmertic GARCH, NGARCH(1,1), model.   # Assume normal innovations   # rtn: return series   #   # The likelihood function "mxlk" can be modified to fit more general NGARCH   #  models.   # obtain initial estimates   rtn=as.matrix(rtn)   mu=mean(rtn)   par=c(0.0001,0.8,0.01,0.7)   #   mxlk <- function(par){     mxlk=0     ht=var(rtn)     T=length(rtn)     if(T > 40)ht=var(rtn[1:40])     at=rtn-mu     for (i in 2:T){ sig2t=par+par*ht[i-1]+par*ht[i-1]*(at[i-1]/sqrt(ht[i-1])-par)^2       ht[i]=sig2t       mxlk=mxlk+0.5*(log(sig2t) + (at[i])^2/ht[i])     }     mxlk   }   low=c(1e-6,1e-6,1e-6,1e-6)   upp=c(100*var(rtn),1-1e-6,1-1e-6,5)   mm=optim(par,mxlk,method="Nelder-Mead",hessian=T)   #mm=nlminb(par,mxlk,hessian=T,scale=1,lower=low,upper=upp)   #mm=optimx(par,mxlk,method="L-BFGS-B",hessian=T,lower=low,upper=upp)   ## Print the results   par=mm\$par   H=mm\$hessian   Hi = solve(H)   cat(" ","\n")   cat("Estimation results of NGARCH(1,1) model:","\n")   cat("estimates: ",par,"\n")   se=sqrt(diag(Hi))   cat("std.errors: ",se,"\n")   tra=par/se   cat("t-ratio: ",tra,"\n")   # compute the volatility series and residuals   ht=var(rtn)   T=length(rtn)   if(T > 40)ht=var(rtn[1:40])   at=rtn-mu   for (i in 2:T){     sig2t=par+par*ht[i-1]+par*(at[i-1]-par*sqrt(ht[i-1]))^2     ht=c(ht,sig2t)   }   sigma.t=sqrt(ht)   Ngarch <- as.matrix(cbind(as.numeric(at),as.numeric(sigma.t)))   colnames(Ngarch)=c("residuals","volatility")   Ngarch } I think that Alexios has this function in his package (called NAGARCH) but I need to code this myself for my master work. I already implemented (read ported) his ugarch function in mathematica wolfram and it's working great.         [[alternative HTML version deleted]] _______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance-- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.
 In reply to this post by Miske As someone who has come across this time and again in regards to John Ehlers, my recommendation is to compute any non-adoptive coefficients then go into Rcpp. Sent from my T-Mobile 4G LTE device  ------ Original message------ From: Patrick Burns Date: Wed, 4/30/2014 6:42 PMTo: Milos Cipovic;[hidden email];Subject:Re: [R-SIG-Finance] efficient code for nonlinear garch model ```It should be easy enough to use 'Rcpp' to write the likelihood in C++ and gain a bunch of speed. Pat On 30/04/2014 20:21, Milos Cipovic wrote: > Hi, > I'm trying to think of efficient code for NGARCH model, > sigma[t]^2=omega + alpha*(R[t-1]-theta*sigma[t-1])^2 + beta*(sigma[t-1)]^2 > from book (Elements of Financial Risk Menagment-Peter F Christoffersen page > 77). > > I already coded it the "usual way" but it's taking too long (around 30 s). > Now I'm trying somehow to implement -filter- function like in paper - > Parameter Estimation of ARMA Models with > GARCH/APARCH Errors An R and SPlus Software Implementation - page 6. > The problem I can't overcome is that in this model I can't figure out how > to present the middle part ( 2 * Alpha * R[t-1]*theta*sigma[t-1]) with > filter function or is it even possible to code it this way. > > Any help would appreciated.Here is my slower code: > > "Ngarch" <- function(rtn,value){ >    # Estimation of a non-symmertic GARCH, NGARCH(1,1), model. >    # Assume normal innovations >    # rtn: return series >    # >    # The likelihood function "mxlk" can be modified to fit more general > NGARCH >    #  models. >    # obtain initial estimates >    rtn=as.matrix(rtn) >    mu=mean(rtn) >    par=c(0.0001,0.8,0.01,0.7) >    # >    mxlk <- function(par){ >      mxlk=0 >      ht=var(rtn) >      T=length(rtn) >      if(T > 40)ht=var(rtn[1:40]) >      at=rtn-mu >      for (i in 2:T){ > > sig2t=par+par*ht[i-1]+par*ht[i-1]*(at[i-1]/sqrt(ht[i-1])-par)^2 >        ht[i]=sig2t >        mxlk=mxlk+0.5*(log(sig2t) + (at[i])^2/ht[i]) >      } >      mxlk >    } > >    low=c(1e-6,1e-6,1e-6,1e-6) >    upp=c(100*var(rtn),1-1e-6,1-1e-6,5) >    mm=optim(par,mxlk,method="Nelder-Mead",hessian=T) >    #mm=nlminb(par,mxlk,hessian=T,scale=1,lower=low,upper=upp) >    #mm=optimx(par,mxlk,method="L-BFGS-B",hessian=T,lower=low,upper=upp) >    ## Print the results >    par=mm\$par >    H=mm\$hessian >    Hi = solve(H) >    cat(" ","\n") >    cat("Estimation results of NGARCH(1,1) model:","\n") >    cat("estimates: ",par,"\n") >    se=sqrt(diag(Hi)) >    cat("std.errors: ",se,"\n") >    tra=par/se >    cat("t-ratio: ",tra,"\n") >    # compute the volatility series and residuals > >    ht=var(rtn) >    T=length(rtn) >    if(T > 40)ht=var(rtn[1:40]) >    at=rtn-mu >    for (i in 2:T){ >      sig2t=par+par*ht[i-1]+par*(at[i-1]-par*sqrt(ht[i-1]))^2 >      ht=c(ht,sig2t) >    } >    sigma.t=sqrt(ht) >    Ngarch <- as.matrix(cbind(as.numeric(at),as.numeric(sigma.t))) >    colnames(Ngarch)=c("residuals","volatility") >    Ngarch > } > > > > > I think that Alexios has this function in his package (called NAGARCH) but > I need to code this myself for my master work. > I already implemented (read ported) his ugarch function in mathematica > wolfram and it's working great. > > [[alternative HTML version deleted]] > > _______________________________________________ > [hidden email] mailing list > https://stat.ethz.ch/mailman/listinfo/r-sig-finance > -- Subscriber-posting only. If you want to post, subscribe first. > -- Also note that this is not the r-help list where general R questions should go. > -- Patrick Burns [hidden email] http://www.burns-stat.com http://www.portfolioprobe.com/blog twitter: @burnsstat @portfolioprobe _______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance -- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go. ```_______________________________________________ [hidden email] mailing list https://stat.ethz.ch/mailman/listinfo/r-sig-finance-- Subscriber-posting only. If you want to post, subscribe first. -- Also note that this is not the r-help list where general R questions should go.