Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Calculate APR (annual percentage rate) Programmatically

I am trying to find a way to programmatically calculate APR based on

  • Total Loan Amount
  • Payment Amount
  • Number of payments
  • Repayment frequency

There is no need to take any fees into account.

It's ok to assume a fixed interest rate, and any remaining amounts can be rolled into the last payment.

The formula below is based on a credit agreement for a total amount of credit of €6000 repayable in 24 equal monthly instalments of €274.11.

enter image description here

(The APR for the above example is 9.4%)

I am looking for an algorithm in any programming language that I can adapt to C.

like image 309
Ben Avatar asked Sep 28 '11 14:09

Ben


2 Answers

I suppose you want to compute X from your equation. This equation can be written as

f(y) = y + y**2 + y**3 + ... + y**N - L/P = 0

where

X = APR
L = Loan (6000)
P = Individual Payment (274.11)
N = Number of payments (24)
F = Frequency (12 per year)
y = 1 / ((1 + X)**(1/F))   (substitution to simplify the equation)

Now, you need to solve the equation f(y) = 0 to get y. This can be done e.g. using the Newton's iteration (pseudo-code):

y = 1  (some plausible initial value)
repeat 
    dy = - f(y) / f'(y)
    y += dy
until abs(dy) < eps 

The derivative is:

f'(y) = 1 + 2*y + 3*y**2 + ... + N*y**(N-1)

You would compute f(y) and f'(y) using the Horner rule for polynomials to avoid the exponentiation. The derivative can be likely approximated by some few first terms. After you find y, you get x:

x = y**(-F) - 1
like image 187
Jiri Kriz Avatar answered Oct 04 '22 22:10

Jiri Kriz


Here is the Objective C code snippet I came up with (which seems to be correct) if anybody is interested:

float x = 1;
do{
    fx = initialPaymentAmt+paymentAmt *(pow(x, numPayments+1)-x)/(x-1)+0*pow(x,numPayments)-totalLoanAmt;
    dx = paymentAmt *(numPayments * pow( x , numPayments + 1 ) - ( numPayments + 1 )* pow(x,numPayments)+1) / pow(x-1,2)+numPayments * 0 * pow(x,numPayments-1);
    z = fx / dx;
    x=x-z;
} while (fabs(z)>1e-9 ); 

apr=100*(pow(1/x,ppa)-1);
like image 25
Ben Avatar answered Oct 04 '22 21:10

Ben