Sujet 11 : Modélisation d actifs financiers Sujet proposé par J. Lelong & M. Echenim. [DOCUMENTATION API LOGICIEL MODAFI] 1 P a g e
Sommaire Introduction p.3 Gestion de l Univers p.3 o Ajout / Suppression d actifs o Corrélation Simuler des actifs p.5 Exploiter les résultats p.6 Evaluation d actifs p.6 Erreurs p.7 XML Sauvegarde / Restauration de l Univers p.7 o Structure générale o Détails des taux o Détails des sous-jacents o Détails des corrélations o Détails des produits dérivés o Exemple complet XML Exportation des cours simulés p.13 o Structure générale o Exemple complet XML Exportation des évaluations p.15 o Structure générale o Exemple complet 2 P a g e
I. Introduction Ce document décrit de manière informelle comment utiliser l API. On détaille les fonctions principales de l API (avec des exemples d utilisation) ainsi que l architecture des fichiers d entrée/sortie de l application. Pour la documentation exhaustive et l architecture de l application, se référer au document d implémentation. II. Gestion de l Univers On sépare les actifs en trois catégories : les actifs «simples» dont le cours ne dépend pas d autres actifs (classe SousJacent), les actifs dont le cours dépend d un sous-jacent (classe ProduitDerive) et les taux (classe Taux). Tous les actifs sont stockés dans une classe appelée Univers. Cette classe est unique et ne peut pas être instanciée par l utilisateur. Chaque actif sous-jacent, chaque produit dérivé et chaque taux peuvent être stockés dans cette structure. L instance unique de l univers est obtenue avec la fonction : static Univers GetInstance() 1) Ajout / Suppression d actifs Les fonctions de création/ajout d actifs sont les suivantes : void AjouterObligationCoupon(String nom, int maturite, Double taux_coupon, Double valeur, Double intervalle,datetime date) void AjouterCallDividende(String nom, SousJacentSimple sj, int maturite, Double strike, Double r) void AjouterCallDividendePro(String nom, SousJacentSimple sj, int maturite, Double strike, Double r) void AjouterCallSimple(String nom, SousJacentSimple sj, int maturite, Double strike, Double r) void AjouterPutDividende(String nom, SousJacentSimple sj, int maturite, Double strike, Double r) void AjouterPutDividendePro(String nom, SousJacentSimple sj, int maturite, Double strike, Double r) void AjouterPutSimple(String nom, SousJacentSimple sj, int maturite, Double strike, Double r) void AjouterSpotForex(String nom, Double pip, Double solde, Double valeur,double levier_max, Definitions.typeDevise devc, Definitions.typeDevise dev1, Definitions.typeDevise dev2) void AjouterSousJacentMBGDividendePro(String nom, Double spot, Double tendance, Double volatilite,double proportion, Double intervalle) void AjouterSousJacentMBGDividende(String nom, Double spot, Double tendance, Double volatilite,double dividende, Double intervalle) void AjouterSousJacentMB(String nom, Double spot) void AjouterSousJacentMBD(String nom, Double spot, Double tendance, Double volatilite) void AjouterSousJacentMBG(String nom, Double spot, Double tendance, Double volatilite) void AjouterSousJacentMerton(String nom, Double spot, Double tendance, Double volatilite, Double lambda, Double moyennesauts, Double alpha) void AjouterSousJacentKouWang(String nom, Double spot, Double tendance, Double volatilite, Double lambda, Double p, Double lambda1, Double lambda2) void AjouterSousJacentPoisson(String nom, Double spot, Double lambda) void AjouterSousJacent(SousJacent sj) void AjouterZeroCoupon(String nom, Taux taux, int maturite) 3 P a g e
void AjouterTauxZeroCouponVasicek(String nom, Double tinit, Double volatilite, Double a, Double b, int maturite) void AjouterTauxCourtVasicek(String nom, Double tinit, Double volatilite, Double a, Double b) void AjouterBasisSwapTaux(string nom, double nominal, int maturite, DateTime dateemission, int intervallevar1, int intervallevar2, int convention1, int convention2, bool typeswap, double spread1, double spread2, int typetauxvariable1, int typetauxvariable2) void AjouterSwapDevise(string nom, double nomdomestique, int maturite, DateTime dateemission, int intervalledomestique, int intervalleetrangere, int conventiond, int conventione, bool typeswap, Definitions.typeDevise deviseetrangere, Definitions.typeDevise devisedomestique, double txfixedomestique, double txfixeetrangere) void AjouterSwapTaux(string nom, double nominal, int maturite, DateTime dateemission, int intervallefixe, int intervallevar, int conventionf, int conventionv, bool typeswap, double txfixe, double spread, int typetauxvariable) On peut également instancier des actifs directement avec leur constructeur, puis les ajouter dans l univers avec des fonctions génériques d ajout (voir la documentation du code). Il est cependant fortement conseillé d utiliser les méthodes précédentes, car elles garantissent la cohérence entre les actifs et les taux. Ainsi dans tout le programme, un actif est identifié par son nom. Passer par la classe univers pour gérer les actifs garantit l unicité du nom. De même, en passant par les constructeurs, on peut très bien faire des associations produits dérivés / sous-jacents incohérentes (ex. créer un call de sous-jacent suivant un processus de Poisson). Les méthodes précédentes interdisent de telles associations. On peut accéder aux actifs et aux taux enregistrés dans l univers avec : ProduitDerive Univers.GetProduitDerive(String nomproduit) SousJacent Univers.GetSousJacent(String nomsousjacent) Taux GetTaux(String nomtaux) Exemple : Le code suivant ajoute une action Google suivant un modèle brownien géométrique (spot = 100, tendance = 0.05, volatilité = 20%) et un call sur cet actif (prix d exercice = 110, maturité = 3 mois, taux d intérêt mensuel = 0.4%). Univers uni = Univers.GetInstance() ; uni.ajoutersousjacentmbg("goog", 100, 0.05, 0.2) ; SousJacent sj = uni.getsousjacent("goog") ; uni.ajoutercall("call_goog", sj, 3, 110, 0.004); Il est possible de retirer des actifs et des taux avec les fonctions suivantes: void SupprimerSousJacent(String nom) void SupprimerProduitDerive(String nom) void SupprimerTaux(String nom) void Univers.ViderUnivers() On peut également charger/enregistrer un univers préenregistré dans un fichier avec la fonction : void Output.RestaureUniversXML(String nomfichier) void Output.sauvegardeUniversXML(String nomfichier) (cf. section VII pour la structure des fichiers XML) 4 P a g e
2) Corrélation Pour corréler/décorréler des actifs: void Univers.SetCorrelation(String noma1, String noma2, Double correlation) Double Univers.GetCorrelation(String noma1, String noma2) void DecorrelerUnivers() Remarque : Il n y a pas d erreur levée quand on entre des corrélations incohérentes. Une erreur sera levée plus tard lors de la simulation. On rappelle qu ajouter un sous-jacent à un univers cohérent est susceptible de briser cette cohérence. Exemple : Le code suivant définit et corrèle les actions Google et Microsoft à 50%. Ces actifs ne suivent pas le même modèle. Univers uni = Univers.GetInstance() ; uni.ajoutersousjacentmbg("goog", 100, 0.05, 0.2) ; uni.ajoutersousjacentmbd("msft", 50, 0.03, 0.15) ; SetCorrelation("GOOG", "MSFT", 0.5) /* Idem SetCorrelation("MSFT", "GOOG", 0.5) */ III. Simuler des actifs Le cours d un actif sous-jacent est aléatoire et il est calculé à partir d un mouvement brownien. Le cours d un produit dérivé est obtenu en appliquant une formule fermée sur le cours de son sous-jacent. C est la classe Simulation qui pilote les simulations. Il est nécessaire d instancier cette classe en précisant les paramètres de la grille de simulation dans le constructeur. pas est le pas de discrétisation de la simulation, nbunitesdetemps est le nombre d unités de temps sur lesquelles on simule et toutcorreler est un booléen indiquant si on simule les actifs financiers sur le même mouvement brownien (corréler tous les actifs à 100%). Activer toutcorreler masque donc toutes les corrélations enregistrées. Simulation(Double pas, int nbunitesdetemps, Boolean toutcorreler) On peut alors ajouter des actifs ou des taux à simuler avec les méthodes : void Simulation.AjouterProduitDeriveALaSimulation(ProduitDerive prod) void Simulation.AjouterSousJacentALaSimulation(SousJacent sj) void Simulation.AjouterTauxALaSimulation(Taux taux) Pour ajouter un produit dérivé, il n est pas nécessaire d ajouter son sous-jacent. Celui-ci sera ajouté automatiquement avant de lancer la simulation, mais n apparaîtra pas dans le tableau des résultats. Pour lancer la simulation, il faut simplement appeler la fonction : Resultat Simulation.Simule() Cette méthode retourne un objet Resultat détaillé dans la section suivante. 5 P a g e
Exemple : Le code suivant simule les deux actifs précédents pendant 6 mois avec 10 subdivisions par mois. Simulation sim = new Simulation(0.1, 6, false); SousJacent action = Univers.GetInstance().GetSousJacent("GOOG"); sim.ajoutersousjacentalasimulation(action); ProduitDerive option = Univers.GetInstance().GetProduitDerive("Call_GOOG"); sim.ajouterproduitderivealasimulation(option); Resultat res = sim.simule(); IV. Exploiter les résultats Les résultats d une simulation sont stockés dans un objet Resultat. Les cours des actifs simulés peuvent être récupérés en faisant appel à la fonction : Double Resultat.Prix(String nomactif, Double date) La date doit être cohérente avec la grille de la simulation. On lève systématiquement une erreur si la date passée en paramètre ne correspond pas à une date de la grille (la fonction ne cherche pas à arrondir à la date de simulation la plus proche). Exemple : avec la simulation précédente Resultat res = sim.simule(); res.prix("goog", 0); // correct, prix spot de l'action res.prix("call_goog", 1.10); // correct, prix à un 1.1 mois de l'option res.prix("call_goog", 1.11); // incorrect, le pas de simulation est de 0.1 res.prix("call_goog", 4); // correct, la maturité de l option est dépassée mais on reste dans l'intervalle de simulation (0 à 6 mois), l option vaut 0 res.prix("call_goog", 7); // incorrect, on n'est plus dans l'intervalle de simulation Les résultats peuvent être exportés dans des fichiers au format CSV et XML avec les fonctions : void Output.simToCSV(String nomfichier) void Output.simToXML(String nomfichier) (cf. section VIII pour la structure des fichiers XML) V. Evaluation d actifs Certains actifs comme les swap, les obligations couponnées et les spot Forex ne sont pas simulables. Il est simplement possible d évaluer leur prix à la date de création du produit. Les fonctions permettant d évaluer les actifs sont les suivantes (elle retournent le prix du produit en date d évaluation): double Swap.Evalue() double ObligationCoupon.Evalue() double SpotForex.Evalue() 6 P a g e
Les résultats peuvent être exportés dans des fichiers au format XML avec la fonction : void Output.evalToXML(String nomfichier) (cf. section IX pour la structure des fichiers XML) VI. Erreurs On lève une exception à chaque utilisation incorrecte d une fonction. On vérifie systématiquement la cohérence des paramètres des fonctions de l API : les références ne doivent pas être à null et certaines valeurs ont des contraintes particulières (comme être positives). On vérifie également les erreurs d exécution plus fines comme la cohérence des actifs dans l univers (deux actifs ne peuvent pas avoir le même nom), les relations entre les actifs (le sous-jacent d un call est obligatoirement modélisé par un mouvement brownien géométrique). 5 Exemple : La fonction AjouterSousJacentPoisson(String nom, Double spot, Double lambda) lève les erreurs suivantes : SjNameException("Erreur : un sous-jacent doit contenir un nom.") si le nom est à null ou la chaine vide. UniversArgumentException("Erreur : L'actif " + nom + " existe déjà dans l'univers.") si un autre actif du même nom existe déjà dans l univers. ArgumentException("Paramètre \"spot\" negatif", "spot") si le spot est négatif ou nul. ArgumentException("Paramètre \"lambda\" negatif", "lambda") si le paramètre lambda est négatif ou nul. On utilise les exceptions fournies par le framework (ArgumentException dans l exemple précédent), et on définit des exceptions génériques (SjNameException et UniversArgumentException dans l exemple précédent) pour factoriser le code. VII. XML Sauvegarde / Restauration de l Univers 1) Structure générale La structure générale du fichier de sauvegarde XML est la suivante : <?xml version="1.0"?> <Univers> <ListeTaux> /* détails des taux */ </ListeTaux> <ListeSousJacents> /* détails des sous-jacents */ </ListeSousJacents> <ListeProduitsDerives> /* détails des produits dérivés */ </ListeProduitsDerives> <MatriceCorrelation> 7 P a g e
/* détails des corrélations */ </MatriceCorrelation> </Univers> 2) Détails des taux A l intérieur de la balise <ListeTaux> doivent être décrits tous les taux de l univers. Pour décrire un taux, on doit : ouvrir une balise <Taux > possédant un attribut nomtaux de valeur le nom du taux. Ouvrir une balise <TauxInit>, écrire la valeur du cours initial du taux, puis refermer le taux initial avec la balise </TauxInit>. Selon le type du taux, plusieurs balises sont à remplir : voici les différents actifs que l on peut ajouter : 2-1) Taux cours modèle Vasicek Ouvrir une balise <TypeTaux> possédant un attribut nomtypetaux de valeur TauxCourtVasicek, puis refermer le type de taux avec la balise </TypeTaux> Ouvrir une balise <Modele>, possédant un attribut nommodele de valeur Vasicek. Ouvrir une balise pour chaque paramètre, donner la valeur du paramètre, puis refermer la balise. Les paramètres à renseigner doivent être indiqués dans l ordre suivant : Volatilite, A, B. Refermer le modèle avec la balise </Modele>. Refermer le taux avec la balise </Taux>. Exemple : <Taux nomtaux="taux 2"> <TauxInit>1</TauxInit> <TypeTaux nomtypetaux="tauxcourtvasicek" /> <Modele nommodele="vasicek"> <Volatilite>0,5</Volatilite> <A>0,3</A> <B>0,2</B> </Modele> </Taux> 2-2) Taux zéro-coupon modèle Vasicek Ouvrir une balise <TypeTaux> possédant un attribut nomtypetaux de valeur TauxZCVasicek, puis refermer le type de taux avec la balise </TypeTaux> Ouvrir une balise <Modele>, possédant un attribut nommodele de valeur Vasicek. Ouvrir une balise pour chaque paramètre, donner la valeur du paramètre, puis refermer la balise. Les paramètres à renseigner doivent être indiqués dans l ordre suivant : Volatilite, A, B. Refermer le modèle avec la balise </Modele>. Refermer le taux avec la balise </Taux>. Exemple : <Taux nomtaux="taux 1"> <TauxInit>1</TauxInit> <TypeTaux nomtypetaux="tauxzcvasicek" /> <Maturite>2</Maturite> <Modele nommodele="vasicek"> <Volatilite>0,5</Volatilite> <A>0,3</A> <B>0,2</B> </Modele> </Taux> 8 P a g e
3) Détails des sous-jacents A l intérieur de la balise <ListeSousJacents> doivent être décrits tous les sous-jacents de l univers. Pour décrire un sous-jacent, on doit : ouvrir une balise <SousJacent> possédant un attribut nomsousjacent de valeur le nom du sous-jacent. Selon le type d actif, plusieurs balises sont à remplir : voici les différents actifs que l on peut ajouter : 3-1) Sous-jacents simples Ouvrir une balise <TypeSousJacent > possédant un attribut nomtypesousjacent de valeur SousJacentSimple Ouvrir une balise <Spot>, écrire la valeur du spot du sous-jacent (valeur initiale du cours), puis refermer le spot avec la balise </Spot>. Ouvrir une balise <Modele>, possédant un attribut nommodele de valeur le nom du modèle mathématique du sous-jacent ("MB", "MBD", "MBG", "MBGDividende", "MBGDividendePro", "Merton", "KouWang", "Vasicek", ou "Poisson"). Ouvrir une balise pour chaque paramètre du modèle mathématique choisi, donner la valeur du paramètre, puis refermer la balise. Les paramètres varient selon le modèle choisi, et doivent être indiqués dans l ordre suivant ; o MB : aucun paramètre. o MBD : Tendance, Volatilite. o MBG : Tendance, Volatilite. o MBGDividende : Tendance, Volatilite, Valeur, Intervalle. o MBGDividendePro : Tendance, Volatilite, Proportion, Intervalle. o Merton : Tendance, Volatilite, Lambda, Alpha, M (moyenne des sauts). o KouWang : Tendance, Volatilite, Lambda, P, Lambda1, Lambda2. o Poisson : Lambda. Refermer le modèle avec la balise </Modele>. Refermer le type de sous-jacent avec la balise </TypeSousJacent>. Refermer le sous-jacent avec la balise </SousJacent>. Exemple : sous-jacent simple mouvement brownien géométrique avec dividendes proportionnels <SousJacent nomsousjacent="action avec dividendes proportionnels"> <TypeSousJacent nomtypesousjacent="sousjacentsimple"> <Spot>100</Spot> <Modele nommodele="mbgdividendepro"> <Tendance>0,5</Tendance> <Volatilite>0,2</Volatilite> <Proportion>1000</Proportion> <Intervalle>0,4</Intervalle> </Modele> </TypeSousJacent> </SousJacent> 3-2) Obligations Ouvrir une balise <TypeSousJacent > possédant un attribut nomtypesousjacent de valeur Obligation 9 P a g e
Ouvrir une balise <Maturite >, écrire la valeur de la maturité (en années), puis refermer la maturité avec la balise </Maturite>. Ouvrir une balise <TypeObligation, possédant un attribut type de valeur le nom du type d obligation ("ZeroCoupon", "ObligationCoupon"). Ouvrir une balise pour chaque paramètre du type choisi, donner la valeur du paramètre, puis refermer la balise. Les paramètres varient selon le modèle choisi, et doivent être indiqués dans l ordre suivant ; o ZeroCoupon : Taux. o ObligationCoupon : TauxCoupon, Valeur, Intervalle, DateEmission. Refermer le type d obligation avec la balise </TypeObligation >. Refermer le type de sous-jacent avec la balise </TypeObligation >. Refermer le sous-jacent avec la balise </SousJacent>. Exemple : obligation avec coupons <SousJacent nomsousjacent="obligation avec coupons"> <TypeSousJacent nomtypesousjacent="obligation"> <Maturite>10</Maturite> <TypeObligation nomtypeobligation="obligationcoupon"> <TauxCoupon>0,3</TauxCoupon> <Valeur>100</Valeur> <Intervalle>0,5</Intervalle> <DateEmission>09/06/2012 00:00:00</DateEmission> </TypeObligation> </TypeSousJacent> </SousJacent> Tous les sous-jacents de l univers doivent être décrits selon les schémas ci-dessus, et écrits les uns à la suite des autres dans la balise <ListeSousJacents>. 4) Détails des produits dérivés A l intérieur de la balise <ListeProduitsDerives> doivent être décrits tous les produits dérivés de l univers. Pour décrire un produit dérivé, on doit : Ouvrir une balise <ProduitDerive> possédant un attribut nomproduitderive de valeur le nom du produit dérivé. Ouvrir une balise <TypeProduitDerive> possédant un attribut nomtypeproduitderive de valeur le nom du type du produit dérivé : "Option", "Swap" ou "SpotForex". 4-1) Dans le cas d une option Ouvrir une balise <SousJacent>, écrire le nom du sous-jacent, puis refermer le sous-jacent avec la balise </SousJacent>. Ouvrir une balise pour chaque paramètre, donner la valeur du paramètre, puis refermer la balise. Les paramètres à renseigner doivent être indiqués dans l ordre suivant : Maturite, Strike, Taux. Ouvrir une balise <TypeOption>, possédant un attribut nomtypeoption de valeur le nom du type de l option ("CallSimple", "CallDividende", "CallDividendePro","PutSimple", "PutDividende","PutDividendePro"). Refermer le type d option avec la balise </TypeOption>. Refermer le type de produit dérivé avec la balise </TypeProduitDerive>. Refermer le produit dérivé avec la balise </ProduitDerive>. Exemple : call sur sous-jacents avec dividendes proportionnels <ProduitDerive nomproduitderive="call avec dividendes proportionnels"> 10 P a g e
<TypeProduitDerive nomtypeproduitderive="option"> <SousJacent>action avec dividendes proportionnels</sousjacent> <Maturite>10</Maturite> <Strike>100</Strike> <Taux>0,05</Taux> <TypeOption nomtypeoption="calldividendepro" /> </TypeProduitDerive> </ProduitDerive> Le sous-jacent dont le nom est indiqué dans la balise <SousJacent> doit impérativement avoir été défini précédemment dans la balise <ListeSousJacents>. 4-2) Dans le cas d un swap Ouvrir une balise pour chaque paramètre, donner la valeur du paramètre, puis refermer la balise. Les paramètres à renseigner doivent être indiqués dans l ordre suivant : Nominal, Maturite, DateEmission, Intervalle1, Intervalle2, Convention1, Convention 2, CaracteristiqueSwap. Ouvrir une balise <TypeSwap>, possédant un attribut nomtypeswap de valeur le nom du type du swap ("SwapTaux", "BasisSwap", "SwapDevise"). Ouvrir une balise pour chaque paramètre du type choisi, donner la valeur du paramètre, puis refermer la balise. Les paramètres à renseigner varient selon le type choisi, et doivent être indiqués dans l ordre suivant : o SwapTaux : TauxFixe, TypeTauxVariable, SpreadTauxVariable. o BasisSwap : TypeTauxVariable1, TypeTauxVariableVariable2, SpreadTauxVariable1, SpreadTauxVariable2. o SwapDevise : DeviseDomestique, DeviseEtrangere, TauxFixeDomestique, TauxFixeEtrangere. Refermer le type de swap avec la balise </TypeSwap>. Refermer le type de produit dérivé avec la balise </TypeProduitDerive>. Refermer le produit dérivé avec la balise </ProduitDerive>. Exemple : swap de devise <ProduitDerive nomproduitderive="swap de devises"> <TypeProduitDerive nomtypeproduitderive="swap"> <Nominal>100</Nominal> <Maturite>10</Maturite> <DateEmission>09/06/2012 00:00:00</DateEmission> <Intervalle1>1</Intervalle1> <Intervalle2>1</Intervalle2> <Convention1>0</Convention1> <Convention2>0</Convention2> <CaracteristiqueSwap>True</CaracteristiqueSwap> <TypeSwap nomtypeswap="swapdevise"> <DeviseDomestique>EUR</DeviseDomestique> <DeviseEtrangere>USD</DeviseEtrangere> <TauxFixeDomestique>0,5</TauxFixeDomestique> <TauxFixeEtrangere>0,3</TauxFixeEtrangere> </TypeSwap> </TypeProduitDerive> </ProduitDerive> 4-3) Dans le cas d un spotforex Ouvrir une balise pour chaque paramètre, donner la valeur du paramètre, puis refermer la balise. Les paramètres à renseigner doivent être indiqués dans l ordre suivant : Pip, SoldeCompte, ValeurInvestie, LevierMax, DeviseCompte, DeviseChange1, DeviseChange2. Refermer le type de produit dérivé avec la balise </TypeProduitDerive>. Refermer le produit dérivé avec la balise </ProduitDerive>. 11 P a g e
Exemple : <ProduitDerive nomproduitderive="operation spot sur Forex"> <TypeProduitDerive nomtypeproduitderive="spotforex"> <Pip>0,0001</Pip> <SoldeCompte>1919,76249699109</SoldeCompte> <ValeurInvestie>10000</ValeurInvestie> <LevierMax>200</LevierMax> <DeviseCompte>EUR</DeviseCompte> <DeviseChange1>EUR</DeviseChange1> <DeviseChange2>USD</DeviseChange2> </TypeProduitDerive> </ProduitDerive> 5) Détails des corrélations Les corrélations entre les sous-jacents, taux sont spécifiées dans la balise <MatriceCorrelation>. Par défaut, la matrice de corrélation entre les sous-jacents, taux est la matrice identité (tous les sousjacents et taux sont indépendants, donc de corrélation nulle). Pour modifier la corrélation entre deux actifs, il suffit d ouvrir une balise <Cellule> avec deux paramètres actif1 et actif2 de valeur les noms des deux sous-jacents à corréler, d écrire la valeur de la nouvelle corrélation, puis de fermer la corrélation avec la balise </Cellule>. Exemple : corrélation correcte en XML : <Cellule actif1=" nom de l actif 1" actif2="nom de l actif 2">0,5</Cellule> Les corrélations doivent être mises à la suite dans la balise <MatriceCorrelation>. Si une corrélation entre deux sous-jacents est définie plus d une fois, c est la dernière valeur qui est conservée par l application lors de la restauration d un univers. Remarque : Les flottants doivent être entrés dans le fichier XML avec une virgule et non un point. 6) Exemple complet Nous détaillons ici un exemple de simulation traduit en fichier XML dans lequel on définit un taux Taux1, un sous-jacent simple SJ1, une obligation Obl1 et un produit dérivé P1 vérifiant : Taux 1 est un taux court modèle Vasicek de volatilité 0.5, de coefficient A = 0.3, B = 0.2 et de valeur initial 1. SJ1 est un actif de spot 100 et ayant pour modèle le mouvement brownien géométrique de paramètres une tendance de 0.05 et une volatilité de 0.2. Obl1 est une obligation de nominal 100, de maturité 10 ans, versant des coupons de 5%, et ayant été émise le 15 février 2012. P1 est une option d achat (produit dérivé de type Call européen simple) portant sur le sous-jacent SJ1, de prix d exercice 90 (strike) et de maturité 10 sous un taux d intérêt de 0.04. <?xml version="1.0"?> <Univers> <ListeTaux> <Taux nomtaux="taux1"> <TauxInit>1</TauxInit> <TypeTaux nomtypetaux="tauxcourtvasicek" /> 12 P a g e
<Modele nommodele="vasicek"> <Volatilite>0,5</Volatilite> <A>0,3</A> <B>0,2</B> </Modele> </Taux> </ListeTaux> <ListeSousJacents> <SousJacent nomsousjacent="sj1"> <TypeSousJacent nomtypesousjacent="sousjacentsimple"> <Spot>100</Spot> <Modele nommodele="mbg"> <Tendance>0,05</Tendance> <Volatilite>0,2</Volatilite> </Modele> </TypeSousJacent> </SousJacent> <SousJacent nomsousjacent="obl1"> <TypeSousJacent nomtypesousjacent="obligation"> <Maturite>10</Maturite> <TypeObligation nomtypeobligation="obligationcoupon"> <TauxCoupon>0,05</TauxCoupon> <Valeur>100</Valeur> <Intervalle>1</Intervalle> <DateEmission>15/02/2012 00:00:00</DateEmission> </TypeObligation> </TypeSousJacent> </SousJacent> </ListeSousJacents> <ListeProduitsDerives> <ProduitDerive nomproduitderive="p1"> <TypeProduitDerive nomtypeproduitderive="option"> <SousJacent>SJ1</SousJacent> <Maturite>2</Maturite> <Strike>90</Strike> <Taux>0,04</Taux> <TypeOption nomtypeoption="callsimple" /> </TypeProduitDerive> </ProduitDerive> </ListeProduitsDerives> <MatriceCorrelation> <Cellule actif1="sj1" actif2="sj1">1</cellule> <Cellule actif1="sj1" actif2="taux1">0</cellule> <Cellule actif1="taux1" actif2="sj1">0</cellule> <Cellule actif1="taux1" actif2="taux1">1</cellule> </MatriceCorrelation> </Univers> VIII. XML Exportation des cours simulés 1) Structure générale La structure générale du fichier reprend la précédente (il n y a pas de section pour les corrélations) : <?xml version="1.0"?> <Simulation> <ListeTaux> /* détails des taux */ </ListeTaux> <ListeSousJacents> 13 P a g e
/* détails des sous-jacents */ </ListeSousJacents> <ListeProduitsDerives> /* détails des produits dérivés */ </ListeProduitsDerives> </Simulation> Après chaque ouverture/fermeture de <Taux>, <SousJacent> ou <ProduitDerive> on ajoute les cours. Pour décrire un cours, on doit ouvrir une balise <Valeur> possédant un attribut indice de valeur le cours de l actif à la date indice (l attribut est nommé ainsi car la date coïncide avec l indice du cours dans les structures de données interne). 2) Exemple complet Nous détaillons ici un exemple de simulation traduit en fichier XML dans lequel on définit un sousjacent SJ1 et un produit dérivé P1 vérifiant : SJ1 est un actif de spot 100 et ayant pour modèle le mouvement brownien géométrique de paramètres une tendance de 0.05 et une volatilité de 0.2. P1 est une option d achat (produit dérivé de type Call européen simple) portant sur le sous-jacent SJ1, de prix d exercice 90 (strike) et de maturité 2 sous un taux d intérêt de 0.04. La simulation s effectue sur une durée de 5 unités de temps subdivisées en 2 simulations. <?xml version="1.0"?> <Simulation> <ListeTaux /> <ListeSousJacents> <SousJacent nomsousjacent="sj1"> <TypeSousJacent nomtypesousjacent="sousjacentsimple"> <Spot>100</Spot> <Modele nommodele="mbg"> <Tendance>0,05</Tendance> <Volatilite>0,2</Volatilite> </Modele> </TypeSousJacent> </SousJacent> <Valeur indice="1">100</valeur> <Valeur indice="2">112,35409</valeur> <Valeur indice="3">137,11955</valeur> <Valeur indice="4">139,30552</valeur> <Valeur indice="5">160,54333</valeur> <Valeur indice="6">182,13675</valeur> <Valeur indice="7">184,95295</valeur> <Valeur indice="8">147,8214</valeur> <Valeur indice="9">163,55084</valeur> <Valeur indice="10">203,87873</valeur> <Valeur indice="11">195,21022</valeur> </ListeSousJacents> <ListeProduitsDerives> <ProduitDerive nomproduitderive="p1"> <TypeProduitDerive nomtypeproduitderive="option"> <SousJacent>SJ1</SousJacent> <Maturite>2</Maturite> <Strike>90</Strike> <Taux>0,04</Taux> <TypeOption nomtypeoption="callsimple" /> </TypeProduitDerive> 14 P a g e
</ProduitDerive> <Valeur indice="1">20,86781</valeur> <Valeur indice="2">29,07052</valeur> <Valeur indice="3">50,72671</valeur> <Valeur indice="4">51,09023</valeur> <Valeur indice="5">70,54333</valeur> <Valeur indice="6">0</valeur> <Valeur indice="7">0</valeur> <Valeur indice="8">0</valeur> <Valeur indice="9">0</valeur> <Valeur indice="10">0</valeur> <Valeur indice="11">0</valeur> </ListeProduitsDerives> </Simulation> IX. XML Exportation des évaluations 1) Structure générale La structure générale du fichier reprend la précédente (il n y a pas de section pour les corrélations) : <?xml version="1.0"?> <Simulation> <ListeTaux> /* détails des taux */ </ListeTaux> <ListeSousJacents> /* détails des sous-jacents */ </ListeSousJacents> <ListeProduitsDerives> /* détails des produits dérivés */ </ListeProduitsDerives> </Simulation> Après chaque ouverture/fermeture de <Taux>, <SousJacent> ou <ProduitDerive> on ajoute les évaluations. Pour décrire une évaluation : Ouvrir une balise <DateEvaluation>, écrire la date d évaluation, puis refermer la date d évaluation avec la balise </DateEvaluation>. Ouvrir une balise <ValeurEvaluation>, écrire la valeur d évaluation, puis refermer la valeur d évaluation avec la balise </ValeurEvaluation>. 2) Exemple complet Nous détaillons ici un exemple d évaluations traduites en fichier XML dans lequel on définit une obligation Obl1 et un basis swap Swap1 vérifiant : Obl1 est une obligation de nominal 100, de maturité 2 ans, versant des coupons de 5%, et ayant été émise le 3 avril 2012. Swap1 est un basis swap sur un nominal de 100, de maturité 10 ans, échangeant annuellement de l Euribor 1 mois contre de l Euribor 7 mois + 5 bps créé le 3 avril 2012. <?xml version="1.0"?> <Evaluation> <ListeSousJacents> 15 P a g e
<SousJacent nomsousjacent="obl1"> <TypeSousJacent nomtypesousjacent="obligation"> <Maturite>2</Maturite> <TypeObligation nomtypeobligation="obligationcoupon"> <TauxCoupon>0,05</TauxCoupon> <Valeur>100</Valeur> <Intervalle>0,5</Intervalle> <DateEmission>03/04/2012 00:00:00</DateEmission> </TypeObligation> </TypeSousJacent> </SousJacent> <DateEvaluation>12/06/2012 00:00:00</DateEvaluation> <ValeurEvaluation>119,054595980994</ValeurEvaluation> </ListeSousJacents> <ListeProduitsDerives> <ProduitDerive nomproduitderive="swap1"> <TypeProduitDerive nomtypeproduitderive="swap"> <Nominal>100</Nominal> <Maturite>10</Maturite> <DateEmission>03/04/2012 00:00:00</DateEmission> <Intervalle1>1</Intervalle1> <Intervalle2>1</Intervalle2> <Convention1>0</Convention1> <Convention2>1</Convention2> <CaracteristiqueSwap>True</CaracteristiqueSwap> <TypeSwap nomtypeswap="basisswaptaux"> <TypeTauxVariable1>1</TypeTauxVariable1> <TypeTauxVariable2>7</TypeTauxVariable2> <SpreadTauxVariable1>0</SpreadTauxVariable1> <SpreadTauxVariable2>5</SpreadTauxVariable2> </TypeSwap> </TypeProduitDerive> </ProduitDerive> <DateEvaluation>12/06/2012 00:00:00</DateEvaluation> <ValeurEvaluation>-0,0511965305667843</ValeurEvaluation> </ListeProduitsDerives> </Evaluation> 16 P a g e