Support finance.el
Create a finance module to help me cheaply calculate things like the future value of a Spotify subscription or Dropbox subscription or Jiu Jitsu membership.
This commit is contained in:
		
							parent
							
								
									f5e19abcb3
								
							
						
					
					
						commit
						eba6ea6762
					
				
					 1 changed files with 119 additions and 0 deletions
				
			
		
							
								
								
									
										119
									
								
								configs/shared/.emacs.d/wpc/finance.el
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								configs/shared/.emacs.d/wpc/finance.el
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,119 @@
 | 
				
			||||||
 | 
					;;; finance.el --- Functions to help me organize my finances -*- lexical-binding: t -*-
 | 
				
			||||||
 | 
					;; Author: William Carroll <wpcarro@gmail.com>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Commentary:
 | 
				
			||||||
 | 
					;; Using functions to organize my financial thinking.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;; Code:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
				
			||||||
 | 
					;; Dependencies
 | 
				
			||||||
 | 
					;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(require 'prelude)
 | 
				
			||||||
 | 
					(require 'math)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
				
			||||||
 | 
					;; Library
 | 
				
			||||||
 | 
					;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(defvar finance/enable-tests? t
 | 
				
			||||||
 | 
					  "When t, run the tests defined herein.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;; TODO: Support printing an org-table of these amount in a similar format to:
 | 
				
			||||||
 | 
					;; https://keisan.casio.com/exec/system/1234231998
 | 
				
			||||||
 | 
					(cl-defun finance/future-value (amt
 | 
				
			||||||
 | 
					                                &key
 | 
				
			||||||
 | 
					                                num-years
 | 
				
			||||||
 | 
					                                (frequency 'monthly)
 | 
				
			||||||
 | 
					                                (interest-rate 0.06)
 | 
				
			||||||
 | 
					                                (payment-due-at 'beg)
 | 
				
			||||||
 | 
					                                (present-value 0))
 | 
				
			||||||
 | 
					  "Compute the Future Value of AMT.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This function assumes that the interest rate is applied annually and not
 | 
				
			||||||
 | 
					monthly.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This function will attempt to provide the following defaults:
 | 
				
			||||||
 | 
					- frequency: 'monthly
 | 
				
			||||||
 | 
					- interest-rate: 6%
 | 
				
			||||||
 | 
					- payment-due-at: 'beg
 | 
				
			||||||
 | 
					- present-value: 0.00"
 | 
				
			||||||
 | 
					  (prelude/assert (set/contains? payment-due-at (set/new 'beg 'end)))
 | 
				
			||||||
 | 
					  (prelude/assert (set/contains? frequency (set/new 'annually
 | 
				
			||||||
 | 
					                                                    'semiannually
 | 
				
			||||||
 | 
					                                                    'quarterly
 | 
				
			||||||
 | 
					                                                    'monthly)))
 | 
				
			||||||
 | 
					  (let ((pmt amt)
 | 
				
			||||||
 | 
					        (k (alist/get frequency '((annually . 1)
 | 
				
			||||||
 | 
					                                  (semiannually . 2)
 | 
				
			||||||
 | 
					                                  (quarterly . 4)
 | 
				
			||||||
 | 
					                                  (monthly . 12))))
 | 
				
			||||||
 | 
					        (r interest-rate)
 | 
				
			||||||
 | 
					        (n num-years)
 | 
				
			||||||
 | 
					        (pv present-value))
 | 
				
			||||||
 | 
					    (if (= 0 r)
 | 
				
			||||||
 | 
					        (+ pv (* pmt n k))
 | 
				
			||||||
 | 
					      (if (equal 'beg payment-due-at)
 | 
				
			||||||
 | 
					          (+ (* pv (math/exp (+ 1 (/ r k)) (* n k)))
 | 
				
			||||||
 | 
					             (* pmt
 | 
				
			||||||
 | 
					                (/ (- (math/exp (+ 1 (/ r k)) (* n k)) 1)
 | 
				
			||||||
 | 
					                   (/ r k))
 | 
				
			||||||
 | 
					                (+ 1 (/ r k))))
 | 
				
			||||||
 | 
					        (+ (* pv (math/exp (+ 1 (/ r k)) (* n k)))
 | 
				
			||||||
 | 
					           (* pmt
 | 
				
			||||||
 | 
					              (/ (- (math/exp (+ 1 (/ r k)) (* n k)) 1)
 | 
				
			||||||
 | 
					                 (/ r k))))))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
				
			||||||
 | 
					;; Tests
 | 
				
			||||||
 | 
					;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(when finance/enable-tests?
 | 
				
			||||||
 | 
					  (prelude/assert
 | 
				
			||||||
 | 
					   (equal "1551.27"
 | 
				
			||||||
 | 
					          (string/format "%0.2f"
 | 
				
			||||||
 | 
					                         (finance/future-value
 | 
				
			||||||
 | 
					                          9.99
 | 
				
			||||||
 | 
					                          :interest-rate 0.05
 | 
				
			||||||
 | 
					                          :num-years 10
 | 
				
			||||||
 | 
					                          :frequency 'monthly
 | 
				
			||||||
 | 
					                          :payment-due-at 'end
 | 
				
			||||||
 | 
					                          :present-value 0))))
 | 
				
			||||||
 | 
					  (prelude/assert
 | 
				
			||||||
 | 
					   (equal "14318.34"
 | 
				
			||||||
 | 
					          (string/format "%0.2f"
 | 
				
			||||||
 | 
					                         (finance/future-value 10.0 :num-years 35))))
 | 
				
			||||||
 | 
					  (prelude/assert
 | 
				
			||||||
 | 
					   (equal "4200.00"
 | 
				
			||||||
 | 
					          (string/format "%0.2f"
 | 
				
			||||||
 | 
					                         (finance/future-value
 | 
				
			||||||
 | 
					                          10.0
 | 
				
			||||||
 | 
					                          :interest-rate 0.0
 | 
				
			||||||
 | 
					                          :num-years 35
 | 
				
			||||||
 | 
					                          :frequency 'monthly
 | 
				
			||||||
 | 
					                          :payment-due-at 'beg
 | 
				
			||||||
 | 
					                          :present-value 0))))
 | 
				
			||||||
 | 
					  (prelude/assert
 | 
				
			||||||
 | 
					   (equal "14318.34"
 | 
				
			||||||
 | 
					          (string/format "%0.2f"
 | 
				
			||||||
 | 
					                         (finance/future-value
 | 
				
			||||||
 | 
					                          10.0
 | 
				
			||||||
 | 
					                          :interest-rate 0.06
 | 
				
			||||||
 | 
					                          :num-years 35
 | 
				
			||||||
 | 
					                          :frequency 'monthly
 | 
				
			||||||
 | 
					                          :payment-due-at 'beg
 | 
				
			||||||
 | 
					                          :present-value 0))))
 | 
				
			||||||
 | 
					  (prelude/assert
 | 
				
			||||||
 | 
					   (equal "38282.77"
 | 
				
			||||||
 | 
					          (string/format "%0.2f"
 | 
				
			||||||
 | 
					                         (finance/future-value
 | 
				
			||||||
 | 
					                          10.0
 | 
				
			||||||
 | 
					                          :interest-rate 0.1
 | 
				
			||||||
 | 
					                          :num-years 35
 | 
				
			||||||
 | 
					                          :frequency 'monthly
 | 
				
			||||||
 | 
					                          :payment-due-at 'beg
 | 
				
			||||||
 | 
					                          :present-value 0)))))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					(provide 'finance)
 | 
				
			||||||
 | 
					;;; finance.el ends here
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue