Réalisation d'un programme de couverture d'un portefeuille de swap
Principe de la couverture
Pour avancer un peu plus loin dans l’utilisation de Visual Basic, vous allez supposer que vous possédez un portefeuille d’engagement sur des swaps, que vous souhaitez immuniser contre des variations de la courbe des taux. Pour vous couvrir, vous utiliserez les swaps du marché.
La fonction BPVCbSwap vous permet de déterminer les variations de valeurs d’un swap, pour des variations de 1 point de base de chaque point de la courbe des taux. Si la courbe des taux possède M plots de maturité et que le portefeuille Np swaps, alors la sensibilité au plot i du portefeuille, SP(i), est égale à la somme de la sensibilité des swaps au plot i :
Où i=1 à M.
Par conséquent, le vecteur de sensibilités du portefeuille est égal à la somme des vecteurs de sensibilité de chaque instrument.
Vous devez trouver le portefeuille d’instrument de couverture, dont la sensibilité, SC(i), sera de sens inverse à la sensibilité du portefeuille à couvrir.
SC(i)=-SP(i)
Si vous disposez de Nc instruments de couverture, vous pouvez déterminer le vecteur de sensibité de chaque instrument avec la fonction BPVCbSwap pour un euro de nominal. Vous cherchez donc les quantités Qk telles que :
Où SICk(i) est la sensibilité au plot i de l’instrument de couverture k et
Déroulement du programme
Le programme va se dérouler en 5 étapes. La première sera la saisie des données grâce à un formulaire. Vous verrez comment le créer et le manipuler. La seconde étape concernera le calcul des sensibiltés du portefeuille. Dans la troisième étape, vous déterminerez les sensibiltés de chaque instrument de couverture. Ensuite vous utiliserez les fonctions de calcul matriciel pour déterminer le portefeuille de couverture et enfin vous sortirez ce portefeuille sur une feuille.
Construction d’un formulaire
Un formulaire permet les interactions entre un programme et l’utilisateur. Dans le cas présent, vous souhaitez que l’utilisateur indique quatre zones et une donnée :
-
La plage de cellules contenant le portefeuille à couvrir,
-
la plage de cellules contenant les instruments de couverture,
-
la plage de cellules contenant la courbe de taux,
-
la date de calcul,
-
la cellule à partir de laquelle vous allez sortir les résultats.
Comme dans tous les formulaires, vous ajouterez un bouton permettant de valider les données et un bouton pour annuler la saisie.
Pour commencer, dans VBE, ajoutez un formulaire par le menu Insertion - UserForm.
Sur votre écran s’affiche un formulaire vierge et une boîte à outils.
Si la boîte à outils ne s’affiche pas, vous pouvez y accéder par le menu Affichage - Boîte à outils.
Propriété : Name
Vous pouvez attribuer un nom au UserForm. Pour cela, affichez si ce n’est déjà fait, la fenêtre Propriétés à l’aide du menu Affichage - Fenêtre Propriétés (ou F4). La fenêtre des propriétés de l’objet actif, ici le formulaire, apparaît dans le coin inférieur gauche de l’écran. Dans la liste des propriétés se trouve "(Name)". Saisissez dans le champ...
Code de gestion du formulaire
En utilisant le menu Affichage - Code, vous accédez au module lié au formulaire.
Dans le menu déroulant en haut à gauche apparaissent le formulaire et l’ensemble de ses contrôles.
En sélectionnant "UserForm", les événements associés au formulaire apparaissent dans la liste déroulante de droite. Par exemple, l’évènement "Click" permet d’exécuter du code chaque fois que l’utilisateur clique sur le formulaire.
Sélectionnez l’évènement "Initialize" afin d’effectuer des actions lors du chargement du formulaire, avant que ce dernier ne soit visible.
L’affichage d’un formulaire se fait en deux temps. Le premier correspond à l’initialisation, ou chargement en mémoire du formulaire. Le formulaire n’est pas encore visible, mais ses éléments sont déjà accessibles. Pour charger le formulaire vous utilisez la commande "Load" :
Load NomDuFormulaire
Le déchargement du formulaire se fait par la commande "UnLoad" :
UnLoad NomDuFormulaire
Pour rendre visible le formulaire par l’utilisateur, il faut utiliser la méthode "Show" du formulaire :
NomDuFormulaire.Show
À l’inverse, pour cacher le formulaire, vous devez utiliser la méthode "Hide" :
NomDuFormulaire.Hide
À partir du moment où le formulaire est visible, la macro qui l’a appellée est en pause. Seul le code lié aux évènements du formulaire s’exécute. Une fois le formulaire caché, la macro reprend.
En utilisant l’évènement "Initialize" du formulaire, vous initialiserez le contrôle "tbDateDeCalcul" avec la date du jour.
Dans le module de code lié à "FormDeSaisie", il est possible d’accéder à l’objet formulaire de deux manières. Soit par son nom, soit par l’alias "Me". Rappelez vous que les appels des objets, méthodes ou propriété d’un objet se font en utilisant le point comme séparateur. Ainsi pour accéder à la valeur de l’objet "tbDateDeCalcul" du formulaire "FormDeSaisie", vous pouvez faire :
FormDeSaisie.tbDateDeCalcul.Value...
La macro de calcul de la couverture
Pour écrire la macro vous utiliserez de nouvelles propriétés et méthodes des objets de type range.
La boucle For sur une collection d’objets
Le vecteur de sensibilités du portefeuille est égal à la somme des sensibilités de chacun des swaps du portefeuille. En supposant que notre portefeuille est rangé en ligne, nous allons devoir effectuer une boucle sur toutes les lignes de la zone renvoyée par le contrôle. Affectons la valeur renvoyée par le formulaire rePortefeuille à un objet de type range.
Dim rgPortefeuille As Range 'Plage du portefeuille
Set rgPortefeuille = Range(FormDeSaisie.rePortefeuille.Value)
Un objet range est une plage de cellules. Il est composé de ligne représentée par l’objet Row et de colonne représentée par l’objet Column.
Comme rgPortefeuille peut avoir plusieurs lignes et colonnes, il existe des collections d’objet. La collection Rows contient l’ensemble des lignes d’une plage de cellules. On distingue une collection d’un objet par le s marquant le pluriel. La collection des colonnes est Columns.
Pour balayer l’ensemble des éléments d’une collection il existe un dérivé de la boucle For ... Next.
Dim rgRow As Range 'Variable pour boucle sur
'les lignes du portefeuille
Dim rgPortefeuille As Range 'Plage du portefeuille
Set rgPortefeuille = Range(FormDeSaisie.rePortefeuille.Value)
For Each rgRow In rgPortefeuille.Rows
...
'Calcul de la BPVP du swap
...
Next
La variable rgRow est affectée successivement à chaque ligne composant la plage de cellules du portefeuille.
Une alternative consiste à compter le nombre de lignes de la plage de cellulles grâce à la propriété Count et de balayer la collection avec une boucle For ... Next classique.
La propriété Count permet de compter le nombre d’éléments présent dans une collection.
rgPortefeuille.Rows.Count...