WOW !! MUCH LOVE ! SO WORLD PEACE !
Fond bitcoin pour l'amélioration du site: 1memzGeKS7CB3ECNkzSn2qHwxU6NZoJ8o
  Dogecoin (tips/pourboires): DCLoo9Dd4qECqpMLurdgGnaoqbftj16Nvp


Home | Publier un mémoire | Une page au hasard

 > 

Simulation de modèles de diffusion appliqués aux taux d'intérêts

( Télécharger le fichier original )
par Mohamed Adel BOUATTA
Université des sciences et de la technologie Houari Boumédiene - Master en mathématique financière 2012
  

précédent sommaire suivant

Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy

Chapitre 5

Conclusion générale

Nous avons tout au long de ce mémoire intitulé "Simulation de modèles de diffusion appliqués aux taux d'intérêts" proposé des algorithmes de simulation de processus de diffusion appliquées aux taux d'intérêts ainsi que leurs programmes de simulation sous le logiciel R.

R est un langage de programmation et un environnement mathématique utilisé pour le traitement de données et l'analyse statistique. C'est un projet GNU fondé sur le langage S et sur l'environnement développé dans les laboratoires Bell par John Chambers et ses collègues.

R est considéré par ses créateurs comme étant une exécution de S, avec la sémantique dérivée du langage Scheme. R est un logiciel libre distribué selon les termes de la licence GNU GPL et est disponible sous GNU/Linux, FreeBSD, NetBSD, OpenBSD, Mac OS X et Windows. R représente aujourd'hui l'un des objectifs techniques majeurs de la communauté hacker GNU1.

Les processus stochastiques de taux que nous avons étudié sont le modèle de Vasicek, le modéle de Cox, Ingersoll & Ross ainsi que le modèle de Vasicek a 2 facteurs, qui sont les modèles les plus utilisés pour la dynamique des taux d'intérêts.

Des programmes en R pour la simulation du processus d'Orstein-Uhlenbeck exponentiel ainsi que les modèles de Heston et d'Eraker ont été ajoutés et proposés au lecteur.

Nous espérons avoir atteint l'objectif fixé, a savoir initier le lecteur a la simulation des processus de diffusion appliqués aux taux d'intérêts par l'utilisation de l'outil informatique.

Chapitre 6

Annexes

6.1 Annexe I : Programmes en R

6.1.1 Code R pour simulation d'un mouvement brownien standard

SimulationBrownien<-function(n){

# n ... nombre de simulations

temps = seq(0,1,length=n+1) ## discretisation du temps

pas.temps = 1/n

B.acc = rnorm(n,sd=sqrt(pas.temps)) ## Simulation des accroissements B.sim = c(0,cumsum(B.acc))} ## Simulation d'une trajectoire

6.1.2 Code R pour simulation de 30 trajectoires d'un mouvement brownien

SimulTrajectoires<-function(n.sim,n.point){ # n.sim ... nombre de simulation

# n.point ... points de discrétisation

temps = seq(0,1,length=n.point)

pas.temps = 1/(n.point-1)

B.acc = matrix(rnorm((n.point-1)*n.sim,sd=sqrt(pas.temps)),nrow=n.sim) B.sim = matrix(NA,ncol=n.point,nrow=n.sim)

for (i in 1 :n.sim)

{B.sim[i,] = c(0,cumsum(B.acc[i,]))}

B.mean = apply(B.sim,2,mean)} ## apply calcule la moyenne pour chaque colonne

6.1.3 Code R pour covariance empirique du mouvement brownien

B.cov.emp = cov(B.sim) ## estimation de la matrice de variance-covariance image(temps, temps, B.cov.emp,col=terrain.colors(20),xlab="temps",ylab="temps", main="Covariance empirique du mouvement Brownien")

contour(temps, temps,B.cov.emp, add=TRUE)

6.1.4 Code R pour simulation d'une marche aléatoire

SimulationRandomWalk<-function(n){

# n ... nombre de simulations

temps = seq(0,1,length=n-l-1) ## discretisation du temps

pas.temps = 1/n

M.tr = runif(30,-1,1)

M.sim = c(0,cumsum(M.tr))}

6.1.5 Code R pour simulation d'un mouvement brownien de dimension 2

SimulBrowDim2<-function(n,rho){

# n ... nombre de simulations

# rho ... coéffi cientde corrélation

R<-matrix(c(1 ,rho,rho,1),nrow=2) ## Matrice des Corrélation

L<- t(chol(R)) ## decomposition de Cholesky

Z<- matrix(rnorm(n*2),nrow=2)

Z<- L%*%Z ## variables aléatoires corrélées

Z2=t(Z) ## transposé de la matrice Z pas.temps = 1/n

B.acc1 = sqrt(pas.temps)*Z2[,1] B.sim1 = c(0,cumsum(B.acc1)) B.acc2 =sqrt(pas.temps)*Z2[,2] B.sim2 = c(0,cumsum(B.acc2))}

6.1.6 Code R pour simulation d'un mouvement brownien de dimension 3

SimulBrowDim3<-function(n,rho){

# n ... nombre de simulations

# rho ... coéffi cientde corrélation

R<-matrix(c(1 ,rho,rho,rho,1,rho,rho,rho,1),nrow=3)

L<- t(chol(R))

Z<- matrix(rnorm(n*3),nrow=3)

Z<- L%*%Z Z3=t(Z)

pas.temps = 1/n

B.acc1 = sqrt(pas.temps)*Z3[,1] B.sim1 = c(0,cumsum(B.acc1)) B.acc2 = sqrt(pas.temps)*Z3[,2] B.sim2 = c(0,cumsum(B.acc2)) B.acc3 = sqrt(pas.temps)*Z3[,3] B.sim3 = c(0,cumsum(B.acc3))}

6.1.7 Code R pour simulation d'un mouvement brownien avec derive

SimulationBrownienDrifté<-function(n,u){

# n ... nombre de simulations

# u ... Coéfficient de dérive

temps = seq(0,1,length=n+1) ## discretisation du temps

pas.temps = 1/n

B.acc =rnorm(n,sd=sqrt(pas.temps)) ## simulation des accroissements y=u*pas.temps+(B.acc)

B.sim = c(0,cumsum(y))} ## simulation d'une trajectoire

6.1.8 Code R pour simulation de 30 trajectoires d'un brownien avec derive

SimulTrajectoires<-function(n.sim,n.point,u){ # n.sim ... nombre de simulation

# n.point ... points de discrétisation

# u ... Coéfficient de dérive

temps = seq(0,1,length=n.point)

pas.temps = 1/(n.point-1)

B.acc = matrix(rnorm((n.point-1)*n.sim,sd=sqrt(pas.temps)),nrow=n.sim) B.sim = matrix(NA,ncol=n.point,nrow=n.sim)

for (i in 1 :n.sim)

{B.sim[i,] = c(0,cumsum(u*pas.temps+(B.acc[i,])))}

B.mean = apply(B.sim,2,mean)} ## apply calcule la moyenne pour chaque colonne

6.1.9 Code R pour simulation d'un mouvement brownien géométrique

SimulBroGéo<-function(para,x0,dt,n){ # x0 ... valeur intiale du processus

# n ... nombre de simulations

# u ... coéfficient de dérive

# sigma ... volatilité

u=para[1]

sigma=para[2] dt=1/n

x=c(0,n)

tvector=dt*0 :n dW=sqrt(dt)*rnorm(n)

x[1]=x0

for(i in 1 :n) {x[i+1]=x[i]+mu*x[i]*dt+sigma*x[i]*dW[i]}}

6.1.10 Code R pour estimation des paramètres du modèle Vasicek

EstimationVasicek<-function(data,dt){

#data ... vecteur contenant les données des taux #dt ... intervalle de temps entre les données

N=length(data)

rate=data[2 :N]

lagrate=data[1 :(N-1)]

alpha=(N*sum(rate*lagrate) - sum(rate)*sum(lagrate))/ (N*sum(lagrate^2)- (sum(lagrate)) 2)

k_hat = -log(alpha)/dt

theta_hat = sum(rate-alpha*lagrate ) / (N*(1-alpha)) v2hat<-sum((rate-lagrate*alpha-theta_hat*(1-alpha)) 2)/N sigma_hat<-sqrt(2*k_hat*v2hat/(1-exp(-2*k_hat*dt))) c(theta_hat,k_hat,sigma_hat)}

6.1.11 Code R pour simulation du modèle de Vasicek

VasicekSimulation<-function(para,r0,dt,n,m){ # r0 ... valeur intiale du processus de taux

# n ... nombre de simulations

# dt ... pas du temps

# m ... nombre de trajectoires simulées k=para[1]

theta=para[2]

sigma=para[3]

r=matrix(0,m+1,n)

r[1,]=r0

for(j in 1 :n){

for(i in 2 :(m+1)){

dr=k*(theta-r[i-1,j])*dt + sigma*sqrt(dt)*rnorm(1,0,1) r[i,j]=r[i-1,j] + dr }}}

6.1.12 Code R pour simulation de la solution du modèle de Vasicek

VasicekSimulSolution<-function(para,r0,dt,n,m){

# r0 ... valeur intiale du processus de taux

# n ... nombre de simulations

# dt ... pas du temps

# m ... nombre de trajectoires simulées

k=para[1]

theta=para[2] sigma=para[3] r=matrix(0,m+1,n)

r[1,]=r0

for(j in 1 :n){

for(i in 2 :(m+1)){ dr=k*(1-exp(-sigma*dt))+(theta*sqrt((1-exp(-2*sigma*dt))/(2*sigma))*rnorm(1,0,1)) r[i,j]=r[i-1,j]*exp(-sigma*dt)+dr }}}

6.1.13 Code R pour le calcul du prix du bon dans le modèle de Vasicek

VasicekPrix<-function(r,tau,para){

# r ... valeur actuelle du taux d'intérêt

# Para ... vecteur des paramètres du modèle de Vasicek

# tau ... maturité

theta=Para[1]

k=Para[2]

sigma=Para[3]

B=(1-exp(-k*tau))/k

A=exp((B-tau)*(k 2*theta-0.5*sigma 2)/k 2 - sigma 2*B 2/(4*k)) P=A*(exp(-B*r))} # P : prix du bon du trésor

6.1.14 Code R pour estimation des paramètres du modèle CIR

CIRloglike<-function(para,data){

#Calcul de la fonction log-vraissemblance du modèle CIR theta=para[1]

k=para[2]

sigma= para[3]

N=length(data)

rate=data[1 :(N-1)]

lagrate=data[2 :N]

ncp= rate*((4*k*exp(-k*dt))/(sigma 2*(1-exp(-k*dt)))) d= 4*theta*k/sigma 2 #degr" de liberté

c= 4*k/(sigma 2*(1-exp(-k*dt))) R=sum(dchisq(c*lagrate,df=d,ncp=ncp,log=TRUE)+log(c))}

#Code R pour l'optimisation Numérique OptimCIR<-optim(par=c(0.1,0.1,0.1),fn=CIRloglike,method="L-BFGS-B", lower=c(0.05,0.05,0.05),upper=c(0.7,0.7,0.7),data=read.table("dataUS.dat"))$par

6.1.15 Code R pour simulation du modèle de Cox, Ingersoll & Ross

CIRsimulation<-function(para,r0,n,dt,m){

# r0 ... valeur intiale du processus de taux

# n ... nombre de simulations

# dt ... pas du temps

# m ... nombre de trajectoires simulées

k=para[1]

theta=para[2] sigma=para[3] r=matrix(0,m+1,n)

r[1,]=r0

for(j in 1 :n){

for(i in 2 :(m+1)){

dr=k*(theta-r[i-1,j])*dt +sigma*sqrt( r[i-1,j]*dt)*rnorm(1,0,1)

r[i,j]=r[i-1,j] + dr }}}

6.1.16 Code R pour simulation de la solution exacte du modèle CIR

CIRsimulSolution<-function(para,n,dt,m){ # r0 ... valeur intiale du processus de taux # n ... nombre de simulations

# dt ... pas du temps

# m ... nombre de trajectoires simulées

# c... terme multiplicatif distribution khi-2 # df... degré de liberté

# ncp... parametre de non centralité k=para[1]

theta=para[2]

sigma=para[3]

c= sigma 2*(1-exp(-k*dt))/(4*k)

df= 4*theta*k/sigma 2

r=c(0,m)

r[1]=r0

for(i in 1 :(m)){

ncp= r[i]*exp(-k*dt)/c

r[i+1]=c*rchisq(m,df=df,ncp=ncp)}}

6.1.17 Code R pour le calcul du prix du bon dans le modèle CIR

CIRprix<-function(r,tau,para){

# r ... valeur actuelle du taux d'intérêt

# Para ... vecteur des paramètres du modèle CIR

# tau ... maturité

theta=Para[1]

k=Para[2]

sigma=Para[3]

h=sqrt(k 2+2*sigma 2)

B= 2*(exp(h*tau)-1) / (2*h+(k+h)*(exp(tau*h)-1))

A= ((2*h*exp((k+h)*(tau)/2)) / (2*h+(k+h)*(exp(tau*h)-1))) (2*k*theta/sigma 2) P=A*(exp(-B*r))} # P : prix du bon du trésor

6.1.18 Code R pour estimation des paramètres du modèle de Vasicek 2f

EstimationVasicek2f<-function(data,data2,dt){ #data ... vecteur des données du taux court

#data2 ... vecteur des données du taux a long terme #dt ... intervalle de temps entre les données N=length(data)

rate=data[2 :N]

lagrate=data[1 :(N-1)]

alpha=(N*sum(rate*lagrate) - sum(rate)*sum(lagrate))/

(N*sum(lagrate 2)- (sum(lagrate)) 2) k_hat = -log(alpha)/dt

theta_hat = sum(rate-alpha*lagrate ) / (N*(1-alpha)) v2hat<-sum((rate-lagrate*alpha-theta_hat*(1-alpha)) 2)/N

sigma_hat<-sqrt(2*k_hat*v2hat/(1-exp(-2*k_hat*dt))) c(theta_hat,k_hat,sigma_hat)

N=length(data2)

rate=data2[2 :N]

lagrate=data2[1 :(N-1)]

alpha2=(N*sum(rate*lagrate) - sum(rate)*sum(lagrate))/ (N*sum(lagrate^2)- (sum(lagrate)) 2)

k_hat2 = -log(alpha2)/dt

theta_hat2 = sum(rate-alpha2*lagrate ) / (N*(1-alpha2)) v2hat2<-sum((rate-lagrate*alpha2-theta_hat2*(1-alpha2)) 2)/N sigma_hat2<-sqrt(2*k_hat2*v2hat2/(1-exp(-2*k_hat2*dt))) c(theta_hat2,k_hat2,sigma_hat2)

corr=cor(T,T2)} #coéffi cient de corrélation

6.1.19 Code R pour simulation du modèle de Vasicek a 2 facteurs

Vasicek2fSimulation<-function(param,x0,y0,dt,n,d){ # x0 ... valeur intiale du processus de taux x

# y0 ... valeur intiale du processus de taux y # n ... nombre de simulations

# dt ... pas du temps

# m ... nombre de trajectoires simulées k_x =param[1]

theta_x =param[2]

sigma_x=param[3]

k_y =param[4]

theta_y =param[5] sigma_y=param[6] rho =param[7]

x=matrix(0,m+1,n) y=matrix(0,m+1,n) r=matrix(0,m+1,n) x[1,]=x0

y[1,]=y0

r[1,]=x[1]+y[1]

for (j in 1 :(n)){

for(i in 2 :(m+1)){ norm1=rnorm(1,0,1) norm2=rnorm(1,0,1)

norm3=(rho*norm1)+(sqrt(1-rho 2)*norm2) dx=k_x*(theta_x-x[i-1,j])*dt+sigma*sqrt(dt)*norm3

x[i,j]=x[i-1,j] + dx

dy=k_y*(theta_y-y[i-1,j])*dt + sigma_y*sqrt(dt)*norm1

y[i,j]=y[i-1,j] + dy r[i,j]=x[i,j]+y[i,j] }}}

6.1.20 Code R pour simulation de la solution exacte du Vasicek 2f

Vasicek2fSimulSolution<-function(param,x0,y0,dt,n,d){

# x0 ... valeur intiale du processus de taux x

# y0 ... valeur intiale du processus de taux y

# n ... nombre de simulations

# dt ... pas du temps

# m ... nombre de trajectoires simulées

k_x =param[1]

theta_x =param[2] sigma_x=param[3] k_y =param[4]

theta_y =param[5] sigma_y=param[6] rho =param[7]

x=matrix(0,m+1,n) y=matrix(0,m+1,n) r=matrix(0,m+1,n) x[1,]=x0

y[1,]=y0

r[1,]=x[1,]+y[1,]

for (j in 1 :(n)){ for(i in 2 :(m+1)){ norm1=rnorm(1,0,1) norm2=rnorm(1,0,1)

norm3=(rho*norm1)+(sqrt(1-rho 2)*norm2) dx=k_x*(1-exp(-sigma_x*dt))+(theta_x*sqrt((1-exp(-2*sigma_x*dt))/(2*sigma_x))*norm3)

x[i,j]=x[i-1,j]*exp(-sigma_x*dt)+dx dy=k*(1-exp(-sigma_y*dt))+(theta_y*sqrt((1-exp(-2*sigma_y*dt))/(2*sigma_y))*norm1) y[i,j]=y[i-1,j]*exp(-sigma_y*dt)+dy

r[i,j]=x[i,j]+y[i,j] III

6.1.21 Code R pour le calcul du prix du bon dans Vasicek 2f

PrixVasicek2F<-function(t,para,x,y,tau){

# t ... valeur du taux d'intérêt (modele vasicek2f)

# x ... valeur du processus y(t)

# y ... valeur du processus x(t)

# Para ... vecteur des parametres du modele Vasicek2f)

# tau ... maturité

k_x =para[1]

theta_x =para[2]

sigma_x=parm[3]

k_y =parm[4]

theta_y =para[5]

sigma_y=para[6]

rho =para[7] R=theta_x+(1-exp(-k_x*tau))/(k_x*tau)*(x-theta_x)+theta_y+(1-exp(-k_y*tau))/ (k_y*tau)*(y-theta_y)-sigma_x-2/(2*k_x-2)*(1+(1-exp(-2*k_x*tau))/ (2*k_x*tau)-2*(1-exp(-k_x*tau))/(k_x*tau))-sigma_y-2/(2*k_y-2)*(1+(1-exp(-2*k_y*tau))/ (2*k_y*tau)-2*(1-exp(-k_y*tau))/(k_y*tau))-(rho*sigma_x*sigma_y)/(k_x*k_y)*(1-

(1-exp(-k_x*tau))/

(k_x*tau)-(1-exp(-k_y*tau))/(k_y*tau)+(1-exp(-(k_x+k_y)*tau))/((k_x+k_y)*tau)) P=exp(-R*t)} #P : prix du bon du trésor

6.1.22 Code R pour simulation d'un processus d'O-U exponentiel

SimulationOUexponentiel<-function(para,rO,dt,n,m){

# rO ... valeur intiale du processus OUexpo

# n ... nombre de simulations

# dt ... pas du temps

# m ... nombre de trajectoires simulées

k=para[1]

theta=para[2] sigma=para[3] r=matrix(O,m+1,n)

r[1,]=log(rO) for(j in 1 :n){

for(i in 2 :(m+1)){

dr=k*(theta-log(r))*dt + beta*sqrt(dt)*rnorm(1,O,1)

r[i,j]=r[i-1,j] + dr }}}

6.1.23 Code R pour simulation du modèle d'Eraker de volatilité stochastique

SimulationEraker<-function(para,rO,vO,m,dt,n){ # vO ... valeur intiale du processus de volatilité # rO ... valeur intiale du modèle proposé par Eraker

# m ... nombre de simulations

# dt ... pas du temps

# n ... nombre de trajectoires simulées

k=para[1]

theta=para[2]

sigma=para[3]

rho=para[4]

v=matrix(0,m+1,n) r=matrix(0,m+1,n) v[1,]=v0

r[1,]=r0

for(j in 1 :n){ for(i in 2 :(m+1)){

norm1=rnorm(1,0,1) norm2=rnorm(1,0,1) norm3=(rho*norm1)+(sqrt(1-rho 2)*norm2)

dv=k*v[i-1,j]*dt +sigma*sqrt(dt)*norm3

v[i,j]=v[i-1,j] + dv

dr=(theta+k*r[i-1,j])*dt +sigma*exp(0.5*v[i-1,j])*norm1

r[i,j]=r[i-1,j] + dr }}}

6.1.24 Code R pour simulation du modèle de Heston de volatilité stochastique

Simulationlleston<-function(para,s0,v0,r,m,dt,n){ # v0 ... valeur intiale du processus de volatilité

# s0 ... valeur intiale du modèle de Heston

# r ... taux d'intérêt sans risque

# m ... nombre de simulations

# dt ... pas du temps

# n ... nombre de trajectoires simulées

k=para[1]

theta=para[2]

sigma=para[3] #volatilité de la volatilité

rho=para[4]

v=matrix(0,m+1,n) s=matrix(0,m+1,n) v[1,]=v0

s[1,]=s0

for(j in 1 :n){

for(i in 2 :(m+1)){ norm1=rnorm(1,0,1) norm2=rnorm(1,0,1)

norm3=(rho*norm1)+(sqrt(1-rho 2)*norm2)

dv=k*(theta-v[i-1,j])*dt +sigma*sqrt(v[i-1,j]*dt)*norm3

v[i,j]=v[i-1,j] + dv

ds=r*s[i-1,j]*dt +s[i-1,j]*sqrt(v[i-1,j]*dt)*norm1

s[i,j]=s[i-1,j] + ds }}}

6.2 Annexe II : Les données

6.2.1 Daily Treasury Bill Rates Data

Nous présentons ici les données s'étallant sur la période allant du 05/01/2012 au 21/05/2012.

précédent sommaire suivant






Bitcoin is a swarm of cyber hornets serving the goddess of wisdom, feeding on the fire of truth, exponentially growing ever smarter, faster, and stronger behind a wall of encrypted energy








"L'imagination est plus importante que le savoir"   Albert Einstein