簡體   English   中英

Python CashFlow計算器

[英]Python CashFlow Calculator

我正在嘗試制定一個方程式,可以使用python一口氣計算出outstanding_balance 使用迭代過程非常簡單。 例如:

for month in range(1, self.amortMonths + 1):

        # Calculate intial and future interest payments

        interest = self.originalPrin * self.rate / 12

        # Calculate intial and future principal payments

        principal_pmt = self.pmt - interest

        # Outstanding balance is reduced by the principal_pmt

        self.originalPrin = self.originalPrin - principal_pmt

因此self.amortMonths基本上是必須償還貸款的每月期限,並且與self.rate ,它們將確定self.pmt變量,該變量是借款self.oringalPrin降低self.oringalPrin值而必須支付的每月金額。於0由的末端self.amortMonths

例:

假設我有一筆1000美元的貸款(OutstandingPrin),利率為10%,那么我第一個月的利息為1000 * 10%= 100美元。 為了找到self.pmt金額,我使用了numpy.pmt函數,該函數將未完成的Prin,rate,amortMonths作為參數來生成每月付款值,該值將在amortMonths結束時將OutstandingPrin減少為0。 假設self.pmt = $120principal_pmt = 120 - 100 = $20 self.pmt = $120 principal_pmt = 120 - 100 = $20 因此,下個月的1000-20=$9801000-20=$980 然后,這只是一個迭代過程。

因此,實際上,我需要一些幫助來確定無需迭代過程即可一次完成此操作的方程式。 顯然,我需要使用線性代數,但是我不是來自數學背景,所以我想知道是否有人有任何想法?

編輯:

所以像這樣:

Balance_i = Balance_i-1 - (pmt - Balance_i-1 * Rate)

下面創建了具有以下值的Excel示例的Python實現:

import pandas as pd
import numpy as np

prin = 200000 # principal/beginning loan balance
rate = 0.0675 # annual rate; monthly will be 6.75%/12
n = 30 # years; total periods will be 360 w/ monthly pmts

接下來,您可以使用NumPy的“ 財務”功能查找每個期間的利息和本金。 請注意,這些不取決於您的流動貸款余額。 令人高興的是,下面的結果是數組(付款時間表):

months = np.arange(1, n * 12 + 1) # months 1 thru 360
principal = np.ppmt(rate / 12, months, n * 12, prin)
interest = np.ipmt(rate / 12, months, n * 12, prin)

計算特定時間的未償余額使用: 在此處輸入圖片說明

我們可以在下面定義。 實施時請小心標志。

def balance(pv, r, n, p):
    dfac = (1 + r / 12) ** n
    return pv * dfac - p * (dfac - 1) / (r / 12) 

同樣,計算“恆定” PMT值。 這是利息加本金,並且在所有期間都是恆定的。 這是一個標量值,而不是數組。

pmt = np.pmt(rate / 12, n * 12, prin)

最后,將以上內容以表格形式放在一起:

table = pd.DataFrame({'Beg Balance' : balance(prin, rate, months - 1, -pmt),
                      'Principal' : principal,
                      'Interest' : interest,
                      'End Balance' : balance(prin, rate, months, -pmt)},
                     index=months)

# Check that the loan amortizes down to 0
assert np.allclose(table['End Balance'].tail(1), 0)

print(table.round(2))
     Beg Balance  End Balance  Interest  Principal
1      200000.00    199827.80  -1125.00    -172.20
2      199827.80    199654.64  -1124.03    -173.16
3      199654.64    199480.50  -1123.06    -174.14
4      199480.50    199305.38  -1122.08    -175.12
5      199305.38    199129.28  -1121.09    -176.10
..           ...          ...       ...        ...
356      6377.95      5116.63    -35.88   -1261.32
357      5116.63      3848.22    -28.78   -1268.42
358      3848.22      2572.67    -21.65   -1275.55
359      2572.67      1289.94    -14.47   -1282.72
360      1289.94        -0.00     -7.26   -1289.94

這是我的解決方案。

import numpy as np

a = np.array([[1,0,0,0,0], [1.00583333,-1,0,0,-1], [0, 1.005833333, -1, 0, -1], [0,0,1.005833333, -1, -1],[0,0,0,1,0]])
b = np.array([162000,0,0,0,0])
x = np.linalg.solve(a, b)
balance_arr = np.delete(x, -1)
print(balance_arr)

interest_arr = balance_arr * 0.07/12
print(interest_arr)

prin_payment = np.subtract(54631.22, interest_arr)
prin_payment[-1] = 0
print(prin_payment)

np.allclose(np.dot(a,x), b)

我根據手動計算手動創建了數組值。 下一步是讓我確定在給定期限,原始余額和利率的情況下如何自動生成它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM