coursdirige-tauxinterets/gmm.r
2013-11-02 15:47:28 -04:00

299 lines
8.6 KiB
R
Executable file

## general methods of moments (GMM)
library(MASS)
MMGpoidsNW <- function(param,modele)
{
donnees <- modele$donnees
q <- modele$q
donneesF <- donnees[-1]
donneesL <- donnees[-length(donnees)]
deltaTemps <- modele$deltaTemps
a <- param[1]
b <- param[2]
Gamma <- array(0,c(4,4,q+1))
if(modele$nomModele=="CKLS")
{
sigma <- param[3]
gamma <- param[4]
g1t <- donneesF - a - b * donneesL
g2t <- (donneesF - a - b * donneesL) ^ 2 - sigma^2 * donneesL ^ (2*gamma) *
deltaTemps
g3t <- (donneesF - a - b * donneesL) * donneesL
g4t <- ((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * donneesL ^ (2*gamma) *
deltaTemps) * donneesL
}
if(modele$nomModele=="CIR")
{
sigma <- param[3]
g1t <- donneesF - a - b * donneesL
g2t <- (donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * donneesL * deltaTemps
g3t <- (donneesF - a - b * donneesL) * donneesL
g4t <- ((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * donneesL * deltaTemps) *
donneesL
}
if(modele$nomModele=="Vasicek")
{
sigma <- param[3]
g1t <- donneesF - a - b * donneesL
g2t <- (donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * deltaTemps
g3t <- (donneesF - a - b * donneesL) * donneesL
g4t <- ((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * deltaTemps) * donneesL
}
gt <- cbind(g1t,g2t,g3t,g4t)
n <- length(g1t)
## en attendant
#W <- solve(cov(gt))
## Newey-West
gtc <- apply(gt,2,function(x) x-mean(x))
for(v in 0:q)
{
gtF <- gtc[(1+v):n,]
gtL <- gtc[1:(n-v),]
Gamma[,,(v+1)] <- t(gtF) %*% gtL / n
}
S <- Gamma[,,1]
for(v in 1:q)
{
Snext <- (1-v/(q+1)) * (Gamma[,,v+1] + t(Gamma[,,v+1]))
S <- S+Snext
}
W <- ginv(S)
}
MomentsJacobien <- function(param, modele)
{
donnees <- modele$donnees
donneesF <- donnees[-1]
donneesL <- donnees[-length(donnees)]
n <- length(donneesL)
deltaTemps <- modele$deltaTemps
if(modele$nomModele=="CKLS")
{
a <- param[1]
b <- param[2]
sigma <- param[3]
gamma <- param[4]
g1a <- -n
g2a <- -2*sum(donneesF - a - b*donneesL)
g3a <- -sum(donneesL)
g4a <- -2*sum((donneesF - a - b*donneesL)*donneesL)
g1b <- -sum(donneesL)
g2b <- -2*sum((donneesF - a - b*donneesL)*donneesL)
g3b <- -sum(donneesL^2)
g4b <- -2*sum((donneesF - a - b*donneesL)*donneesL^2)
g1s <- 0
g2s <- -deltaTemps*sum(donneesL^(2*gamma))
g3s <- 0
g4s <- -deltaTemps*sum(donneesL^(2*gamma+1))
g1g <- 0
g2g <- -2*sigma^2*deltaTemps*sum(log(donneesL)*donneesL^(2*gamma))
g3g <- 0
g4g <- -2*sigma^2*deltaTemps*sum(log(donneesL)*donneesL^(2*gamma+1))
d <- cbind(c(g1a, g1b, g1s, g1g),
c(g2a, g2b, g2s, g2g),
c(g3a, g3b, g3s, g3g),
c(g4a, g4b, g4s, g4g))/n
}
if(modele$nomModele=="CIR")
{
a <- param[1]
b <- param[2]
g1a <- -n
g2a <- -2*sum(donneesF - a - b*donneesL)
g3a <- -sum(donneesL)
g4a <- -2*sum((donneesF - a - b*donneesL)*donneesL)
g1b <- -sum(donneesL)
g2b <- -2*sum((donneesF - a - b*donneesL)*donneesL)
g3b <- -sum(donneesL^2)
g4b <- -2*sum((donneesF - a - b*donneesL)*donneesL^2)
g1s <- 0
g2s <- -sum(deltaTemps*donneesL)
g3s <- 0
g4s <- -sum(deltaTemps*donneesL*donneesL)
d <- cbind(c(g1a, g1b, g1s),
c(g2a, g2b, g2s),
c(g3a, g3b, g3s),
c(g4a, g4b, g4s))/n
}
if(modele$nomModele=="Vasicek")
{
a <- param[1]
b <- param[2]
g1a <- -n
g2a <- -2*sum(donneesF - a - b*donneesL)
g3a <- -sum(donneesL)
g4a <- -2*sum((donneesF - a - b*donneesL)*donneesL)
g1b <- -sum(donneesL)
g2b <- -2*sum((donneesF - a - b*donneesL)*donneesL)
g3b <- -sum(donneesL^2)
g4b <- -2*sum((donneesF - a - b*donneesL)*donneesL^2)
g1s <- 0
g2s <- -deltaTemps*n
g3s <- 0
g4s <- -sum(deltaTemps*donneesL)
d <- cbind(c(g1a, g1b, g1s),
c(g2a, g2b, g2s),
c(g3a, g3b, g3s),
c(g4a, g4b, g4s))/n
}
d
}
MMGobjectif<- function(param, modele, W)
{
donnees <- modele$donnees
donneesF <- donnees[-1]
donneesL <- donnees[-length(donnees)]
n <- length(donnees)-2
deltaTemps <- modele$deltaTemps
a <- param[1]
b <- param[2]
if(modele$nomModele=="CKLS")
{
sigma <- param[3]
gamma <- param[4]
g1 <- sum(donneesF - a - b * donneesL)
g2 <- sum((donneesF - a - b * donneesL) ^ 2 - sigma^2 * donneesL ^ (2*gamma) *
deltaTemps)
g3 <- sum((donneesF - a - b * donneesL) * donneesL)
g4 <- sum(((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * donneesL ^ (2*gamma) *
deltaTemps) * donneesL )
}
if(modele$nomModele=="CIR")
{
sigma <- param[3]
g1 <- sum(donneesF - a - b * donneesL)
g2 <- sum((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * donneesL * deltaTemps)
g3 <- sum((donneesF - a - b * donneesL) * donneesL)
g4 <- sum(((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * donneesL * deltaTemps)*
donneesL)
}
if(modele$nomModele=="Vasicek")
{
sigma <- param[3]
g1 <- sum(donneesF - a - b * donneesL)
g2 <- sum((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * deltaTemps)
g3 <- sum((donneesF - a - b * donneesL) * donneesL)
g4 <- sum(((donneesF - a - b * donneesL) ^ 2 - sigma ^ 2 * deltaTemps) *
donneesL)
}
g <- c(g1,g2,g3,g4)/n
t(g) %*% W %*% g
}
MMGestimation <- function(modele)
{
deltaTemps <- modele$deltaTemps
## paramètres initiaux
if(modele$nomModele=="CKLS")
{
alpha <- 0.5
beta <- -0.5
sigma <- 0.5
gamma <- 0.5
a <- alpha * deltaTemps
b <- beta * deltaTemps + 1
Initialparam <- c(a,b,sigma,gamma)
}
if(modele$nomModele=="CIR" || modele$nomModele=="Vasicek")
{
alpha <- 0.5
beta <- -0.5
sigma <- 0.5
a <- alpha * deltaTemps
b <- beta * deltaTemps + 1
Initialparam <- c(a,b,sigma)
}
## Première étape avec matrice identité
W <- diag(4)
estim <- nlminb(Initialparam,MMGobjectif,gr=NULL,hessian=NULL,modele,W)
param <- estim$par
Fval <- estim$objective
Exitflag <- estim$convergence
if(modele$nomModele=="CKLS")
{
Ralpha <- estim$par[1] / deltaTemps
Rbeta <- (estim$par[2] - 1) / deltaTemps
Rsigma2 <- estim$par[3] ^ 2
Rgamma <- estim$par[4]
}
if(modele$nomModele=="CIR")
{
Ralpha <- estim$par[1] / deltaTemps
Rbeta <- (estim$par[2] - 1) / deltaTemps
Rsigma2 <- estim$par[3] ^ 2
Rgamma <- 0.5
}
if(modele$nomModele=="Vasicek")
{
Ralpha <- estim$par[1] / deltaTemps
Rbeta <- (estim$par[2] - 1) / deltaTemps
Rsigma2 <- estim$par[3] ^ 2
Rgamma <- 0
}
## Seconde étape avec matrice W
if(modele$Iterations>0)
{
for (i in 1:modele$Iterations)
{
Initialparam <- param
W <- MMGpoidsNW(param, modele)
estim <- nlminb(Initialparam,MMGobjectif,gr=NULL,hessian=NULL,modele,W)
param <- estim$par
Fval <- estim$objective
Exitflag <- estim$convergence
if(modele$nomModele=="CKLS")
{
Ralpha <- estim$par[1] / deltaTemps
Rbeta <- (estim$par[2] - 1) / deltaTemps
Rsigma2 <- estim$par[3] ^ 2
Rgamma <- estim$par[4]
}
if(modele$nomModele=="CIR")
{
Ralpha <- estim$par[1] / deltaTemps
Rbeta <- (estim$par[2] - 1) / deltaTemps
Rsigma2 <- estim$par[3] ^ 2
Rgamma <- 0.5
}
if(modele$nomModele=="Vasicek")
{
Ralpha <- estim$par[1] / deltaTemps
Rbeta <- (estim$par[2] - 1) / deltaTemps
Rsigma2 <- estim$par[3] ^ 2
Rgamma <- 0
}
}
}
## Statistique T
n <- length(modele$donnees)-1
d <- MomentsJacobien(param,modele)
Varparam <- ginv(d %*% W %*% t(d))
Tstat <- solve(chol(Varparam),param)/sqrt(n)
Tpvalue <- 1-pt(Tstat,n-length(param))
list(Tstat=Tstat,Tpvalue=Tpvalue,
Varparam=Varparam,param = c(Ralpha,Rbeta,Rsigma2,Rgamma), Fval=Fval,
Exitflag=Exitflag)
}