Interfacing Excel with The Grid Jeremy Serror Financial library Interfaces XML Exportation Remote Execution Interfacing Excel with the grid Introduction Les interfaces de la librairie - Deux interfaces classiques XLL et COM - Une nouvelle interface XML+JNI Représentation des calculs en XML - Exportation à partir d’Excel - Arbre d’appels Client – Serveur: Excel Futur: Sensibilités et grille de calcul 2/28 Projet Hedge - ANR-05-CIGC-GCMPF Introduction Microsoft Excel: un standard en banques d’investissement - Excel comme client d’une grille de calcul - Price-it librairie d’extension (add-in) Une nouvelle interface à la librairie est nécessaire - JNI Représentation des calculs en XML L’exécution à distance d’appels à la librairie - Première étape vers le grid computing 3/28 Projet Hedge - ANR-05-CIGC-GCMPF Utilisation d’Excel avec une librairie de valorisation (Price-it) Price-it - Une libraire de valorisation de produits dérivés - Code C++ interfacé avec Excel Excel - On peut appeler les fonctions Price-It depuis Excel • 4/28 Comment exécuter ces appels à distance en vue d’une distribution? Projet Hedge - ANR-05-CIGC-GCMPF Les interfaces en standard XLL et COM Deux interfaces à la librairie sont couramment utilisées en banques: XLL et COM - XLL: Une interface spécifique à Excel : interaction totale en Excel et le code C++ - Une fonction C++ est exposée dans Excel grâce à un fichier de description: " XLL_MktData_ZcCrv_Create", /// function name " RRRRRRRRRRRRRR", ///14 arguments = 13 inputs + 1 output " PILX_MktData_ZcCrv_Create", /// exported name " [asOfDate],ccy,dataTickers,dataValues [..] for optional XLL_PIL_MKTDATA_GROUP, " Creates a bootstraped par interest curve " " as of date DEFAULT = ExcelTodayDate() ", 5/28 Projet Hedge - ANR-05-CIGC-GCMPF L’Interface XLL XLOPER le type de données d’Excel - Polymorphisme • 10 octets = 2 octets pour le type + 8 octets de données - Conversion requise entre XLOPER et les types C++ • Le rôle principal du wrapper est d’effectuer cette conversion xltypeNum xltypeStr xltypeBool xltypeRef xltypeErr xltypeFlow xltypeMulti xltypeMissing xltypeNil xltypeSRef xltypeInt xltypeBigData 6/28 Numeric (IEEE floating-point) String (byte-counted) Logical (TRUE or FALSE) General reference (external and/or disjoint) Error Flow control in a macro Array Missing argument in a function call None (for example, an empty cell) Single rectangular reference to current sheet Integer Persistent data storage Projet Hedge - ANR-05-CIGC-GCMPF Le wrapper XLL __declspec(dllexport) LPXLOPER WINAPI XLL_MktData_ZcCrv_Create( LPXLOPER xl_asOfDate, LPXLOPER xl_ccy, LPXLOPER xl_dataTickers, …) { static XLOPER xl_result; /// read inputs double asOfDate_double; XLOperManip::XL_readNumCell( xl_asOfDate,asOfDate_double); string ccy; XLOperManip::XL_readStrCell( xl_ccy, ccy); /// . . . /// The C++ function in now called PIL_RootObjectPtr result = MktData_ZcCrv_Create( asOfDate, ccy, dataTickers, …); AssignObjectToCurrentCell( result, xl_result ); return (LPXLOPER) &xl_result; } 7/28 Projet Hedge - ANR-05-CIGC-GCMPF L’interface COM et le type VARIANT L’interface COM Deux wrappers sont requis - Un pour l’appel C++ (VARIANT <–> C++) - Un pour l’appel depuis Excel (nécessité de passer par VBA) COM permet l’exécution à distance - Non portable (technologie Microsoft) - Difficile de l’utiliser une grille Unix Une nouvelle interface est nécessaire… 8/28 Projet Hedge - ANR-05-CIGC-GCMPF L’interface JNI Utilisation de Java - Cross-platform - Utilisation de ProActive - Facilite l’utilisation d’XML La Java Native Interface - Appel du code C++ depuis Java - Un wrapper est requis (JObject <–> C+) Trois interfaces existent - Génération automatique des interfaces - Généricité possible vis-à-vis de la librairie 9/28 Projet Hedge - ANR-05-CIGC-GCMPF Génération des interfaces Addins generator - Parcours du code C++ - Récupère les informations dans les commentaires (ala Doxygen) - Génère les fichiers de description Excel et les 3 wrappers 10/28 Projet Hedge - ANR-05-CIGC-GCMPF Le code généré ////////////////////////////////////////////////// C++ /// EXPORT_FUNCTION_DEF /// Category : XLL_PIL_MKTDATA_GROUP /// Description : Creates a bootstraped par interest curve ////////////////////////////////////////////////// GENERICPRICER_API PIL_RootObjectPtr MktData_ZcCrv_Create( const PIL_Date& asOfDate, /// as of date ;DEFAULT=ExcelTodayDate() const string& ccy /// currency of the curve C++ __declspec(dllexport) LPXLOPER WINAPI XLL_MktData_ZcCrv_Create( XLL LPXLOPER xl_asOfDate, LPXLOPER xl_ccy, …) { static XLOPER xl_result; C++ double asOfDate_double; XLOperManip::XL_readNumCell( xl_asOfDate, asOfDate_double); PIL_Date asOfDate = ConvertXLDateToJulian( asOfDate_double ); PIL_RootObjectPtr result = MktData_ZcCrv_Create( asOfDate, ccy,..); JNIEXPORT jobject JNICALL JNI Java_xmlpil_jni_PIMAddinsProxy_MktData_1ZcCrv_1Create(JNIEnv *env, jclass jcl, jobject jasOfDate, jobject jccy, … ) { jobject jresult; double asOfDate_double = ReadDouble(env, jasOfDate ); string ccy = ReadString(env, jccy ); PIL_RootObjectPtr result = MktData_ZcCrv_Create( asOfDate, ccy,..); 11/28 Projet Hedge - ANR-05-CIGC-GCMPF Bilan sur les interfaces Core Library C++ XLL J Object COM Http Server VBA Http Client J NI XML XLOPER VARIANT Microsoft Excel Three interfaces are available: XLL, COM and J NI 12/28 Projet Hedge - ANR-05-CIGC-GCMPF XML : représentation indépendante des interfaces Un schéma XML simple - Permet de communiquer avec la libraire quelque soit l’interface choisie - Contient données et appels de fonctions : distribution des calculs <pil_addin name="MktData_ZcCrv_Create"> <pil_parameters> <pil_parameter name="asOfDate" type="data" value="38828" /> <pil_parameter name="ccy" type="data" value="EUR" /> <pil_parameter name="mktNames" type="array" rows="31" cols= <item type="data" value="2D" /> <item type="data" value="1M" /> </pil_parameter> <pil_parameter name="mktData" type="array" rows="31" cols="1 <item type="data" value="2.07" /> <item type="data" value="2.1375" /> </pil_parameter> </pil_parameters> </pil_addin> 13/28 Projet Hedge - ANR-05-CIGC-GCMPF Exportation XML Exportation depuis Excel - Parcours récursif des appels de fonctions - Extraction de la représentation XML - Envoi vers un serveur JAVA/JNI/C++ Un problème à résoudre: les références - Les objets C++ ne sont pas sérialisables - Exporter plusieurs appels en un seul message 14/28 • Limite les allers-retours Client-Server • Permet de représenter le calcul d’un prix de manière autosuffisante Projet Hedge - ANR-05-CIGC-GCMPF Les références et l’arbre XML Un objet C++ n’est pas sérialisable directement - Dans Excel, on retourne une chaîne de caractères ID - Association d’une adresse interne au résultat d’une fonction - Le serveur Java effectue la « conversion » des adresses <pil_addin name="MktData_ZcCrv_Create" address="74"> XML <pil_parameters>…</pil_parameters> </pil_addin> <pil_addin name="Apply_Shift" address="76"> <pil_parameters> <pil_parameter name="bumpValue" type="data" value="0.1" /> <pil_parameter name="curve" type="inref" value="74" /> </pil_parameters> </pil_addin> 15/28 Projet Hedge - ANR-05-CIGC-GCMPF Le Client-Serveur Java Excel est prêt pour le grid computing - Amélioration: Export XML indépendant d’Excel(intégration dans la librairie) - ProActive: Prototype réalisé, remplacement de la communication HTTP par appel de méthodes sur Objet Actifs Http Client (C#) Excel XML Message XLL Client Side 16/28 Projet Hedge - ANR-05-CIGC-GCMPF HTTP Server (J ava) XML Parser (J ava) J NI Proxy for J ava Native functions J VM Price-It C++Core DLL La suite du projet Scénarios de sensibilités - Transfert en XML, expansion des scénarios dans la grille - Découpage générique des calculs Distribution des calculs - Réception des scénarios par un master - Expansion en pricings, puis ventilation sur les masters - Etude théorique des politiques d’ordonnancement • Divisible Load Theory - Expérimentation à grande échelle 17/28 Projet Hedge - ANR-05-CIGC-GCMPF Prototype et premiers résultats Un prototype simple distribue des calculs de prix Client Client Client Calcul d'un scenario de 40 prix 7 Scé nar io J ob of Client 2 J ob of Client 2 6 Master Result for client 1 Découpage XML Result for client 3 Contrôle des workers J ob of Client 1 Ordonnancement des calculs J ob of Client 1 5 Speed-up J ob of Client 5 Prix WQ ulés calc 4 3 2 HTTP Server (J ava) HTTP Server (J ava) 1 J NI J NI 0 Price-It C++Core 18/28 Workers Price-It C++Core Projet Hedge - ANR-05-CIGC-GCMPF 0 1 2 3 4 Nombre de workers 5 6 7 Conclusion Trois interfaces à la librairie - Génération automatique - Instanciation de la librairie en environnement UNIX et Windows Représentation self-contained XML - Données et calculs dans un message XML - Distribution de calculs indépendants Un client server en Java - Première étape du grid computing - Evolution vers ProActive Merci 19/28 Projet Hedge - ANR-05-CIGC-GCMPF