tags:

views:

307

answers:

2

I need an formula for determining a debt payoff plan where the following are known: number of payments, amount per payment, and principal and need to figure out what the interest rate would be from that. I am re-factoring existing code and the current method uses the following (compounded = 12;interest rate starts at .1) :

 while (counter < 100)
    {
        intermediatePayment = (interestRate*(principal/compounded))/(1 - (1/Math.Pow(interestRate/compounded + 1,(compounded*numberOfYears))));
        interestIncrement = Math.Abs(interestRate - previousRate)/2;
        previousRate = interestRate;

        if(intermediatePayment == payment)
            break;
        if (intermediatePayment > payment)
            interestRate -= interestIncrement;
        else
            interestRate += interestIncrement;
        counter++;
    }

Now I understand what this formula does but I would never be able to arrive at it myself. What's here is actually an equation that is supposed to be used to determine monthly payment if interest rate,principal, and number of payments is known. It is using brute force and looping (at most 100 times) until the calculated payment equals the desired payment. It arrives at an answer usually after about 40-50 loops and that could be optimized by reducing significant digits.

Seems to me if we just solved for interestRate there would be no looping. Try as I might, I can't get the equation to solve for I, so that's my main question.

Now, if you understand the problem well enough and know financial formulas and compounding interest, you might provide me with an even better solution altogether, which would be awesome. I have done significant research myself and found tools but not the raw equation, or more often I find different formulas for determining interest related stuff but am not knowledgeable to retool them for my needs.

Basically I've spent too much time on this and my boss thinks since the loop works I need to leave it be or ask for help. Fair enough, so I am. :)

Here's a more traditional layout of the formula if that helps any: http://i.imgur.com/BCdsV.png

And for test data: if

  • P=45500
  • c=12
  • y=3
  • m=1400

then

  • I = .0676

Thanks for the help

A: 

This formula cannot be explicitly solved for I, so you can stop trying. On the other hand, the loop goes way beyond common sense in precision. You can surely stop when you are within half cent of the payment amount or when the increment in the estimate of I gets below 0.0001, since there was some rounding during the original calculations anyway.

Aniko
+5  A: 

If you attempt to solve the formula you linked to for I, the interest rate, you'll find that you get a polynomial of degree cy+1, that is, the total number of payments plus one. It is difficult/impossible to find closed form solutions to high degree polynomials, so an approximation is the best you can do.

The algorithm you've given has some nice properties: it is pretty clear what it is doing, and it gives the right answer in a reasonable amount of time. My attitude would therefore be "if it ain't broke don't try to fix it".

If it turned out that this algorithm was too slow for some reason then there are algorithms which converge to the right answer faster; you could work out what the polynomial you need to find roots of is, work out its derivative using simple calculus, and then use Newton's Method to converge to the roots faster. But for this simple example where the answer only has to be accurate to four decimal places anyway, that seems like overkill.

Eric Lippert
As an aside, there are a number of reasonably good C# libraries of financial functions, one of the more popular being QuantLib (http://quantlib.org/index.shtml). There's also a nice port of the Excel functions (including financial ones) available at: (http://code.msdn.microsoft.com/FinancialFunctions).
LBushkin
For those who are interested, but may not be aware, the proof that higher order polynomials don't have closed form solutions in terms of a finite number of additionals, subtractions, divisions, etc (except for certain special circumstances) is known as Abel's Impossibility Theorem. The detailed proof is not for the faint of heart: http://en.wikipedia.org/wiki/Abel%E2%80%93Ruffini_theorem
LBushkin