Gå til innhold

Hjelp til å regne ut effektiv rente i php


Anbefalte innlegg

Hei

 

Lurer på om noen har et php script for å regne ut effektiv rente? Jeg klarer ikke å finne en formel som jeg klarer å få gjort om til "php-matte".

 

Formelen står hos lovdata.no

 

 

Jeg har variablene:

 

$laanebelop = "500000";

$nominell_rente = "3,4";

$termingebyr = "50";

$sikkerhetsgebyr = "500";

$etableringsgebyr = "700";

$laaneperiode = "30";

 

 

Hvordan gjør man for å få effektiv rente ut av dette i php?

Lenke til kommentar
Videoannonse
Annonse

Det er ikke en lekse, hadde bare håpet at noen hadde en snippet til å regne det ut. Jeg har ikke klart å finne noen plass et normalt regnestykke som tar med alle aspektene som skal regnes ut.

Det nærmeste jeg har kommet noe forståelig er denne tråden: http://vgd.no/forbru...regne-ut-renter

 

Det jeg har prøvd på, men som jeg ikke får til å stemme er dette (har for enkeltheten skyld prøvd å bare regne ut effektiv rente uten å tenke på gebyrene:

 

 

<?
$laanebelop = "500000";
$nominell_rente = "3,4";
$termingebyr = "50";
$sikkerhetsgebyr = "500";
$etableringsgebyr = "700";
$laaneperiode = "30";

$nominell_delt_tolv  =   $nominell_rente / 12;
$nominell_tolver_1 = $nominell_delt_tolv + 1;
$effektiv =  pow(12, nominell_tolver_1);
$effektiv = $effektiv - 1;

?>

 

$effektiv blir da: 21.33451661845

 

 

Effektiv rente skulle egentlig vært 3.45 i følge denne kalkulatoren: http://www.rentekalkulator.no/

Endret av Garreth
Lenke til kommentar

La meg være enda mer spesifikk: Ikke bruk quotes rundt tall. Quotes betyr at det er tekst. PHP oversetter tekst til tall ved de fleste anledninger hvor det er åpenlyst at du vil bruke det som et tall (så "1" + "1" = 2, siden + forventer to tall), men ikke alle. Det gir noen spennende effekter - f.eks. er "01" samtidig lik og mindre enn "1", såvidt jeg husker. Det er også marginalt tregere (Siden det slenger inn en ekstra konvertering fra tekst til tall), og det vil ikke fungere som forventet i de fleste andre språk. (I python er "1"+"1" = "11".)

 

Angående effektiv rente - hjelper dette på noe vis?

Endret av Djn
Lenke til kommentar

La meg være enda mer spesifikk: Ikke bruk quotes rundt tall. Quotes betyr at det er tekst. PHP oversetter tekst til tall ved de fleste anledninger hvor det er åpenlyst at du vil bruke det som et tall (så "1" + "1" = 2, siden + forventer to tall), men ikke alle. Det gir noen spennende effekter - f.eks. er "01" samtidig lik og mindre enn "1", såvidt jeg husker. Det er også marginalt tregere (Siden det slenger inn en ekstra konvertering fra tekst til tall), og det vil ikke fungere som forventet i de fleste andre språk. (I python er "1"+"1" = "11".)

 

Angående effektiv rente - hjelper dette på noe vis?

 

Takk, det ble et annet regnestykke nå, men fortsatt feil :p

 

<?PHP
$laanebelop = 500000;
$nominell_rente = 3.400;
$termingebyr = 50;
$sikkerhetsgebyr = 500;
$etableringsgebyr = 700;
$laaneperiode = 30;

$nominell_delt_tolv  =   $nominell_rente / 12;
$nominell_pluss_1 = $nominell_delt_tolv + 1;
$effektiv =  pow(12, $nominell_pluss_1);
$effektiv = $effektiv - 1;

echo "$effektiv \n\n";
?>

 

Nå er $effektiv 23.263266352857.

 

Skal se mer på den dinside artikkelen og se om jeg klarere å se hva jeg gjør galt.

Lenke til kommentar

Da har jeg prøvd å sette opp regnestykket fra dinside i php, men det er kanskje ikke mulig å gjøre det på den måten?

 

Har laget en codepad om dere ønsker å se: http://codepad.org/jeXSGjGC

 

Ser i regnestykket fra dinside har de 10% nominell rente, men de har satt 0 foran her: (1 + 0,10/12)^12 - 1 . Noen som vet om man bare setter 0 foran for alle typer renter, eller om man må regne seg fram til det også?

 

 

<?PHP
/*
Nominell rente 10%
Hvis antall innbetalinger er 12 (én gang per måned) får vi dette regnestykke:
(1 + 0,10/12)^12 - 1
(1 + 0,00833)^12- 1
1,1047 - 1 = 0,1047 dvs. 10,47%
*/
$laanebelop = 500000;
$nominell_rente = 3.400;
$nominell_rente_null = 0.3400;
$termingebyr = 50;
$sikkerhetsgebyr = 500;
$etableringsgebyr = 700;
$laaneperiode = 30;

$nom0 = 1 + $nominell_rente_null;
$nom1 = $nom0 / 12;
$nom2 = pow(12, $nom1);
$nom3 = $nom2 - 1;
$nom4 = 1 + $nom3;
$nom5 = pow(12, $nom4);
$nom6 = $nom5 - 1;

echo "Effektivrente: $nom6";
?>

Lenke til kommentar

Jeg skrev en hel post om prosentregning, men ombestemte meg - det er antageligvis litt unødvendig?

 

I kortform: 3.4% er det samme som å gange med 3.4/100 = 0.034 .

0.27 er det samme som 100*0.27=27% .

 

 

Helt separat fra det bruker du pow feil: pow(2,10) betyr 2^10, ikke 10^2 .

Endret av Djn
Lenke til kommentar

Jeg skrev en hel post om prosentregning, men ombestemte meg - det er antageligvis litt unødvendig?

 

Helt separat fra det bruker du pow feil: pow(2,10) betyr 2^10, ikke 10^2 .

Takk, skjønner prosentregning, lurte bare på om de hadde gjort noe annerledes enn å dele på 100 i det regnestykket sitt.

 

Takk, da har jeg misfortått litt med pow.

 

 

Her er regnestykket mitt nå (bruker 0.10 som nominell for å prøve å gjennskape regnestykket fra dinside)

 

<?
/*
Nominell rente 10%
Hvis antall innbetalinger er 12 (én gang per måned) får vi dette regnestykke:
(1 + 0,10/12)^12 - 1
(1 + 0,00833)^12- 1
1,1047 - 1 = 0,1047 dvs. 10,47%
*/
$laanebelop = 500000;
$nominell_rente_null = 0.10;
$termingebyr = 50;
$sikkerhetsgebyr = 500;
$etableringsgebyr = 700;
$laaneperiode = 30;

$nom0 = 1 + $nominell_rente_null;
$nom1 = $nom0 / 12;
$nom2 = pow($nom1,12);
$nom3 = $nom2 - 1;
$nom4 = $nom3 + 1;
$nom5 = pow($nom4,12);
$nom6 = 1 - $nom5;

echo "Nom 0: $nom0\n";
echo "Nom 1: $nom1\n";
echo "Nom 2: $nom2\n";
echo "Nom 3: $nom3\n";
echo "Nom 4: $nom4\n";
echo "Nom 5: $nom5\n";
echo "Nom 6: $nom6\n";
?>

Dette er resultatene jeg får:

 

Nom 0: 1.1

Nom 1: 0.091666666666667

Nom 2: 3.5199562801414E-13

Nom 3: -0.99999999999965

Nom 4: 3.5194069880617E-13

Nom 5: 3.6110533462106E-150

Nom 6: 1

 

Fremdeles ikke helt de resultatene som dinside har. Kan være at det ikke er denne måten man regner ut slike ting på?

Lenke til kommentar

Jeg ser en logisk feil til: (1 + 0.10)/12 er ikke det samme som 1+(0.10/12) , så $nom1 skal helst bli 1.0083 eller deromkring.

Aha! Da blir det litt mer logisk her.

 

Her er koden min nå, og plutselig stemmer regnestykket!

 

/*
Nominell rente 10%
Hvis antall innbetalinger er 12 (én gang per måned) får vi dette regnestykke:
(1 + 0,10/12)^12 - 1
(1 + 0,00833)^12- 1
1,1047 - 1 = 0,1047 dvs. 10,47%
*/
$laanebelop = 500000;
$nominell_rente = 3.400;
$nominell_rente_null = 0.10;
$termingebyr = 50;
$sikkerhetsgebyr = 500;
$etableringsgebyr = 700;
$laaneperiode = 30;

$nom1 = (pow(1 + $nominell_rente_null / 12, 12) - 1);
$effektiv = $nom1 * 100;

echo "Nom1: $nom1\n";
echo "Effektiv: $effektiv\n";
?>

 

Nom1: 0.1047130674413

Effektiv: 10.47130674413

 

Hurra!

Endret av Garreth
Lenke til kommentar

Da sitter jeg igjen med å regne ut prosent for gebyrer og termingebyr.

 

Her hva dinside sier om saken (men har ikke noe regnestykke)

 

 

Men vi er enda ikke ferdig med å beregne effektiv rente. Vi må nemlig ta hensyn til en faktor til: Hvor mye utgjør de ulike gebyrene i prosent av lånebeløpet fordelt over hele lånets løpetid. Etableringsgebyr kan beregnes som en prosentsats av lånet. Dersom du betaler 1.000 kroner i etableringsgebyr og lånet er på 100.000, så tilsvarer gebyret én prosent av lånet. 1% i etableringsgebyr gir følgende virkning på den effektive renten - ved ulike nedbetalingsplaner (rente 10 prosent):

 

1 år 1,11%

5 år 0,39%

10 år 0,23%

15 år 0,18%

20 år 0,15%

 

 

Skal man plusse på alle engangsgebyrene med lånebeløpet, for så å bruke dette videre når man finner ut prosenten for termingebyret?

 

<?PHP
/*
Nominell rente 10%
Hvis antall innbetalinger er 12 (én gang per måned) får vi dette regnestykke:
(1 + 0,10/12)^12 - 1
(1 + 0,00833)^12- 1
1,1047 - 1 = 0,1047 dvs. 10,47%
*/
$laaneperiode = 30;
$laanebelop = 500000;
$sikkerhetsgebyr = 500;
$etableringsgebyr = 700;

$laanebelopsamlet = ($laanebelop + $sikkerhetsgebyr + $etableringsgebyr);
$laanebelop_delt2 = ($laanebelopsamlet / 2);

$termingebyr = 25;
$terminprosent = (($termingebyr * 12 / $laanebelop_delt2) * 100);

$nominell_rente = 10.00;
$nominell_rente = (($terminprosent + $nominell_rente) / 100);

$nom1 = (pow(1 + $nominell_rente / 12, 12) - 1);
$effektiv = $nom1 * 100;

echo "Terminprosent: $terminprosent\n";
echo "Nominell rente: $nominell_rente\n";
echo "Nom1: $nom1\n";
echo "Effektiv: $effektiv\n";
?>

Terminprosent: 0.11971268954509

Nominell rente: 0.10119712689545

Nom1: 0.10602533347971

Effektiv: 10.602533347971

Lenke til kommentar

Da har jeg klart å finne ut hvorfan finansportalen gjør det, men det er i javascript.

 

Har prøvd å gjøre det om til php, men får litt problemer med den ene eval funksjonen i $prov variabelen.

Får denne errroren: PHP Parse error: syntax error, unexpected $end in /home/users/web/import/effektiv.php(74) : eval()'d code on line 1

 

/*
Parametere til funksjonen:
nomrente Den nominelle renten brukes som en utgangspunkt for å minimere antall iterasjonerThe nominal rate could have been omitted, but guessing it gives us a better starting point for the iterations
annuitet Annuiteten må inkludere eventuelle termingebyere etc.
hovedstol Det lånet renten skal beregnes av. Det er viktig at all rentebærende gjeld er med, for eksempel forutsettes ofte startgebyrer lagt til lånet
terminantall Antall terminer pr. år
aarantall Antall års løpetid.
Vi regner ut den effektive renten ved 50 iterasjoner, basert på å halvering av differanser: */

$laaneperiode = 30;
$terminantall = 12;
$laanebelop = 500000;
$sikkerhetsgebyr = 500;
$etableringsgebyr = 700;
$hovedstol = ($laanebelop + $sikkerhetsgebyr + $etableringsgebyr);

$k=0;
$hoy=0;
$lav=0;
$prov=0;
$i=0;
if (eval($nominell_rente)<10){
$hoy = 2;
}elseif (eval($nominell_rente)<100){
		$hoy = 10;
}else{
$hoy = 20;
$lav = 1;
}
while ($i<50){
$k = (($hoy-$lav)/2) + $lav;

$prov = $annuitet * ($k * ( 1 - (pow ($k,($laaneperiode*$terminantall))))/(1-$k))/pow($k,eval($laaneperiode*$terminantall)+1);
	/*Annuitetsformelen organisert med vekstfaktoren k definert som 1/(1+r) */
	if ($prov<$hovedstol){
		$hoy=$k;
	}else{
		$lav=$k;
	}  

$i = $i + 1;
}
$k = (pow($k,$terminantall));
return $k-1;

Endret av Garreth
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...