Développement d`une interface Web - iWW
Transcription
Développement d`une interface Web - iWW
DÉVELOPPEMENT ET AMÉLIORATION D’INTERFACES POUR PREMIA Anton Kolotaev, Ingénieur spécialiste, Projet MATHFI PREMIA Consacrée à l’évaluation et la couverture de produits dérivés sur actions, taux d’intérêt, crédit et énergie. Développée par équipe MATHFI à l’INRIARocquencourt et par CERMICS à l’ENPC 14 versions sont délivrées depuis 1999 Comporte 525 méthodes de pricing de 114 produits dérivés pour 64 modèles du marché 31 Mo de code source C/C++ PREMIA Plateformes cibles: *nix Windows Interfaces: Console Scilab/NSP Excel 2003 Objectifs de l’ADT Développer et améliorer des interfaces pour Premia afin de la rendre plus visible dans le monde bancaire et dans le monde de la recherche Appel des fonctionnalités de Premia via des scripts Python. Développement d’une interface Web. Adaptation de l’interface Excel pour les nouvelles versions d’Excel Travaux réalisés I Bibiothèque générique qui facilite le développement de bindings pour Premia vers toute la variété de langages cibles: Python, OCaml, C#/F#, Java/Scala… Bindings vers Python (utilsé par Zéliade, BNP, EDF etc) F# (« OCaml pour .NET » utilisé dans certaines banques comme Crédit Suisse) Karrigell (un canevas Web utilisé pour créer l’interface Web) Une interface Web permettante de lancer de différentes méthodes de Premia Travaux réalisés II Amélioration du système de la documentation Amélioration de l’architecture de Premia afin d’assurer une cohérence entre ses entités et leur documentation Développement d’un outil qui permet de vérifier l’absence de liens suspendus dans un ensemble de documents TeX Amélioration de la version Premia pour Windows Adaptation de l’interface Excel pour les versions Excel 2007/2010 Mise à jour de l’installateur de Premia pour Windows Travaux restants Pour les 3 mois jusqu’à la fin du contrat, il reste encore deux tâches secondaires à accomplir: parfaire la documentation de tous les outils développés améliorer l’interface Web Premia pour Python # importation des modèles, des options et des méthodes de premia >>>from premia import * >>>dir(models) # énumère des modèles disponibles [’Affine3d’, ’BharChiarella1d’, . . . >>>mod = models.BlackScholes1dim () # crée un modèle >>>opt = options.PAD.AsianCallFixedEuro() # crée une option >>>met = pricings.BS1D.BS1D_PAD.FD_FixedAsian_RodgerShi() >>>mod # imprime les champs du modèle Model BlackScholes1dim { ’Trend’: 0, ’Annual_Interest_Rate’: 10, ’Spot’: 100, ’Annual_Dividend_Rate’: 0, ’Current_Date’: 0, ’Volatility’: 0.2 } Premia pour Python >>>mod.Volatility = 0.3 # changement du valeur de l’attribut >>>mod Model BlackScholes1dim { ’Trend’: 0, ’Annual_Interest_Rate’: 10, ’Spot’: 100, ’Annual_Dividend_Rate’: 0, ’Current_Date’: 0, ’Volatility’: 0.3 } >>>mod.Volatility = -0.3 # tentative d’une affectation incorrecte AssertionError: 0 <= x where x is -0.3 >>>met.compute(opt,mod) # computation du prix [('Price', 8.946371842034559), ('Delta', 0.6157305622842775)] Architecture des bindings pour Premia Premia Premia Runtime Library Représentation orientée objets de Premia générateur des bindings pour F# Moteur de modèles générateur des bindings pour Python générateur des bindings pour Karrigell Bindings F# Python extension module Bindings Python Interface Web Premia Runtime Library void setCurrentModel (int model_id) // choisit un modèle du marché void setCurrentOption (int family_id, int option_id) // choisit un produit dérivé void setCurrentMethod (int pricing_id, int method_id) // choisit une méthode de calcul /* transfert de paramèters de différents types vers Premia */ void write_double (double x) void write_int (int x) void write_enum (int x) void write_array (int array_size) /* effectue des calculs à condition que tous les paramèters soient transmis */ void compute() /* récupération de résultats du calcul à condition qu’il soit déjà accompli */ double get_result_double (int idx) int get_result_array_size (int idx) double get_result_array_item (int idx, int array_idx) Enveloppes générées pour Python class TR_Ritchken_DownOut(object): def __init__(self): self._StepNumber = 100 self._Lambda = 1.224734 def makeCurrent(self): # rend la méthode courante dans Premia Runtime Library from premia import interop # charge le module d’extension Premia paresseusement interop.setCurrentAsset(0) interop.setCurrentMethod(1, 23) # choisit la méthode dans Premia interop.write_int(self._StepNumber) # tranfère ses paramètres interop.write_double(self._Lambda) # vérifie que tous les paramètres requis pour l’initialisation correct de la méthode soient transmis interop.stopWriteParameters() def compute(self, opt, mod): from premia13 import interop mod.makeCurrent() opt.makeCurrent() self.makeCurrent() interop.compute() return [ ('Price', interop.getResultDouble(0)), ('Delta', interop.getResultDouble(1)), ] # calcule le prix de l’option ‘opt’ dans le modèle ‘mod’ # transfère les paramètres du modèle vers Premia # transfère les paramètres de l’option vers Premia # transfère les paramètres de la méthode vers Premia # fait le module d’extension Premia calculer le prix # compose le résultat Enveloppes générées pour F# type TR_Ritchken_DownOut = { StepNumber : int Lambda : float } with interface IPremiaObj with member x.makeCurrent() = // rend la méthode courante dans Premia Runtime Library setCurrentAsset(0) setCurrentMethod(1, 23) // choisit la méthode dans Premia write_int(x.StepNumber) // tranfère ses paramètres write_double(x.Lambda) stopWriteParameters() (* calcule le prix de l’option ‘opt’ dans le modèle ‘mod’ *) member private x.compute'(opt : #IPremiaObj, model : #IPremiaObj) = model.makeCurrent() // transfère les paramètres du modèle vers Premia opt.makeCurrent() // transfère les paramètres de l’option vers Premia x.makeCurrent() // transfère les paramètres de la méthode vers Premia compute() // fait le module d’extension Premia calculer le prix { // compose le résultat Price = get_result_double(0) Delta = get_result_double(1) } Moteur de modèles Formatter(ctx.filename(m)) ("NAME", m.name) ("ASSET_ID", id(m.asset)) ("MODEL_ID", id(m)) << (seq, "from ...common import *", "class %NAME%(object):", +(seq, "def __init__(self):", +call(boost::bind(print::Initializers, _1, m.members)), "", foreach(m.members, print::Property), "def __repr__(self): return getRepr(self, 'Model')", "", "def makeCurrent(self):", +(seq, "from premia import interop", "interop.setCurrentAsset(%ASSET_ID%)", "interop.setCurrentModel(%MODEL_ID%)", foreach(m.members, print::copy_param), "interop.stopWriteParameters()" ), "", "@staticmethod", "def parameters(): ", +(seq, "return [", +foreach(m.members, print::member), "]") )); Interface Web Interface Web