Taux d'intérêt d'un investissement

solgti

XLDnaute Junior
Bonjour, je connais la fonction TAUX qui permet de trouver un taux d'intérêt annuel d'un investissement selon une période, exemple 5 ans.
Je sais aussi que l'on peut ajouter un montant pour chaque période.
Mais ma question est plutôt:
Comment calculer le taux d'intérêt annuel si on fait quelques ajout à notre investissement.
Exemple:
je place 1000$ dans un fond commun de placement
après 5 ans j'ai un montant de 2000$
mais pendant cette période de 5 ans j'ai réinvesti 2 fois soit un montant de 200$ après 2 ans et et un montant de 300$ après 4 ans
Donc 1000$ + 200$ (après 2 ans) + 300$ (après 4 ans)
Valeur après 5 ans 2000$
Quel est le taux d'intérêt annuel

Merci de m'éclairer

Solgti
 

solgti

XLDnaute Junior
Je croyais que comme vous aviez eu la gentillesse de m'aider pour la fonction, je pouvais vous reposer une question qui était selon moi en rapport.
Je vais suivre votre conseil et créer une nouvelle discussion.
Mais je permet de vous dire que l'utilisation du mot dépotoir était un peu fort.
Merci quand même
Solgti
 

ODVJ

XLDnaute Impliqué
Bonsoir à tous,

Tu peux utiliser la fonction d'excel TRI.PAIEMENTS(flux;dates_flux) qui gère les flux non périodiques.

xld_solgti.png


La formule entrée en H10 est : =SI(H8>=0;TRI.PAIEMENTS(H3:H6;I3:I6);"XIRR limitation")
Bien penser à intégrer tous les flux et leurs dates dans les arguments de la fonction en H3:I6.

Pour ton dernier post et pour te répondre complètement, il faudrait avoir un extrait consistant et anonymisé de ton fichier.

Une Sub (procédure) permet d'écrire où on veux dans la feuille de calcul. Ça, tu le maîtrises.
Une function retourne une valeur ou un tableau. Dans ce dernier cas, qui semble t'intéresser, il faut assigner à la fonction le tableau qui doit être retourné.

Cordialement
 

solgti

XLDnaute Junior
Bonjour ODVJ, très intéressant comme solution,
Est-ce qu'il est possible d'utiliser un array (VBA) comme paramètre à cette fonction, ou encore créer une nouvelle fonction qui utilise TRI.PAIEMENTS.
Je m'explique, j'ai un tableau dans une feuille (Feuil1) dans lequel j'ai tous mes placements, sur une feuille résumé (Feuil2), je souhaite inscrire ma liste de placement et avoir directement à côté le rendement.

Donc il faut que la formule isole tous les mouvements de trésorerie dans la feuil1 pour utiliser les bonnes valeurs en fonction des arguments des colonnes A et B de la feuil2.

J'espère être clair.

Merci

solgti
 

Pièces jointes

  • Test.xlsm
    2.5 MB · Affichages: 58

job75

XLDnaute Barbatruc
Bonsoir ODVJ,

C'est excellent et bien plus simple que ma solution VBA.

Je n'avais jamais vu cette fonction TRI.PAIEMENTS.

Le résultat est un tout petit peu différent du mien, c'est dû aux méthodes de calcul utilisées.

Edit : pardon solgti, on s'est croisé.

Bonne nuit.
 

job75

XLDnaute Barbatruc
Bonjour,
Pour l'écart, il est dû à la base 360.
Sans doute et je ne suis pas sûr que la méthode utilisée par la fonction Excel soit plus pertinente.

Tout dépend de la manière dont les banques calculent les intérêts sur les fractions d'années ou de mois.

Utilisent-elles toutes la même méthode d'ailleurs ?

De toute façon l'écart étant de l'ordre de 0,001% cela ne fait qu'une différence de 0,10 € par an sur 10 000 €.

A+
 

Dranreb

XLDnaute Barbatruc
Est-ce qu'il est possible d'utiliser un array (VBA) comme paramètre à cette fonction, ou encore créer une nouvelle fonction qui utilise TRI.PAIEMENTS.
WorksheetFunction.Xirr(Arg1, Arg2, [Arg3]) existe, elle devrait calculer la même chose (As Double), et pouvoir accepter des tableaux de Variant.
Mais je ne comprends rien à ce qu'elle calcule. Moi et la finance…

Edit: Quelques essais me donnent à penser que WorksheetFunction.Xirr n'accepte que des Range, contrairement à la plupart des fonctions de WorksheetFunction qui acceptent aussi des tableaux de Variant.

Edit2: Après plus amples test, réussi à faire fonctionner ça :
VB:
Function TestXIrr(ByVal Arg1, ByVal Arg2)
Dim TFlux(), TDates()
If TypeOf Arg1 Is Excel.Range Then TFlux = Arg1.Value Else TFlux = Arg1
If TypeOf Arg2 Is Excel.Range Then TDates = Arg2.Value2 Else TDates = Arg2
TestXIrr = WorksheetFunction.Xirr(TFlux, TDates)
End Function
Qui marche aussi bien avec :
Code:
=TestXIrr({-1000;-200;-300;2000};{40544;41289;41974;42369})
Qu'avec :
Code:
=TestXIrr(E3:E6;F3:F6)
E3:E6 contenant les flux et F3:F6 les dates.

Curieux quand même qu'il exige les numéros de série des jours correspondant aux dates au lieu des dates elles mêmes…
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour solgti, Bernard, le forum,

Ci-joint votre fichier du post #19 complété.

Sur le tableau en Feuil1 j'ai ajouté 2 colonnes.

La formule en G2 est classique, elle calcule le taux d'intérêt entre les 2 dernières dates.

La formule en H2 est matricielle et utilise cette fonction VBA :
Code:
Function Rendement#(vinv, datinv, vechu#, datechu As Date)
'vinv et datinv doivent être des vecteurs colonnes
Dim ub&, tablo(), i&, t#, s#, j&
ub = Application.CountA(vinv)
ReDim tablo(1 To ub, 1 To 3)
For i = 1 To ub
  tablo(i, 1) = vinv(i, 1): tablo(i, 2) = datinv(i, 1)
  tablo(i, 3) = Application.Days360(tablo(i, 2), datechu) / 360
Next
For i = 0 To 1000000 'taux de 0 à 100%
  t = i / 1000000
  s = 0
  For j = 1 To ub
    s = s + tablo(j, 1) * (1 + t) ^ tablo(j, 3)
  Next
  If s >= vechu Then Exit For
Next
Rendement = t 'restitution
End Function
Comme on le voit cette fonction utilise la méthode de la procédure Sub du post #11.

A+
 

Pièces jointes

  • Test(1).xlsm
    27.3 KB · Affichages: 43

job75

XLDnaute Barbatruc
Bonjour solgti, le forum,

J'ai bien amélioré la fonction.

Avec la variable sens elle permet maintenant de calculer les rendements négatifs.

Elle est bien plus rapide car il y a 6 calculs itératifs, le 1er donne une précision de 1%, le dernier une précision de 0,00001% :
Code:
Function Rendement#(vinv, datinv, vechu#, datechu As Date)
'vinv et datinv doivent être des vecteurs colonnes
Dim ub&, tablo(), j&, sens%, n&, iteration%, deb&, i&, t#, s#
ub = Application.CountA(vinv)
ReDim tablo(1 To ub, 1 To 2)
For j = 1 To ub
  tablo(j, 1) = vinv(j, 1)
  tablo(j, 2) = Application.Days360(datinv(j, 1), datechu) / 360
Next
sens = IIf(Application.Sum(vinv) < vechu, 1, -1)
n = 100 '1er calcul précision de 1%
For iteration = 1 To 6 'dernier calcul précision de 0,00001%
  deb = 10 * i '0 pour le 1er calcul
  For i = deb To n * sens Step sens 'taux de deb à 100% (ou -100%)
    t = i / n
    s = 0
    For j = 1 To ub
      s = s + tablo(j, 1) * (1 + t) ^ tablo(j, 2)
    Next
    If s * sens > vechu * sens Then n = 10 * n: sens = -sens: Exit For
Next i, iteration
Rendement = t 'restitution
End Function
Edit : voyez aussi la Workbook_Open dans ThisWorkbook...

Fichier (2).

A+
 

Pièces jointes

  • Test(2).xlsm
    30.1 KB · Affichages: 41
Dernière édition:

solgti

XLDnaute Junior
Bonjour Job75, encore une fois merci.
la fonction était vraiment rapide et le sera encore plus. et le calcul des rendements négatifs sera très pratique, mais pas souhaité lorsque l'on fait un placement :)!

encore une fois merci de votre temps

solgti
 

job75

XLDnaute Barbatruc
Bonjour solgti,

Je m'aperçois que dans le fichier (2) une Feuil1 parasite de type ThisWorkbook s'est glissée.

Cela peut causer des problèmes si vous voulez utiliser le fichier.

Prenez alors ce fichier (2 bis), c'est le même sans cette feuille vérolée.

A+
 

Pièces jointes

  • Test(2 bis).xlsm
    28.6 KB · Affichages: 35

Discussions similaires