]> Humopery - private/ledgerfile.git/commitdiff
some scratchings of amortization code
authorErik Mackdanz <erikmack@gmail.com>
Thu, 15 Mar 2018 03:46:44 +0000 (22:46 -0500)
committerErik Mackdanz <erikmack@gmail.com>
Thu, 15 Mar 2018 03:46:44 +0000 (22:46 -0500)
.gitignore
amortize.py [new file with mode: 0644]

index 0defb5ccec4d2cc3c131814f89a29ce5605ebac7..0b899fa0d2cb357c51e78914ca664e03fc3981eb 100644 (file)
@@ -1 +1,2 @@
 **/*~
+**/*.pyc
diff --git a/amortize.py b/amortize.py
new file mode 100644 (file)
index 0000000..d2cf124
--- /dev/null
@@ -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)