Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Mathématiques financières (3ième édition)
  3. Fonctions de manipulation des dates
Extrait - Mathématiques financières (3ième édition) Construisez votre bibliothèque de fonctions avec VBA Excel
Extraits du livre
Mathématiques financières (3ième édition) Construisez votre bibliothèque de fonctions avec VBA Excel
1 avis
Revenir à la page d'achat du livre

Fonctions de manipulation des dates

Généralités

Les fonctions de manipulations des dates doivent vous permettre de déterminer avec précisions les dates de flux de capital ou d’intérêt d’un instrument financier.

Dans la zone Euro, le calendrier Target est utilisé. Dans ce calendrier, les jours fermés sont : les samedis, les dimanches, les 25 décembre, les 26 décembre, 1 janvier, 1 mai, vendredi Saint (précède le dimanche de Pâques) et lundi de Pâques (le lendemain du dimanche de Pâques).

Vous allez donc créer la fonction qui vous permettra de déterminer la date du dimanche de Pâques pour une année. Puis vous créerez la fonction permettant de savoir si un jour est travaillé. Vous pourrez ensuite définir une fonction modifiant la date d’un flux si celui-ci tombe un jour fermé. Avec ces 3 fonctions vous pourrez créer les fonctions FractionAnnee pour calculer une fraction d’année et DatesDesFlux permettant de déterminer la date des flux d’un instrument.

Les dates dans Visual Basic

Dans Excel les dates sont codées sous la forme d’un nombre indiquant le nombre de jour écoulé depuis une date de référence. Cette date de référence est le 1 janvier 1900 pour Excel sous Windows et le 1 janvier 1904 pour Excel sous Mac.

Les dates peuvent donc être sous...

La fonction DimancheDePaques

Cette fonction va permettre de déterminer le dimanche de Pâques pour une année. Vous utiliserez l’algorithme de Meeus, Jones et Butcher disponible à l’adresse : http://en.wikipedia.org/wiki/Computus, en anglais.

Pour pouvoir construire cette fonction, vous avez besoin de nouveaux mots clefs Visual Basic.

Mot clef Int

Le mot clef Int renvoie la partie entière d’un nombre.

Par exemple Int(3,7)=Int(3,2)=Int(3)=3.

Mot clef DateSerial

La fonction DateSerial renvoie le numéro de série d’une date construite à partir d’une année, d’un mois et d’un jour.

Par exemple, DateSerial(2015,12,1)=42 339, c’est-à-dire le 1 décembre 2015.

Cette fonction est très puissante. Elle permet d’effectuer des opérations sur les dates. Par exemple, la date 14 mois après le 1 décembre 2015 peut être calculée par DateSerial(2015,12+14,1)=42 767, soit le 1 février 2017.

Pour déterminer le dernier jour du mois m de l’année a, il est possible d’utiliser la formule DateSerial(a,n+1,1-1)=DateSerial(a,n+1,0). Cela permet de placer le mois n+1 et de reculer d’un jour.

Le code de la fonction DimancheDePaques

Vous avez maintenant tous les éléments pour construire la fonction renvoyant le dimanche de Pâques en utilisant l’algorithme de Meeus, Jones...

La fonction EstJourTravaille

Cette fonction va permettre de déterminer si un jour passé en argument correspond à un jour ouvert ou fermé dans le calendrier Target. Cette fonction renverra True (vrai) si le jour est travaillé, False (faux) sinon.

Avant de construire cette fonction, nous allons examiner quelques concepts et mots clefs Visual Basic.

La gestion des erreurs dans Visual Basic

Quand un programme essaye de réaliser quelque chose d’impossible, par exemple une division par 0 ou affecter un nombre décimal à une variable de type entier, alors Visual Basic génère une erreur.

Les erreurs renvoient un code et un message décrivant l’erreur. Ainsi l’erreur 11 correspond à la division par zéro.

Il est possible d’indiquer à Visual Basic une routine à effectuer en cas d’erreur en utilisant la fonction On Error.

Les mots clefs On Error

La fonction On Error indique à Visual Basic la marche à suivre en cas d’erreur.

 Pour illustrer son fonctionnement, écrivez une fonction prenant en entrée deux paramètres, Nombre1 et Nombre2 et divisant Nombre1 par Nombre2.


Function Division(Nombre1 As Double, Nombre2 As Double) As Double 
 
Dim dblResultat As Double 
 
dblResultat = Nombre1 / Nombre2 
 
Division = dblResultat 
 
End Function 
 

Si vous appelez cette fonction dans une feuille de calcul avec en paramètre 4 et 2 par la formule =Division(4;2) alors elle retourne 2.

Si vous appelez cette même fonction avec les paramètres 4 et 0, alors elle renvoie un message d’erreur : "#VALEUR !"

 Modifiez cette fonction, pour envoyer un message à l’utilisateur dans le cas d’une division par 0.


Function Division(Nombre1 As Double, _
Nombre2 As  Double) As Double
 


Dim dblResultat As Double
 


On Error GoTo GestionDesErreurs
 

On indique ici au code de se rendre à l’étiquette GestionDesErreurs s’il rencontre une erreur.


dblResultat = Nombre1 / Nombre2
 

Maintenant si on effectue une division par zéro le code va sauter à l’étiquette GestionDesErreurs, sans effectuer la ligne de code suivante.


Division = dblResultat
 

S’il n’y a pas eu d’erreur, le programme passe par cette ligne de code.


Exit Function
 

Comme l’indique son nom, la commande...

La fonction AjusteDate

Maintenant que vous savez déterminer si un jour est fermé ou ouvert dans le calendrier TARGET, il faut être capable de déterminer le jour ouvré utilisé si un flux tombe un jour fermé. Il existe plusieurs conventions pour ajuster les dates. Nous présentons les plus utilisées.

Les différents modes d’ajustement

Mode d’ajustement

Calcul de la valeur retournée

"Forward" ou "Following"

Si la date n’est pas un jour travaillé, alors la date est repoussée jusqu’au premier jour travaillé.

"Modified Forward" ou "Modified Following"

Si la date n’est pas un jour travaillé, alors la date est repoussée jusqu’au premier jour travaillé, à moins que ce jour appartienne au mois suivant. Dans ce cas la date est avancée jusqu’au premier jour travaillé.

"Backward" ou "Preceding"

Si la date n’est pas un jour travaillé, alors la date est avancée jusqu’au premier jour travaillé.

"Modified Preceding" ou "Modified Backward"

Si la date n’est pas un jour travaillé, alors la date est avancée jusqu’au premier jour travaillé, à moins que ce jour appartienne au mois précédent. Dans ce cas la date est repoussée jusqu’au premier jour travaillé.

Vous pouvez les consulter à l’adresse suivante : http://en.wikipedia.org/wiki/Date_rolling

Les mots clefs Select Case

Pour sélectionner le code à effectuer selon le mode d’ajustement, vous pouvez utiliser les mots clefs If et ElseIf.


If sModeAjustement= "Forward" Or sModeAjustement= "Forward Following" 
Then 
... 
ElseIf sModeAjustement= "Modifierd Foward " Or sModeAjustement=  
"Modified Following" Then 
... 
ElseIf ... 
... 
End if
 

Select Case est un mot clef permettant d’effectuer des tests enchaînés. Ceux-ci permettent d’effectuer un test sur la valeur d’une variable.


Select Case sModeAjustement 
         
        Case "Forward", "Following" 
    ... 
        Case "Modified Forward", "Modified Following" ...

La fonction FractionAnnee

En finance, les taux d’intérêt sont exprimés sur une base annuelle même si leur durée d’application est différente de l’année. Par exemple, pour calculer les intérêts à payer pour un emprunt de 100  à un taux de 3%, pendant 6 mois, c’est-à-dire une demi-année, il faut faire :

100*0.03*0.5=1.5

Le montant des intérêts sera de 1.5 €.

Vous avez utilisé une fraction d’année pour le calcul de ces intérêts. Il existe plusieurs conventions pour calculer une fraction d’année. Vous pouvez en trouver une description sur le site Wikipedia à l’adresse http://en.wikipedia.org/wiki/Day_count_convention.

Nous allons examiner certaines de ces conventions.

Convention Exact/365 ou Actual/365

La base Exact/365 ignore les années bissextiles. Le numérateur est égal au nombre exact de jours écoulés pendant la période.

Cette convention est facile d’utilisation, il suffit de rechercher la différence entre la date de fin de période (dFinPeriode) et la date de début de période (dDebutPeriode) et de la diviser par 365 :

images/EC0301.png

Ce qui s’écrit en Visual Basic :


FractionAnnee=(dFinPeriode-dDebutPeriode)/365
 

Convention Exact/360 ou Actual/360

La base Exact/360 considère que les années ont 360 jours. Le numérateur est égal au nombre exact de jours écoulés pendant la période.

Son mode de calcul est :

images/EC0302.png

ce qui s’écrit en Visual Basic :


FractionAnnee=(dFinPeriode-dDebutPeriode)/360
 

Convention Exact/Exact

Avec la base Exact/Exact, le numérateur est égal au nombre exact de jours écoulés pendant la période. Le dénominateur est égal à 366 si un 29 février est inclus dans la période, 365 sinon.

Par exemple, l’année 2016 sera bissextile, pour la période du 1 janvier 2016 (numéro de série 42370) au 1 janvier 2017 (42736) , la fraction d’année est (42736-42370)/366=1. Du 1 janvier 2016 au 30 juin 2016 (42551), la fraction d’année est (42551-42370)/366=0.49.

Pour une période allant de dDebutPeriode à dFinPeriode il faut donc déterminer...

La fonction DatesDesFlux

Maintenant que vous avez des fonctions permettant d’utiliser le calendrier Target, il vous faut construire une fonction déterminant la date des flux d’un instrument financier.

Dans cet ouvrage, nous examinerons uniquement les instruments payant périodiquement des intérêts et n’ayant qu’un flux de capital, à la date de maturité. Ce type d’instrument correspond à la plus grande partie des instruments de taux existants. À la fin de la lecture de cet ouvrage vous serez capable de créer des fonctions pour des instruments ayant un échéancier de paiement d’intérêts et de capital, ou des flux optionnels.

Pour pouvoir écrire cette fonction, il faut d’abord définir de manière détaillée son fonctionnement. C’est une étape très importante, elle permet de structurer ce que l’on souhaite faire. La réalisation de la fonction (ou du programme) en est grandement facilitée.

Spécifications fonctionnelles détaillées de la fonction

Objectif

La fonction DatesDesFlux détermine un vecteur de date correspondant aux dates des flux d’un instrument financier.

Cas général

Pour déterminer la date des flux, nous allons nous placer à la date de maturité de l’instrument et reculer de période de coupon en période de coupon, jusqu’à la date de calcul.

Il faut donc trois arguments, la date de maturité de l’instrument, la fréquence de paiement des coupons (1 pour une fréquence annuelle, 2 pour semestrielle...) et la date de calcul.

Si vous écrivez m comme le nombre de mois entre deux flux (12/fréquence de paiement), et d(.) le vecteur contenant les dates de flux, vous pouvez décrire la fonction avec ce graphique.

Graphique 1 : Cas général de la séquence des flux

images/03OS01.png

La fonction doit donc remplir un tableau ayant une dimension variant de 0 à n, avec d(n) égal à la date de maturité.

Cas où la date de calcul correspond à la date d’un flux

Par convention, s’il y a un flux à la date de calcul, alors celui-ci a déjà eu lieu au moment de la détermination de l’échéancier des flux. Par conséquent d(0)...

La fonction ProchainFlux

Spécifications fonctionnelles détaillées de la fonction

Cette fonction renvoie la première date de flux d’un instrument après la date de calcul.

Elle renvoie donc la date de l’indice 1 du vecteur calculé par la fonction DatesDesFlux. Par conséquent la fonction ProchainFlux a les mêmes arguments que la fonction DatesDesFlux.

Écriture de la fonction

Ici pas de difficultés. L’écriture de la fonction découle directement de ce que vous connaissez déjà.


Function ProchainFlux(DateDeCalcul As Date, DateDeMaturite As Date, _  
                    Frequence As Integer, _ 
                    Optional ModeAjustement = 0, _ 
                    Optional TypeCouponBrise = 0, _ 
                    Optional DateDeDepart = 0) _ 
                       As Double 
 
Dim dblDateFlux As Double 'Variable renvoyée 
 
'retourne l'élément de l'indice 1 du vecteur renvoyé par la fonction 
'DatesDesFlux. 
'Si l'indice 1 n'existe pas, une erreur est générée,  
'la variable...

La fonction DernierFlux

Spécifications fonctionnelles détaillées de la fonction

Cette fonction renvoie la première date de flux d’un instrument avant la date de calcul.

Elle renvoie donc la date de l’indice 0 du vecteur calculé par la fonction DatesDesFlux. Par conséquent la fonction DernierFlux a les mêmes arguments que la fonction DatesDesFlux.

Dans le cas d’un instrument forward, il n’y a aucun flux avant la date de calcul, la fonction renvoie 0.

Écriture de la fonction

Encore une fois, vous avez les connaissances nécessaires en Visual Basic pour écrire cette fonction sans difficultés.


Function DernierFlux(DateDeCalcul As Date, DateDeMaturite As Date, _ 
                 Frequence As Integer, _ 
                 Optional ModeAjustement = 0, _ 
                 Optional TypeCouponBrise = 0, _ 
                 Optional DateDeDepart = 0) As Double 
 
Dim dblDateFlux As Double 'Variable renvoyée 
 
If DateDeDepart > DateDeCalcul Then 
    'Si c'est un instrument forward, pas de flux avant la 
    'date de calul 
    dblDateFlux = 0 
Else 
    'Sinon on renvoie la date à l'indice...