library("scatterplot3d")

##
## implémentation de la courbe de Nelson-Siegel
##

## Lecture des taux spot
taux <- t(read.table("usgg.csv",header=T, sep=";",na.strings = "#NA")
          [seq(from=1,to=5758,by=30),2:6])
length(taux)
temps <- c(.25,2,3,5,10)

## fonction Nelson-Siegel originale
f0t <- function(PAR,t)
  {
    PAR[1] + (PAR[2]+PAR[3]*t)*exp(-PAR[4]*t)
  }

## fonction objectif
f0obj <- function(PAR,temps,taux)
  {
    sum((taux-f0t(PAR,temps))^2)
  }

## fonction qui retourne les paramètres
NelsonSiegel <- function(taux,temps)
  {
    m1 <- optim(c(1,1,1,1),f0obj,gr=NULL,temps,taux)
    m1$par
  }

## dimensions pour le graphique
duration <- seq(from=0,to=12,by=0.1)
timeline <- 1:dim(taux)[2]

## calcul des paramètres pour chaque courbe
parametres <- apply(taux,2,NelsonSiegel,temps)

## calcul des points du graphique
pointsgraph <- cbind(rep(timeline,each=length(duration)),duration,
                     as.vector(apply(parametres,2,f0t,duration)))

## tracer le graphique
pdf("nelsonsiegel-plots.pdf")
scatterplot3d(pointsgraph,type="l", pch=20,
              xlab="Observations",
              ylab="Duration(t)", zlab="r(t)")
plot(pointsgraph[pointsgraph[,1]==1,][,-1],type="l",main="Temps 1",
     xlab="Duration (t)",
     ylab="r(t)",ylim=c(0,10))
points(temps,taux[,1])
plot(pointsgraph[pointsgraph[,1]==61,][,-1],type="l",main="Temps 61",
     xlab="Duration (t)",
     ylab="r(t)",ylim=c(0,10))
points(temps,taux[,61])
plot(pointsgraph[pointsgraph[,1]==121,][,-1],type="l",main="Temps 121",
     xlab="Duration (t)",
     ylab="r(t)",ylim=c(0,10))
points(temps,taux[,121])
plot(pointsgraph[pointsgraph[,1]==181,][,-1],type="l",main="Temps 181",
     xlab="Duration (t)",
     ylab="r(t)",ylim=c(0,10))
points(temps,taux[,181])
dev.off()
