efficient code for nonlinear garch model

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

efficient code for nonlinear garch model

Miske
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[1]+par[2]*ht[i-1]+par[3]*ht[i-1]*(at[i-1]/sqrt(ht[i-1])-par[4])^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[1]+par[2]*ht[i-1]+par[3]*(at[i-1]-par[4]*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.
Reply | Threaded
Open this post in threaded view
|

Re: efficient code for nonlinear garch model

Patrick Burns-2
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[1]+par[2]*ht[i-1]+par[3]*ht[i-1]*(at[i-1]/sqrt(ht[i-1])-par[4])^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[1]+par[2]*ht[i-1]+par[3]*(at[i-1]-par[4]*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.
Reply | Threaded
Open this post in threaded view
|

Re: efficient code for nonlinear garch model

Ilya Kipnis
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 PM

To: 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[1]+par[2]*ht[i-1]+par[3]*ht[i-1]*(at[i-1]/sqrt(ht[i-1])-par[4])^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[1]+par[2]*ht[i-1]+par[3]*(at[i-1]-par[4]*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.