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