[net.sources] loan analysis program

stevens@hsi.UUCP (02/02/84)

The program follows the discussion.
########################################################################
	The following is an engineer's perspective of how to calculate
monthly payments for a loan.  I an NOT an accountant, but welcome any
comments or criticisms on the following.  I was unable to find any
discussion of this topic in the books I have on hand, but am sure that
this stuff is discussed in detail somewhere.  My CRC math tables gave
some really strange tables for calculating the present value of a loan
(whatever that is), but nothing about calculating monthly payment.
Sylvia Porter's "Money Book" was equally useless, as was an undergrad
accounting text.

	Assume that you borrow an amount A for N months at an interest
rate I.  (I assume that the interest rate I is what they call the "APR").
The interest rate must be converted to a decimal value between
0 and 1 corresponding to the period of payment (assumed to be once a
month).  That involves taking a published loan rate such as 12.5% and
dividing the 12.5 by 1200 (12 * 100).  Assume that you want to pay back
the loan in N equal payments each payment being P.  (I assume throughout
that you make payments once a month but clearly this could be generalized
to any payment period.)

	When you make each payment of P dollars some portion goes to pay
interest and the remainder goes to pay off the principal (the balance).
Typically the interest is calculated as the rate I times the remaining
balance.  At each payment you can calculate the amount of interest you
are paying (I * remaining balance), the amount of the payment applied
to the principal (P - amount of interest) and the new balance of the
loan (previous balance - principal payment).  You can form the following
table:  (I use x**n to denote x raised to the n'th power - in honor of my
first programming language.)

Payment#  Interest	  Principal		Balance
--------  --------	  ---------		-------
   1	  IA		  P - AI		A + AI - P

   2	  I(A + AI - P)	  P - I(A + AI - P)	A + 2AI + A(I**2) - (2P - IP)

This table can be carried on to any payment number.  Lets take a numerical
example:
		A = $1,000.
		I = 12.5 / 1200		(12.5 %)
		N = 12			(one year)

The monthly payment comes to P = $89.08 (we'll derive this below) and
the loan analysis is:

	month  principal interest balance
	
	  1     78.66     10.42    921.34
	  2     79.48      9.60    841.86
	  3     80.31      8.77    761.55
	  4     81.15      7.93    680.40
	  5     81.99      7.09    598.41
	  6     82.85      6.23    515.56
	  7     83.71      5.37    431.85
	  8     84.58      4.50    347.27
	  9     85.46      3.62    261.81
	 10     86.35      2.73    175.46
	 11     87.25      1.83     88.21
	 12     88.16      0.92      0.05

In order to calculate the monthly payment, note that the final balance
comes out to be zero (or at least close enough for a scientist, the
discrepancy above is due to rounding to assure that every monthly payment
breakdown between interest and principal is accurate to 2 decimal places;
I'm sure accountants have some way to deal with this ??)

	Take the case of N=1 (simple interest).  The final balance must
equal zero, so

	A + AI - P = 0

Solve for P

	P = A + AI

or
	P = A(1 + I)

which is the equation for simple interest.  Now consider the case of N=2.
The final balance must equal zero, so
	
	A + 2AI + A(I**2) - (2P - IP) = 0

Solving for the monthly payment P gives

	    A(1 + 2I + I**2)
	P = ----------------
	        2 + I

Multiply top and bottom by I

	    AI(1 + 2I + I**2)
	P = -----------------
                2I + I**2

then add 1 and subtract 1 from the denominator

	    AI(1 + 2I + I**2)
	P = -----------------
            1 + 2I + I**2 - 1

From high school algebra we have that

	(1 + I)**2 = 1 + 2I + I**2

so we have

	     AI(1 + I)**2
	P = --------------
	    (1 + I)**2 - 1

Indeed, if you feel like going through a lengthy algebra exercise,
you will find that for any value of N

	     AI(1 + I)**N
	P = --------------
	    (1 + I)**N - 1

which is the formula for calculating the monthly payment.  When you
actually calculate the above, you can divide both top and bottom by the
(1 + I)**N term, to avoid calculating it twice (since an exponentiation
may be expensive).  Also, this is not a true proof - I did enough
cases to convince myself and the equation does evaluate to values of P
gotten from a real estate book for some test cases.  I'm sure the math
purists out there will want to do a proof by induction to prove that
it really holds for any N.

	Please send any comments, etc. to:

		Richard Stevens
	{ decvax | hao | seismo | sdcsvax } ! kpno ! hsi ! stevens
                                             ihnp4 ! hsi ! stevens

##########################################################################
/*
 * Calculate loan amortization.
 *
 * To compile under UNIX:
 *	cc -O -o loan loan.c -lm
 */

#include	<stdio.h>
#include	<math.h>

/*
 * Convert a double value to a dollars value with exactly two digits
 * to the right of the decimal point.  Round the third digit to the
 * right of the decimal point.
 */

#define	ROUND(x) ( (double) ( (long) ((x + 0.005) * 100.0) ) / 100.0 ) 

char	*pname;

main(argc, argv)
int   argc;
char  *argv[];
{
	double		atof(), amount, balance, intrate, interest, payment;
	double		principal, totinterest;
	int		i, nmonths;
	char		*s;

	pname = argv[0];

	amount = 0.0;
	intrate = 0.0;
	nmonths = 0;

	while ((--argc > 0) && ((*++argv)[0] == '-'))
		for (s = argv[0]+1; *s != '\0'; s++)
			switch (*s) {
			case 'a':
				if (--argc <=0)
				   error("-a option requires another argument",
					 NULL);
				amount = atof(*++argv);
				break;
				
			case 'i':
				if (--argc <=0)
				   error("-i option requires another argument",
					 NULL);
				intrate = atof(*++argv);
				break;
				
			case 'n':
				if (--argc <=0)
				   error("-n option requires another argument",
					 NULL);
				nmonths = atoi(*++argv);
				break;
				
			default:
				fprintf(stderr, "%s: illegal option %c\n",
					        pname, *s);
				break;
			}

	/*
	 * Operator prompts go to stderr, in case you want to
	 * pipe stdout to a file or a line printer filter.
	 */

	while (amount <= 0.0) {
		fprintf(stderr, "enter amount: ");
		scanf("%lf", &amount);
	}

	while ((intrate <= 0.0) || (intrate > 99.9)) {
		fprintf(stderr, "enter interest rate: ");
		scanf("%lf", &intrate);
	}

	while (nmonths <= 0) {
		fprintf(stderr, "enter #months: ");
		scanf("%d", &nmonths);
	}

	/*
	 * Now calculate what is required from the input above.
	 */

	intrate /= 1200;	/* convert to monthly percentage between
				   0.0 and 1.0 */

	payment = ROUND(amount * (intrate / (1.0 - (1.0 /
				pow(1.0 + intrate, (double) nmonths)))));
				/* monthly payment */

	printf("\nmonthly payment = $ %.2f\n",
		payment, payment*nmonths);

	/*
	 * Calculate and print amortization schedule.
	 */

	printf("\nmonth   interest  principal    balance\n\n");

	balance = amount;
	totinterest = 0.0;

	for (i = 1; i <= nmonths; i++) {
		interest = ROUND(balance * intrate);
			/* amount of this payment that is interest */
		totinterest += interest;

		principal = payment - interest;
			/* amount of this payment going to principal */

		balance -= principal;
			/* the principal decreases the loan balance */

		printf("%3d   %10.2f %10.2f %10.2f\n",
			i, interest, principal, balance);
	}
	printf("\nTotal interest = $ %.2f\n", totinterest);
	exit(0);
}

error(str1, str2)
char *str1, *str2;
{
	fprintf(stderr, "%s: ", pname);
	fprintf(stderr, str1, str2);
	fprintf(stderr, "\n");
	exit(1);
}

leung@imsvax.UUCP (02/07/84)

Posted Feb 2 stevens@hsi.UUCP in net.source has a program for
loan analysis.  There is no analytic proof of the formula he used.
The following is a proof of the formula.

The following lemma will be useful.

Lemma.  

      n
      _
      \         i          n+1
1 + a /  (1 + a)  = (1 + a)              (*)
      -
     i=0

Proof:

For i=0, lhs = 1 + a = rhs
Suppose for i=n, (*) holds
For i=n+1,
		     n+2
	lhs = (1 + a)
			     n+1
	    = (1 + a) (1 + a)

			     n
			     _
			     \ 	       i
	    = (1 + a) (1 + a /  (1 + a) )
                             -
                            i=0

		       n+1
			_
			\	  i
	    = 1 + a + a /  (1 + a)
			-
		       i=1

		   n+1
		    _
		    \
	    = 1 + a /  (1 + a) = rhs
	            -
		   i=0			 Q.E.D.

Back to the Loan Equation:

Theorem:

 	       n
     AI (1 + I)
P = ------------
           n
    (1 + I)  - 1

where P = Monthly Payment
      A = Loan Amount
      I = Monthly Interest Rate
          (Annual Interest Rate / 12)
      n = Number of Payments

Proof:

For n=1, the final balance is

	A(1 + I) - P = 0

For n=2, the final balance is

	(A(1 + I) - P)(1 + I) - P = 0
        
		2
	A(1 + I)  - P(1 + (1 + I)) = 0

For n=3, the final balance is

		 2
	(A(1 + I)  - P(1 + (1 + I)))(1 + I) - P = 0


		3                          2
	A(1 + I)  - P(1 + (1 + I) + (1 + I) ) = 0

For n=n, the final balance is

		     n-1
		      _
		n     \	        j
	A(1 + I)  - p /  (1 + I)  = 0
		      -
		     j=0

then,

		       n-1
			_
		 n	\         j
	AI(1 + I)  - pI /  (1 + I)  = 0
			-
		       j=0

Using the above Lemma,

		 n            n
	AI(1 + I)  - p((1 + I)  - 1) = 0

This completes the proof.