L'objectif de ce projet est d'implémenter une application permettant de couvrir des produits dérivés dans un cadre plus général que celui du Projet de Couverture de Produits Dérivés: l'application développée permettra de couvrir des produits dérivés basés sur un calendrier réel, et versant plusieurs flux.
La réalisation de ce projet permettra à chaque élève:
- De comprendre de quelle façon peut être couvert un produit dérivé multiflux.
- D'implémenter de bout en bout une application composée de deux parties:
- Une application financière à laquelle sont fournies les données financières, qui gère les dates de constatation et constitue le portefeuille de couverture.
- Une application mathématique dont le rôle est de calculer les quantités de sous-jacent à détenir dans le portefeuille de couverture.
On considère un entier
Le produit dérivé verse le flux
- Le projet devra être réalisé en binômes.
- L'application financière devra être codée en C# (.NET 6). Il s'agira d'une application console qui prend en entrée une configuration de produit et des données de marché, et fournit en sortie deux fichiers csv sans entête contenant pour l'un les champs date et prix théorique, et pour l'autre les champs date et valeur du portefeuille de couverture.
- Le coeur de calcul devra être codé en C++.
- La communication entre l'application financière et le coeur de calcul se fera à l'aide d'un client et d'un serveur gRPC.
flowchart LR
subgraph Input
direction LR
md(Market data)
tp(Test parameters)
end
subgraph
direction TB
subgraph Pricing engine
pr(Pricer)
end
subgraph gr [gRPC]
direction LR
cl(gRPC client)
cl <--> sr(gRPC server)
end
subgraph ht [Financial app]
md --> hd(Hedging engine)
hd -->pf(Portfolio)
tp --> hd
end
end
subgraph out [Output]
pf --> cs(csv files)
end
hd <--> cl
sr <--> pr
- Faire valider l'architecture et le principe mathématique de couverture
- Réussir à faire communiquer le client et le serveur grpc (squelettes)
- Implémentation d'un outil qui couvre un call vanille
- Implémentation d'un outil qui couvre un call avec barrière discrète
- Implémentation d'un outil qui couvre un produit versant
$2$ flux - Implémentation d'un outil qui couvre un produit versant
$n>2$ flux
Le moteur de calcul codé en C++ utilisera les outils/libraires suivantes
-
CMake
-
Une version récente de
g++
ouclang++
. -
PNL : installer la dernière version à partir de https://github.com/pnlnum/pnl/releases. Sous Ubuntu, il faut préalablement installer
libblas-dev
,liblapack-dev
etgfortran
. -
Une libraire de manipulation de fichiers
.json
en C++ : nlohmann_json. Cette librairie est disponible dans la plupart des gestionnaires de paquets- Homebrew :
brew install nlohmann-json
- Ubuntu : installer
nlohmann-json3-dev
.
Voir un exemple d'utilisation dans
PricerEngine/test_json_reader.cpp
. - Homebrew :
-
Installer
grpc
etprotobuf
- Homebrew :
brew install grpc
- Ubuntu : installer
protobuf-compiler
etlibgrpc++-dev
- Homebrew :
- Prérequis: avoir installé CMake (de préférence Cmake gui) et git sur la machine.
- Télécharger et installer vcpkg depuis github en suivant les instructions fournies.
- Se servir de vcpkg pour installer Protobuf, gRPC et nlohmann-json en version 64 bits:
- .\vcpkg.exe install protobuf:x64-windows
- .\vcpkg.exe install grpc:x64-windows
- .\vcpkg.exe install nlohmann-json:x64-windows
- Dans Cmake-gui, ajouter les deux entrées suivantes:
- CMAKE_PREFIX_PATH: chemin vers le dossier de libpnl qui contient les répertoires lib et include
- CMAKE_TOOLCHAIN_FILE: chemin vers le fichier [racine vcpkg]/scripts/buildsystems/vcpkg.cmake
- SSL is not found on OSX : Avant de lancer
cmake
, exécuterexport PKG_CONFIG_PATH="/usr/local/opt/openssl/lib/pkgconfig"
- Intellisense does not find
pricing.grpc.pb.h
: ajouter le répertoire debuild
à la liste des répertoires utilisés par intellisense. Sous VS Code, ajouter${workspaceFolder}/PricerEngine/build
àincludePath
. - Client .NET (GrpcPricer.GrpcPricerClient dans le code ci-dessous) invoquant un serveur via http au lieu de https: configurer le client de la façon suivante:
var httpHandler = new HttpClientHandler();
// Return `true` to allow certificates that are untrusted/invalid
httpHandler.ServerCertificateCustomValidationCallback =
HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
using var channel = GrpcChannel.ForAddress("http://localhost:5079",
new GrpcChannelOptions { HttpHandler = httpHandler });
var client = new GrpcPricer.GrpcPricerClient(channel);
- Présentation des principes SOLID