From 07ab3fbbe588d296c42e6bbd743bc7907644bef2 Mon Sep 17 00:00:00 2001 From: Erik Mackdanz Date: Wed, 14 Mar 2018 22:46:44 -0500 Subject: [PATCH] some scratchings of amortization code --- .gitignore | 1 + amortize.py | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 amortize.py diff --git a/.gitignore b/.gitignore index 0defb5c..0b899fa 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ **/*~ +**/*.pyc diff --git a/amortize.py b/amortize.py new file mode 100644 index 0000000..d2cf124 --- /dev/null +++ b/amortize.py @@ -0,0 +1,98 @@ +from datetime import date, timedelta + +def interest_next_payment(last_pay_date, + last_pay_balance, + next_pay_date, + daily_interest): + + diff = next_pay_date - last_pay_date + interval = diff.days + + compounded = (1 + daily_interest) ** interval + newbal = last_pay_balance * compounded + + return round(newbal - last_pay_balance, 2) + +# expect 55.22 +# print(interest_next_payment(date(2017,12,16), +# 14219.26, +# date(2018,1,12), +# 0.0525/365.0)) + +# expect 67.54 +# print(interest_next_payment(date(2018,1,12), +# 13809.65, +# date(2018,2,15), +# 0.0525/365.0)) + + +def amortize_to_end(last_pay_date, + last_pay_balance, + pay_dates_monthly, + daily_interest): + + # pay_dates_monthly in form: + # [(12,500.00),(28,200.00)] + + payments = [] + + while last_pay_balance > 0: + + closest_pay_date = None + closest_pay_amount = None + for one_pay_day, one_pay_amount in pay_dates_monthly: + one_pay_date = last_pay_date + while True: + one_pay_date += timedelta(1) + if one_pay_date.day == one_pay_day: + break + + if closest_pay_date: + if one_pay_date < closest_pay_date: + closest_pay_date = one_pay_date + closest_pay_amount = one_pay_amount + else: + closest_pay_date = one_pay_date + closest_pay_amount = one_pay_amount + + interest = interest_next_payment(last_pay_date, + last_pay_balance, + closest_pay_date, + daily_interest) + interest = round(interest,2) + last_pay_balance = last_pay_balance + interest - closest_pay_amount + last_pay_balance = round(last_pay_balance,2) + + # last payment + if last_pay_balance < 0: + last_pay_balance = 0 + + payments.append((closest_pay_date,last_pay_balance,interest)) + last_pay_date = closest_pay_date + + return payments + + +p = amortize_to_end(date(2017,12,16), + 14219.26, + [(12,500.00),(28,200.00)], + 0.0525/365.0) +# print(p) + +import ledger + +j = ledger.read_journal("ledger") +lbal = 0 +payment_date = None +for post in j.query("reg Liabilities:Hyundai"): + lbal += post.amount + payment_date = post.xact.date + # print("Posting {}".format(post.amount)) + +print("balance was {} on {}".format(lbal,payment_date)) +print(dir(lbal)) +p = amortize_to_end(payment_date, + -lbal.to_double(), + [(12,500.00),(28,200.00)], + 0.0525/365.0) +print(p) -- 2.52.0