Projet Courbe de Taux en C Sharp

Transcription

Projet Courbe de Taux en C Sharp
Projet Courbe de Taux en C Sharp
Daniel Herlemont
14 mars 2012
Table des matières
1 Introduction
1
2 Description des données
2
3 Rappels
3
4 A faire
4.1 Lecture des fichiers . . .
4.2 Fonction d’actualisation
4.3 Duration . . . . . . . . .
4.4 Cacul du taux actuariel .
4.5 Méthode du Bootstrap .
.
.
.
.
.
5
5
6
7
8
9
5 Annexe
5.1 Bon et taux zéro-coupon . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
10
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Introduction
Le but de ce TP est :
ˆ
d’explorer des jeux de données sur des obligations d’états (issues de Bloomberg),
ˆ
réaliser un programme de lecture de ces fichiers, manipulation des chaı̂nes de caractères
ˆ
effectuer des calculs simples, notamment :
1
2 DESCRIPTION DES DONNÉES
– d’actualisation
– de calcul du coupon couru
– calcul des sensibilités (duration modifiée)
– calcul du prix coté en fonction du taux actuariel (yield)
– inversement, calcul du taux actuariel, c’est à dire le taux de rendement interne à
partir du prix actualisé.
Dans un deuxième temps, on construira la courbe des taux à l’aide de la méthode dite
du ”bootstrap”.
2
Description des données
Le site Bloomberg fournit quelques informations sur les obligations d’état :
ˆ
http://www.bloomberg.com/markets/rates obligations US,
ˆ
http://www.bloomberg.com/markets/rates/germany.html : Allemagne,
Pour chaque instrument, les informations suivantes sont fournies :
ˆ
Le coupon
ˆ
la maturité
ˆ
le prix coté
ˆ
le rendement actuariel (yield)
Ces informations vont donc nous permettre de vérifier quelques relations, notamment le
prix en fonction du yield.
Un fichier texte a été constitué à partir de quelques obligations Allemandes (euros) relevées le 16 NOVEMBRE 2010. Ce fichier est disponible à l’adresse http://www.yats.
com/data/bloomberg/germany-original.txt.
Il contient les informations suivantes séparées par des tabulations
ˆ
Le nom
ˆ
le coupon en % (à diviser par 100 !)
ˆ
la date de maturité
Daniel Herlemont
2
3 RAPPELS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
3
ˆ
le prix
ˆ
le yield
ˆ
le changement de prix
ˆ
le changement du yield
name coupon
maturity price yield pricechange yieldchange
3-Month
0.00 02/09/2011 99.86 0.61
-0.001
0.010
6-Month
0.00 05/11/2011 99.67 0.69
0.019
-0.036
1-Year
1.25 12/16/2011 100.42 0.86
0.020
-0.020
2-Year
1.00 12/14/2012 99.95 1.02
0.036
-0.018
3-Year
4.00 10/11/2013 108.06 1.15
0.051
-0.019
4-Year
2.50 10/10/2014 104.08 1.41
0.057
-0.015
5-Year
1.75 10/09/2015 100.40 1.66
0.039
-0.008
6-Year
4.00 07/04/2016 111.19 1.88
0.040
-0.008
7-Year
4.25 07/04/2017 113.13 2.10
0.017
-0.003
8-Year
4.25 07/04/2018 113.33 2.32
-0.005
0.000
9-Year
3.50 07/04/2019 107.81 2.48
-0.036
0.004
10-Year
2.25 09/04/2020 97.28 2.57
-0.035
0.004
15-Year
6.25 01/04/2024 136.76 2.85
-0.156
0.011
20-Year
4.75 07/04/2028 121.66 3.13
-0.131
0.008
30-Year
3.25 07/04/2042 103.30 3.08
-0.273
0.013
Rappels
Le ”taux actuariel” (ou le yield to maturity ou plus simplement yield) est le taux constant
qui permet d’actualiser les flux de l’obligation au prix constaté sur le marché.
Soient c le montant du coupon annuel, n la maturité en années, F le principal, et P le prix
de l’obligation. Le taux de rendement à échéance (Yield-To-Maturity) est le taux actuariel
y, défini par :
c
F
c
c
+
+ ... +
+
(1)
P =
2
n
1 + y (1 + y)
(1 + y)
(1 + y)n
ou bien
P =
Daniel Herlemont
c
c
+ (F − )(1 + y)−n
y
y
(2)
3
3 RAPPELS
Dans le cas d’une obligation US, les coupons sont semestriels. La formule précédente
devra être appliquée pour des périodes de 6 mois. Dans ce cas, le yield et le prix vérifient :
c/2
c/2
c/2
F
+
+ ... +
+
0.5
n
1 + y/2 (1 + y/2)
(1 + y/2)
(1 + y)n
(3)
Le plus souvent, le nombre de périodes n’est pas entier. Il faut ajuster la formule du prix
(plein coupon) en fonction du nombre de jours j jusqu’au prochain détachement de coupon.
Prenons le cas d’une obligation annuelle et notons v = j/365. Notons T la maturité en
années et n sa partie entière. T = n + v, avec 0 ≤ v < 1.
Dans ce cas, le prix et le yield y sont liés par la relation :
c
c
F
c
+
+ ... +
+
(4)
P rixP leinCoupon =
v
1+v
n+v
(1 + y)
(1 + y)
(1 + y)
(1 + y)n+v
avec F la valeur faciale.
Cette formule d’actualisation fournit un prix P coupon plein (full price ou dirty price)
alors que les cotations sont données en prix au pied du coupon (clean price). la différence
entre les deux est le coupon couru. C’est a dire ce que l’acheteur doit verser au vendeur, en
plus du prix coté affiché.
ˆ
DirtyPrice = CleanPrice + AccruedInterest
ˆ
PleinCoupon = PiedDuCoupon + InteretsCourus
Le coupon couru est c(1 − v).
A coupon constant, l’actualisation du coupon est une suite géométrique qui peut donc
s’écrire de la façon suivante :
c
c
(5)
P leinCoupon = (1 + y)1−v + (F − )(1 + y)−T
y
y
En remarquant que (1 + y)1−v ≈ 1 + (1 − v)y, on voit donc que
c
c
P leinCoupon =
(1 + (1 − v)y) + (F − )(1 + y)−T
y
y
c
c
= c(1 − v) + + (F − )(1 + y)−T
y
y
c
c
P iedDuCoupon =
+ (F − )(1 + y)−T
y
y
(6)
(7)
(8)
(9)
En conclusion le prix coté est comparable à
P irxCote = P iedDuCoupon =
Daniel Herlemont
c
c
+ (F − )(1 + y)−T
y
y
(10)
4
4 A FAIRE
4
A faire
4.1
Lecture des fichiers
Réaliser un programme C Sharp (bloomberg.cs) pour lire le fichier bloomberg :
Pour lire un fichier, on utilisera par exempe :
using
using
using
using
System;
System.IO;
System.Collections.Generic;
System.Text;
public class Bond
{
public string name; // le nom de l'obligation
public double coupon; // le coupon, par exemple 3.5 pour un coupon de 3.5%
public int days; // la date de maturité en nombre de jours
public double price; // le prix coté contenu dans le fichier
public double yield; // le taux actuariel
public double price_change;
public double yield_change;
// constructeur avec une ligne du fichier
public Bond(string line)
{
int i = 0;
// exemple de ligne
//3-Month 0.000 02/09/2011 99.86 0.61 -0.001 0.010
string[] arr = line.Split('\t');
name = arr[i++];
IFormatProvider ci =
System.Globalization.CultureInfo.GetCultureInfo("en-US").NumberFormat;
//.GetCultureInfo("en-US").NumberFormat;
//IFormatProvider ci = CultureInfo.InvariantCulture.NumberFormat;
Daniel Herlemont
5
4 A FAIRE
coupon = double.Parse(arr[i++], ci);
DateTime d = DateTime.ParseExact(arr[i++], "M/d/yyyy", null);
DateTime dref = DateTime.ParseExact("11/16/2010", "M/d/yyyy", null);
days = (d - dref).Days;
price = double.Parse(arr[i++], ci);
yield = double.Parse(arr[i++], ci) / 100;
price_change = double.Parse(arr[i++], ci);
yield_change = double.Parse(arr[i++], ci);
}
class Program
{
static void Main(string[] args) {
string filename = "../../data/germany-original.txt";
if (!File.Exists(filename)) throw new Exception("le fihcier n'existe pas");
StreamReader f = new StreamReader(filename);
string line;
int n = 0;
while ( (line=f.ReadLine()) !=null) {
Console.WriteLine(line);
Bond b = new Bond(line);
n++;
}
}
}
4.2
Fonction d’actualisation
Pour chaque obligation, vérifiera les relations vues en rappel : a savoir être capable de retrouver le prix coté à partir du yield et des autres informations.
Retrouver le prix coté (price) à partir de la valeur actualisée au taux actuariel et du
coupon couru.
Résultats attendus :
Maturités en jours
3-Month 6-Month
Daniel Herlemont
1-Year
2-Year
3-Year
4-Year
5-Year
6-Year
7-Year
8-Year
6
4 A FAIRE
85
176
395
759
1060
9-Year 10-Year 15-Year 20-Year 30-Year
3152
3580
4797
6440
11553
1424
1788
2057
2422
2787
coupon couru
3-Month
6-Month
1-Year
2-Year
3-Year
4-Year
5-Year
6-Year
0.0000000 0.0000000 1.1472603 0.9205479 0.3835616 0.2465753 0.1773973 1.4575342
7-Year
8-Year
9-Year
10-Year
15-Year
20-Year
30-Year
1.5486301 1.5486301 1.2753425 0.4315068 5.3595890 1.6917808 1.1308219
prix calculé
3-Month
6-Month
1-Year
99.85848 99.66898 100.41790
7-Year
8-Year
9-Year
113.17834 113.35280 107.83223
2-Year
3-Year
4-Year
5-Year
6-Year
99.95868 108.09237 104.10798 100.41878 111.22793
10-Year
15-Year
20-Year
30-Year
97.25216 136.82821 121.69298 103.39531
Afficher les différences entre les prix calculés et les prix contenus dans le fichier.
Résultats attendus :
3-Month
6-Month
1-Year
-0.001523043 -0.001020639 -0.002095161
5-Year
6-Year
7-Year
0.018780297 0.037925541 0.048343345
15-Year
20-Year
30-Year
0.068205793 0.032978310 0.095306349
2-Year
0.008683530
8-Year
0.022803250
3-Year
4-Year
0.032366438 0.027975366
9-Year
10-Year
0.022228890 -0.027841642
Pour avoir une idée sur les précisions globales, on pourra calculer l’écart moyen absolu
(mean absolute deviation) :
M AD =
X
1
f abs(quotedP ricei − computedP ricei )
nbonds i=1,nbonds
(11)
Cette erreur doit être très faible : quelques points de base (0.05 maximum).
4.3
Duration
Calculer la duration modifiée :
DM = −
1 dP rix
P dy
(12)
Résultats attendus :
Daniel Herlemont
7
4 A FAIRE
3-Month
0.2314612
6-Year
5.0952957
30-Year
19.8439619
6-Month
0.4788826
7-Year
5.8539383
1-Year
1.0728672
8-Year
6.5991776
2-Year
2.0480051
9-Year
7.4663917
3-Year
2.7738970
10-Year
8.6716083
4-Year
5-Year
3.7182362 4.6618537
15-Year
20-Year
9.6722737 12.4952617
A l’aide de l’expression obtenue, vérifier les variations indiquées dans le fichier des données, à savoir
∆P rix ≈ −DM P δy
Plus précisément, on pour calculer
P riceChange
− Y ieldChange/100 ≈ 0
−DM ∗ P rice
Avec PriceChange et YieldChange les données contenues dans le fichier.
Comme le montre les résultats attendus, l’approximation est excellente
3-Month
6-Month
-5.673565e-05 -3.807062e-05
4-Year
5-Year
2.710903e-06 -3.324412e-06
9-Year
10-Year
4.723181e-06 1.490133e-06
4.4
1-Year
1.436331e-05
6-Year
9.396721e-06
15-Year
7.933430e-06
2-Year
4.131255e-06
7-Year
4.330170e-06
20-Year
6.174372e-06
3-Year
1.985669e-05
8-Year
6.685522e-06
30-Year
3.178446e-06
Cacul du taux actuariel
Dans cette partie, nous nous proposons de calculer le taux actuariel, c’est à dire le taux de
rendement interne, à partir des flux : coupons, valeur faciale et prix. Le taux de rendement
interne y (ou taux actuariel ou yield) est solution de l’équation :
f (yield) = P rixCalcule(yield) − P rixDuF ichier = 0
(13)
On appliquera trois méthodes que l’on comparera (avantages/inconvénients)
ˆ
dichotomie
ˆ
la méthode de Newton, en utilisant le calcul de la duration
ˆ
la méthode de la fausse position décrite ci dessous
Daniel Herlemont
8
4 A FAIRE
Méthode dite de la ”fausse position” (Newton simplifié) :
ˆ
Commencer avec des yields a = 0 et
b = 1, calculer f (a) et f (b), puis le
point c tel que
c = a − f (a)
b−a
f (b) − f (a)
ˆ
répéter l’étape précédente avec l’intervalle [a, c] si f (a) et f (c) sont de
signe opposés sinon on prendra l’intervalle [c, b]
ˆ
itérer jusqu’à obtenir une précision
absolue de |b − a| < 10−6 .
4.5
Méthode du Bootstrap
Pour reconstituer la courbe zéro coupon, on utilisera la méthode du bootsrap (voir présentation) avec interpolation (voir présentation).
Pour l’interpolation on utilisera l’interpolation linéaire ou par des splines cubiques (au
choix).
Le programme devra permettre de donner le taux zéro coupon pour une obligation de
maturité quelconque.
Ce programme devra permettre par exemple, de lire une maturité en mois à la console,
pour afficher le taux zéro coupon correspondant.
Pour afficher toute la courbe, générer un fichier de type .csv qu’on lira sous excel pour
afficher le graphique.
Daniel Herlemont
9
5 ANNEXE
Courbe des taux zéro coupon
●
●
2.5
●
●
●
2.0
●
●
●
1.5
taux zero coupon en %
3.0
●
●
1.0
●
●
0.5
●
●
●
0
5
10
15
20
25
30
maturité (days/365)
3-Month 6-Month 1-Year 2-Year 3-Year
0.6034 0.6879 0.8583 1.0253 1.1694
9-Year 10-Year 15-Year 20-Year 30-Year
2.5767 2.6291 3.0997 3.3218 2.9831
5
5.1
4-Year
1.4306
5-Year
1.6802
6-Year
1.9410
7-Year
2.1832
8-Year
2.4206
Annexe
Bon et taux zéro-coupon
La construction d’une structure par terme des taux d’intérêt fait le plus souvent référence
à la notion de bon zéro-coupon. Un bon zéro-coupon de maturité m, noté B(m) correspond
Daniel Herlemont
10
5 ANNEXE
à la valeur aujourd’hui d’un euro payé dans m périodes, sans paiements intermédiaires. Le
rendement implicite associé à ce bon représente le taux d’intérêt, noté y(m) d’un bon zérocoupon. Une relation simple lie le bon à son taux, ce qui permet de travailler indifféremment
sur l’un ou l’autre. Cette relation prend deux formes selon qu’elle est écrite en temps discret :
1
(1 + yd (m))m
(14)
yd (m) = B(m)−1/m − 1
(15)
B(m) = e−myc (m)
(16)
B(m) =
ou en continu :
1
log B(m)
(17)
m
A un instant donné, la structure par terme des taux d’intérêt se définit comme la valeur
prise par y(m) pour différentes valeurs de la maturité m.
yc (m) = −
Daniel Herlemont
11