Formula for APR with Odd Days

I need to programmatically calculate APR based on the following inputs:

• Principal Amount
• Number of payments (for example, 3 months loan is 3 if paying monthly, or 6 bi-weekly payments)
• Payment each period

From this, I need the formula for APR.

Second, the customer may have an odd number of days before their first payment. I need to be able to plug this in as a variable in to calculation and get an adjusted APR.

Can someone help me with the formula for this?

• For the principal amount $a$, number of payments $n$ to be made, the payment amount $p$, are you assume that after $n$ payments the loan will be paid off? You will also need an extra input that helps distinguish between 6 monthly payments and 6 biweekly payments, as the APR will be different for these cases. – Sasha May 23 '12 at 20:31

Let $r$ denote the APR we seek to establish, and the payments are made each $\frac{1}{n}$ of the year (i.e. $n=12$ for monthly payments, and $n=26$ for biweekly). Let $a_k$ be the principal amount of the loan at the beginning of the $k$-th period. Then $a_0 = a$, and $$a_{k+1} = a_k (1+r)^{1/n}-p$$ Such a recurrence equation is not hard to solve using generating function technique, i.e. multiplying both sides of the equation with $x^k$ (for some indeterminate $x$) and forming $g(x) = \sum_{k=0}^\infty a_k x^k$: $$\begin{eqnarray} \sum_{k=0}^\infty a_{k+1} x^k &=& (1+r)^{1/n} \sum_{k=0}^\infty a_k x^k - p \sum_{k=0}^\infty x^k \\ \frac{f(x)-a_0}{x} &=& (1+r)^{1/n} f(x) - p \frac{1}{1-x} \\ f(x) &=& \frac{1}{(1+r)^{1/n}-1} \left( \frac{p}{1-x} - \frac{a + p - a(1+r)^{1/n}}{1 - (1+r)^{1/n} x} \right) \\ a_{k} &=& \frac{1}{(1+r)^{1/n}-1} \left( p - \left( a + p - a (1+r)^{1/n} \right) (1+r)^{k/n} \right) \end{eqnarray}$$ Requirement that after $m$ equal payments the loan is paid off gives the equation for effective annual percentage rate $r$: $$p = \left( a + p - a (1+r)^{1/n} \right) (1+r)^{m/n}$$ As this is a non-linear equation, solving for $r$ will need to be done numerically. Here is a code in Mathematica:

In:= FindAPR[a0_, p_, m_, n_] :=
Block[{sol},
sol = FindRoot[
p == (a0 + p - a0 (1 + r)^(1/n)) ((1 + r)^(m/n)), {r, 1/2}];
If[sol === {}, Indeterminate, r /. First[sol]]]

In:= FindAPR[1000, 256, 4 (* payments *), 12 (* paid monthly *)]*100

Out= 12.0876

If the time to the first payment is different, $a_0$ needs to be replaced with different effective principal amount, $a_0^\ast = a_0 \left(1 + r \right)^{d/n}$, where $d$ is the length of the no-payment period given as a fraction of payment intervals. For example, if payments are made monthly $n=12$, there are 4 payments to be made $m=4$ in the amount of $p=\$260.00$on the loan of$\$1000.00$ with 1 month no payment period, the effective APR is

In:= FindAPR2[a0_, p_, m_, n_, d_] :=
Block[{sol},
sol = FindRoot[
p == (p - a0 (1 + r)^(d/n) ( (1 + r)^(1/n) - 1)) ((1 + r)^(m/
n)), {r, 1/2}];
If[sol === {}, Indeterminate, r /. First[sol]]]

In:= FindAPR2[1000, 260, 4, 12, 1]*100

Out= 14.4241