Around the Hull-White short-rate model
Introduction
Disclaimer : this is the summary of a project done with 2 friends for Pr Jiao Ying in 2017. The corresponding code is avaliable here. Sorry but the following is in french.
Nous allons traiter ici le modèle d’Hull et White, développé à partir du modèle de Vasicek en 1990. Nous commencerons par quelques prérequis, notamment le modèle de vasicek ainsi que des considérations sur les processus d’Ornstein-Uhlenbeck correspondant, avant de nous attaquer au modèle HW en lui-même. Rappelons que nous nous plaçons dans un modèle de marché parfait (infinie liquidité des actifs, coûts de transaction nuls, actifs infiniment divisibles notamment).
Le modèle de vasicek et quelques pré-requis
Rappelons ici la dynamique du taux court dans le modèle de vasicek:
Sous le modèle de vasicek, le taux court suit la dynamique suivante:
Avec :
constante positive, représentant la force de rappel constante positive, représentant le taux long terme constante positive, représentant la volatilité
On pourrait tout a fait noter
Sous vasicek, le taux court suit un processus d’Ornstein-Uhlenbeck, et la solution correspondante est :
A t fixé, ce processus d’Ornstein-Uhlenbeck suit une loi gaussienne de paramètres son espérance et sa variances, un processus d’Ornstein-Uhlenbeck est en effet à la fois Gaussien et Markovien.
Soit
Le modèle de Hull et White
Développé par J.C.Hull et A.White a partir de 1990, le modèle Hull-White est encore très utilisé sur le marché aujourd’hui. L’objectif premier de ce modèle était de correspondre exactement aux données de marché afin de d’obtenir une courbe des taux dans le modèle correspondant exactement à la courbe empirique des taux "réels" fournie par le marché. L’intuition fut la suivante : ajouter un paramètre (non-stochastique) dépendant du temps dans le drift de la dynamique du taux d’intérêt. La mise en oeuvre de ce modèle nécessite une paramétrisation (le paramètre non-stochastique ajouté) à partir des données de marché.
Dans l’extension proposée par Hull-white du modèle de vasicek, c’est le
paramètre
Sous le modèle Hull-White, le taux court suit la dynamique suivante :
Avec :
constante positive, représentant la force de rappel une fonction déterministe du temps constante positive, représentant la volatilité
Par intégration (via le lemme d’Ito) de la dynamique du taux court sous
Hull-White, on obtient:
On a:
Ce qui implique que :
et donc :
Sous le modèle Hull-White, le prix d’un zéro-coupon est donné par :
On commence par calculer
Que l’on injectera dans notre équation :
Et ainsi :
Comme
Ainsi, nous avons pu complètement définir le prix de n’importe quel zéro-coupon. Pour des raisons de simplification des calculs, nous prendrons les notation suivante :
Et le prix du zéro coupon s’écrit alors :
On voit ici que le modèle de Hull-White à un facteur est bien un modèle
affine, étant donné que
Pour en arriver a notre but (construire la courbe des taux), nous allons maintenant déduire du prix du zéro-coupon le prix des taux moyens continus :
Ici, on a :
Simulations
Pour l’ensemble des simulations suivantes, nous avons arbitrairement
fixé :
Comme présenté précédemment, la mise en oeuvre de ce modèle nécessité
une paramétrisation de
On fixe le nombre de discrétisation de notre brownien
Soit
Avec

Simulation d’un mouvement brownien sur 10 ans avec 1 000 000 itérations
Simulation du taux court
Maintenant que nous avons un brownien standard, nous pouvons nous en
servir pour simuler le taux court
On fixe
On génère un mouvement brownien
On décompose :
Le graphique suivant représente le taux court en fonction du temps

Simulation d’un taux court sur 10 ans avec 1 000 000 de discrétisations du brownien sousjacent
L’intérêt de la fonction sinus dans
Simulation du prix du zéro-coupon
Si
On déclare
Enfin on a
Le graphique suivant représente donc le prix d’un zéro-coupon

Simulation du prix d’un zéro-coupon de maturité
Il est cohérent d’obtenir une fonction décroissante en T en t=0 fixé pour des taux d’intérêt positifs.
Et le suivant représente le prix d’un zéro-coupon

Simulation de la courbe des taux B(temps,Temps) sur 10 ans
Simulation et graphe de la courbe de taux
Maintenant que nous sommes capables de calculer le prix du zéro-coupon, il ne reste plus qu’à l’inclure dans le calcul des valeurs de la courbe des taux pour enfin pouvoir en sortir une surface.

Simulation de la surface des taux en
Nous obtenons bien une courbe des taux concave. Néanmoins, il se trouve
que notre courbe de taux finit par être décroissante à partir de
Enfin, le graphique suivant représente la surface des taux.

Simulation de la surface des taux R(temps,Temps) sur 10 ans
Conclusion
Naturellement, nous n’avons pas pu aller plus loin dans l’analyse financière de nos résultats car nous sommes limités par la sélection des paramètres. Pour calibrer un tel modèle, on pourra citer "Calibration Methods of Hull-White Model" article de Sebastien Gurrieri, Masaki Nakabayashi et Tony Wong parut en 2011.
Annexes
Ci-dessous le code que nous avons utiliser pour générer les graphiques. Nous avons utiliser une méthode de Monte-Carlo pour calculer les intégrales stochastiques du taux court, et les formules fermées démontrées ci-dessus pour calculer les zéro-coupons et la courbe des taux.
## Simulation du brownien standard
T <- 1
n <- 100000
d <- T/n
w <- numeric(n)
for(i in 1:n) w[i+1] <- w[i] + d * rnorm(1)
## Graphique corespondant :
plot.ts(w)
abline(h = 0)
#Donc W est un brownien sur [0;n]
# parametres du modele :
.alpha = 0.5
.sigma = 1
.r0 = 0
vega <- function(t)
{
return(1- sin(10*t)/(t+1))
}
#Fonction calculans le taux court r_t :
r_t <- function(t,r0 = .r0,alpha = .alpha ,volatilite =1,periode_final=10,wienner=w)
{
# condition d'arret
if(t==0){
return(r0)
}
# Integration prerequise
max_iter <- length(w)
somme_seq <- seq(0, round(max_iter*t/periode_final,0))
N <- length(somme_seq)
somme = 0
for(i in 1:N)
{
somme = somme + exp(alpha * i * t / N) * w[i]
}
somme <- somme / N
integrale_pour_wienner <- exp(alpha*t) * w[round(max_iter*t/periode_final,0)] - alpha * somme
# return the result :
membre_2 <- integrate(function(u) return(exp(-alpha*(t-u))*vega(u)), lower = 0, upper = t)$value
membre_3 <- volatilite * exp(-alpha*t) * integrale_pour_wienner
return(r0*exp(-alpha*(t))+membre_2+membre_3)
}
#On implemente notre H&W
temps <- seq(0,10, length = 1000)
r_seq <- temps
for(i in 1:(length(temps)))
{
r_seq[i] <- r_t(temps[i])
print(c(1,i))
}
plot(temps[1:length(temps)], r_seq, type = "l", ylab = "r_t", xlab = "time")
#Fabriquons une courbe de taux
#On commence par creer la fonction qui nous donne les B(0,theta)
#B(0,theta) indexe par alpha
B <- function(t, T, alpha=.alpha, volatilite=.sigma)
{
#condition d'arret
if(T==0){return(1)}
#prerequis
A <- function(t,T,alpha=0.5){
return((1-exp(-alpha*(T-t)))/alpha)
}
#lets go
membre_1 <- r_t(t,0, alpha, volatilite)*A(t,T,alpha)
membre_2 <- integrate(function(s) return(vega(s)*A(s,T,alpha)), lower = 0, upper = T)$value
membre_3 <- 1/2 * volatilite^2 * integrate(function(s) return(A(s,T,alpha)^2), lower = 0, upper = T)$value
return(exp(- membre_1 - membre_2 + membre_3))
}
# Maintenant faisont une courbe des taux zero coupon en t=0 d'echeance entre 0 et 10 :
temps <- seq(0,10, length = 100) #t pouvant aller jusqu'a 10 ans ici
B_seq <- temps
for(i in 1:(length(temps)))
{
B_seq[i] <- B(0,temps[i])
print(c(2,i))
}
plot(temps[1:length(temps)], B_seq, type = "l", xlab = "time", ylab = "B(0,T)")
# Passons a la courbe des taux :
R <- function(t,T, alpha=.alpha,volatilite=.sigma)
{
return((-1/T) * log(B(t,T,alpha,volatilite)))
}
# Et la courbe des taux en 0 est :
temps <- seq(0,10, length = 100)
R_seq <- temps
for(i in 1:(length(temps)))
{
R_seq[i] <- R(0,temps[i])
print(c(3,i))
}
plot(temps[1:length(temps)], R_seq, type = "l", xlab = "time", ylab = "Valeur des taux")
## Maintenant, occupons nous de charter les ZC et la courbe des taux sur les deux parametres temps :
temps <- seq(0,10, length = 100)
Temps <- seq(0,10,length=100)
mat <- matrix(NA,nrow=length(temps),ncol=length(Temps))
for (i in 1:length(temps)){
for (j in 1:length(Temps)){
if((temps[i]+Temps[j]) < 10){
mat[i,j] <- B(temps[i],Temps[i])
print(c(i,j))
}
}
}
persp(temps,Temps,mat,theta=30,phi=30)
## Ensuite, la surface des taux moyens continus :
temps <- seq(0,10, length = 100)
Temps <- seq(0,10,length=100)
mat2 <- matrix(NA,nrow=length(temps),ncol=length(Temps))
for (i in 1:length(temps)){
for (j in 1:length(Temps)){
if((temps[i]+Temps[j]) < 10){
mat2[i,j] <- R(temps[i],Temps[i])
print(c(i,j))
}
}
}
persp(temps,Temps,mat,theta=30,phi=30)
References :
Azizieh, Celine. 2014. “Modélisation Des Taux d’intérêt.” Université Libre De Bruxelle.
Brigo, Damiano, and Fabio Mercurio. 2006. Interest Rate Models - Theory and Practice: With Smile, Inflation and Credit. 2nd ed. Springer Finance. Springer.
Filipovic, Damir. 2009. Term-Structure Models: A Graduate Course. 1st ed. Springer Finance. Springer-Verlag Berlin Heidelberg.
Musiela, Marek, and Marek Rutkowski. 2010. Martingale Methods in Financial Modelling. 2nd ed. 2005. Corr. 3rd printing. Stochastic Modelling and Applied Probability. Springer.