[PHP] Formules financières Excel en PHP

Bonjour,

Je ne le souhaite à personne, mais certains d’entre vous vont un jour être confronté à un petit problème : convertir un fichier de configuration excel en PHP. Si les calculs dans ce fichier restent simple, alors ça ne pose pas de soucis, on trouve rapidement les équivalent des fonctions Excels basiques en PHP, comme ARRONDI.INF ou SUM. Mais dès que l’on va un peu plus loin dans les formules excels, là, c’est la catastrophe.

En effet, excel est un logiciel très poussé pour tout ce qui concerne les calculs financiers, et il suffit qu’une des fonctions disponibles dans la librairie financière soit utilisée pour que PHP ne suive plus dans ses fonctions. Il m’est arrivé ce problème aujourd’hui et les réponses sont quasi inexistantes sur google. Après quelques heures de lutte acharnées, de recherche infructueuses et de remémoration de mes cours de terminal S qui remontent bien loins, j’ai réussi à traduire les 3 fonctions les plus utilisées de cette bibliothèque.

Fonction VPM

Cette fonction calcule le remboursement d’un emprunt sur la base de remboursements et d’un taux d’intérêt constants. Retrouvez la documentation de la fonction VPM sous Excel.


function vpm($taux, $npm, $va, $vc = 0, $type = 0){
if(!is_numeric($taux) || !is_numeric($npm) || !is_numeric($va) || !is_numeric($vc) || !is_numeric($type)):
return false;
endif;

if($type > 1|| $type < 0):
return false;
endif;

$tauxAct = pow(1 + $taux, -$npm);

if((1 - $tauxAct) == 0):
return 0;
endif;

$vpm = ( ($va + $vc * $tauxAct) * $taux / (1 - $tauxAct) ) / (1 + $taux * $type);
return -$vpm;
}

Fonction VA

Cette fonction calcule la valeur actuelle d’un investissement. La valeur actuelle correspond à la somme que représente aujourd’hui un ensemble de remboursements futurs. Par exemple, lorsque vous faites un emprunt, le montant de l’emprunt représente la valeur actuelle pour le prêteur. Retrouvez la documentation de la fonction VA sous Excel.


function va($taux, $npm, $vpm, $vc = 0, $type = 0){
if(!is_numeric($taux) || !is_numeric($npm) || !is_numeric($vpm) || !is_numeric($vc) || !is_numeric($type)):
return false;
endif;

if($type > 1|| $type < 0):
return false;
endif;

$tauxAct = pow(1 + $taux, -$npm);

if((1 - $tauxAct) == 0):
return 0;
endif;

$va = $vpm * (1 + $taux * $type) * (1 - $tauxAct) / $taux - $vc * $tauxAct;
return $va;
}

Fonction TAUX

Calcule le taux d’intérêt par période d’un investissement donné. La fonction TAUX est calculée par itération et peut n’avoir aucune solution ou en avoir plusieurs. Retrouvez la documentation de la fonction Taux sous Excel.

function taux($nper, $pmt, $pv, $fv = 0.0, $type = 0, $guess = 0.1) {

$rate = $guess;
if (abs($rate) < 20):
$y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
else:
$f = exp($nper * log(1 + $rate));
$y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
endif;
$y0 = $pv + $pmt * $nper + $fv;
$y1 = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;

$i = $x0 = 0.0;
$x1 = $rate;
while ((abs($y0 - $y1) > 0.0000001) &amp;amp;&amp;amp; ($i < 20)):
$rate = ($y1 * $x0 - $y0 * $x1) / ($y1 - $y0);
$x0 = $x1;
$x1 = $rate;

if(abs($rate) < 0.0000001):
$y = $pv * (1 + $nper * $rate) + $pmt * (1 + $rate * $type) * $nper + $fv;
else:
$f = exp($nper * log(1 + $rate));
$y = $pv * $f + $pmt * (1 / $rate + $type) * ($f - 1) + $fv;
endif;

$y0 = $y1;
$y1 = $y;
++$i;
endwhile;

return $rate;
}

Je ne sais pas pour vous, mais je suis à deux doigts de l’indigestion. Mais en tous les cas, j’espère avoir évité à quelqu’un d’entre vous des heures de recherches inutiles.

Bon courage !

 

A propos de Thibault HENRY

Passionné de web depuis toujours, j'ai développé mon premier site internet à l'âge de 12 ans, avec le feu Microsoft FrontPage. Depuis cette passion ne m'a pas quitté. Autodidacte, je dirige maintenant le service technique de Digital Dealer, agence de communication.

5 comments

  1. Bravo ! Car malgré de multiples recherches il me semblait quasi impossible à adapter la fonction VPM en PHP en prenant en compte les mêmes arguments etc …
    J’ai testé cette fonction et comparé avec celle d’excel et miracle sa marche :p

    Merci beaucoup

  2. Pour ma part j’ai un problème avec la méthode taux().

    Dans certains cas de figure, le taux est abérant car la valeur de $y1 est plus petite que celle de $y0 du coup le calcul de $rate est faux.

    Le problème se produit lorsque la durée est comprise entre 27 et 30 (mois)

    Le problème est visible dès la seconde passe dans la boucle WHILE (où $i=1)

    J’essaie de trouver un fix propre.

    Dans les autres cas le calcul est bon.

  3. merci bien, pour tous ces exemples. Personnellement, j’ai eu besoin du taux. Sauf que j’en avait besoin en Javascript. J’ai donc retransmis le code en js. Pour ceux que ça intéresse, le voici :

    function taux(nper, pmt, pv, fv, type, guess)
    {
    var rate = (guess || 0.1);
    if (Math.abs(rate) 0.0000001) && (i < 20))
    {
    rate = (y1 * x0 – y0 * x1) / (y1 – y0);
    x0 = x1;
    x1 = rate;

    if(Math.abs(rate) < 0.0000001)
    {
    y = pv * (1 + nper * rate) + pmt * (1 + rate * (type || 0)) * nper + (fv || 0.0);
    }
    else
    {
    f = Math.exp(nper * Math.log(1 + rate));
    y = pv * f + pmt * (1 / rate + (type || 0)) * (f – 1) + (fv || 0.0);
    }

    y0 = y1;
    y1 = y;
    ++i;
    }

    return rate;
    }

  4. Mon commentaire à l’air d’avoir bug. Je le remet en entier !

    function taux(nper, pmt, pv, fv, type, guess)
    {
    var rate = (guess || 0.1);
    if (Math.abs(rate) 0.0000001) && (i < 20))
    {
    rate = (y1 * x0 – y0 * x1) / (y1 – y0);
    x0 = x1;
    x1 = rate;

    if(Math.abs(rate) < 0.0000001)
    {
    y = pv * (1 + nper * rate) + pmt * (1 + rate * (type || 0)) * nper + (fv || 0.0);
    }
    else
    {
    f = Math.exp(nper * Math.log(1 + rate));
    y = pv * f + pmt * (1 / rate + (type || 0)) * (f – 1) + (fv || 0.0);
    }

    y0 = y1;
    y1 = y;
    ++i;
    }

    return rate;
    }

Laisser un commentaire