diff options
Diffstat (limited to 'mortgage.py')
| -rw-r--r-- | mortgage.py | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/mortgage.py b/mortgage.py new file mode 100644 index 0000000..3b9b958 --- /dev/null +++ b/mortgage.py | |||
| @@ -0,0 +1,55 @@ | |||
| 1 | import argparse | ||
| 2 | import math | ||
| 3 | import sys | ||
| 4 | from tabulate import tabulate, SEPARATING_LINE | ||
| 5 | |||
| 6 | |||
| 7 | def calc_payments(principal, annual_interest, installments): | ||
| 8 | p = principal | ||
| 9 | i = annual_interest / 100 / 12 # Monthly equivalent. | ||
| 10 | n = installments | ||
| 11 | |||
| 12 | def fmt(x): | ||
| 13 | return f"{math.ceil(x*100)/100:.2f}" | ||
| 14 | |||
| 15 | table = [["Time", "Outstanding Debt", "Monthly Installment", "Interest Paid", "Amount Amortised"]] | ||
| 16 | |||
| 17 | monthly_installment = p * (i * (1 + i)**n) / ((1 + i)**n - 1) | ||
| 18 | debt = principal | ||
| 19 | total_interest = 0 | ||
| 20 | total_amortised = 0 | ||
| 21 | |||
| 22 | for k in range(n): | ||
| 23 | interest = i * debt | ||
| 24 | amortised = monthly_installment - interest | ||
| 25 | table.append([k] + [fmt(x) for x in [debt, monthly_installment, interest, amortised]]) | ||
| 26 | |||
| 27 | total_interest += interest | ||
| 28 | total_amortised += amortised | ||
| 29 | debt -= amortised | ||
| 30 | |||
| 31 | total_interest_pct = total_interest / principal * 100 | ||
| 32 | |||
| 33 | table.append(SEPARATING_LINE) | ||
| 34 | table.append(["Total", "", "Amount Paid", "Interest Paid", "Amount Amortised"]) | ||
| 35 | table.append(["", ""] + [ | ||
| 36 | fmt(monthly_installment * n), | ||
| 37 | fmt(total_interest) + f" ({fmt(total_interest_pct)}%)", | ||
| 38 | fmt(total_amortised)]) | ||
| 39 | return table | ||
| 40 | |||
| 41 | |||
| 42 | def main(): | ||
| 43 | parser = argparse.ArgumentParser() | ||
| 44 | parser.add_argument("-p", "--principal", type=float, default=100000, help="Principal") | ||
| 45 | parser.add_argument("-i", "--interest", type=float, default=5, help="Annual interest %") | ||
| 46 | parser.add_argument("-n", "--installments", type=int, default=300, help="Number of installments") | ||
| 47 | args = parser.parse_args() | ||
| 48 | |||
| 49 | table = calc_payments(args.principal, args.interest, args.installments) | ||
| 50 | print(tabulate(table)) | ||
| 51 | return 0 | ||
| 52 | |||
| 53 | |||
| 54 | if __name__ == "__main__": | ||
| 55 | sys.exit(main()) | ||
