01 - Code

Si vous avez des fonctions à proposer dans un autre langage, n’hésitez pas à les partager (contactez-moi en utilisant le formulaire prévu à cet effet.)

R

Voici une petite fonction sous R qui vous permet d’accumuler ou d’actualiser avec n’importe quel type de taux. Je l’ai appelée Df pour Discount factor : c’est le montant par lequel vous devez multiplier $C_0$ pour accumuler ou $C_t$ pour actualiser. Simplement :

$$C_0 = C_t \times Df$$

Ou :

$$C_t = C_0 \times Df$$

Les arguments sont :

  • Le taux (k), qui peut éventuellement être un vecteur de plusieurs taux ;
  • Le temps (t), qui peut aussi être un vecteur ;
  • La fréquence (f) qui est forcément de longueur 1 et peut prendre les valeurs suivantes : si f est inférieure ou égale à zéro, la fonction utilisera des intérêts simples ; si f est un entier positif, la fonction utilise des intérêts composés périodiquement (1 = année, 2 = semestre etc…) ; enfin, si f est infini (Inf), la fonction utilise des intérêts composés en continus.

Voici le code :

Df = function(k, t = 1, f = 1) {
 if(length(f) != 1) stop("f must be of length 1!")
 if(f <= 0) {
  res <- (1+abs(t)*k)^sign(t)
 } else {
  if(is.finite(f)) {
   res <- (1+k/f)^(f*t)
  } else {
   res <- exp(k*t)
  }
 }
 return(res)
}

Par exemple, pour calculer la valeur accumulée de 100 placés pendant 10 ans à un taux d'intérêts simple de 20% :

100 * Df(.2, 10, 0)

Même calcul avec des intérêts composés semestriellement :

100 * Df(.2, 10, 2)

Pour actualiser, il suffit d'utiliser un vecteur de temps négatif. Ici, par exemple, la valeur actualisée de 100 sur 5 ans avec un taux composé en continu de 4% :

100 * Df(.04, -5, Inf)

Comme dit plus haut, vous pouvez utiliser des vecteurs pour k et t. Par exemple, pour calculer la valeur acquise de 100 placés à 20% (taux composé en continu) tous les ans de $t=0$ à $t=10$ :

100 * Df(.2, 0:10, Inf)

La fonction rate calcule un taux en utilisant la même logique :

rate = function(C0, Ct = 100, t = 1, f = 1) {
 if(length(f) != 1) stop("f must be of length 1!")
 if(f <= 0) {
  res <- 1/t*(Ct/C0-1)
 } else {
  if(is.finite(f)) {
   res <- f*((Ct/C0)^(1/(f*t))-1)
  } else {
   res <- 1/t*log(Ct/C0)
  }
 }
 return(res)
}

Par exemple, pour calculer le taux d'un zéro coupon de valeur faciale 100, valant 75, arrivant à maturité dans 5 ans avec des intérêts simples :

rate(75, 100, 5, 0)

Et vous pouvez tester plusieurs prix (ici tous les entiers de 70 à 80) :

rate(70:80, 100, 5, 0)

Aucun commentaire:

Enregistrer un commentaire