##                                        
## maximum de vraisemblance avec Vasicek
##                                       
library("xtable")

## importation des données
data <- read.csv("usgg.csv",header=TRUE, sep=";")[(1:50)*30,]
delta <- 1/12
rf <- data$usgg3m/100
rf[which(rf<=0)] <- 0.001

##
## graphique quantile quantile
##
pdf("MLE-qqplot-norm.pdf")
qqnorm(diff(rf))
qqline
dev.off()

## fonction objectif de log-vraisemblance négatif

VASICEK.FUNOBJ <- function(PAR,RF,DELTA)
  {
    mu <- PAR[2]
    alpha <- PAR[1]
    sigma <- PAR[3]
    n <- length(RF)
    moyenne <- RF[-n] * exp(-alpha*delta)+mu*(1-exp(-alpha*delta))
    variance <- sigma^2 * (1-exp(-2*alpha*delta)) / (2*alpha)
    -sum(dnorm(RF[-1],moyenne,sqrt(variance),log=TRUE))
  }

ES1 <- optim(c(.5,-.5,.5),fn=VASICEK.FUNOBJ,RF=rf,DELTA=delta)

##                                        
## maximum de vraisemblance avec CIR (quasi-vraisemblance normale)
##

CIR.QV.FUNOBJ <- function(PAR,RF,DELTA)
  {
    mu <- PAR[2]
    alpha <- PAR[1]
    sigma <- PAR[3]
    n <- length(RF)
    moyenne <- RF[-n] * exp(-alpha * DELTA) +
      mu * (1-exp(-alpha * DELTA))
    variance <- RF[-n] * sigma^2/alpha * (exp(-alpha * DELTA) - exp(-2*alpha * DELTA)) +
      mu * sigma^2/2/alpha*(1-exp(-alpha * DELTA))^2
    -sum(dnorm(RF[-1],moyenne,sqrt(variance),log=TRUE))
  }

ES3 <- optim(c(alpha.st,mu.st,sigma.st),fn=CIR.QV.FUNOBJ,RF=rf,DELTA=delta)

##
## sorties
##
ES1$par[3] <- ES1$par[3]^2
ES3$par[3] <- ES3$par[3]^2

sink("MLE-dates.tex",append=FALSE,split=FALSE)
as.vector(data$date[c(1,length(data$date))])
sink()

sink("MLE-param.tex",append=FALSE,split=FALSE)
  xtable(cbind(Param=c("alpha","mu","sigma"),
               Vasicek=ES1$par,CIR.QL=ES3$par),
         caption="Paramètres estimés par maximum de vraisemblance pour 2 modèles",
         label="tab:estimParam")
sink()

ES1$par
ES3$par

##
## test de ratio de vraisemblance
##

loglik <- c(ES1$value,ES3$value)
n <- length(rf)-1

1-pchisq(-2*n*(loglik[2]-loglik[1]),4)
