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