2017-07-04 31 views
1

私はoutstanding_balanceをpythonを使って計算できる方程式を定式化しようとしています。それは反復プロセスを使用すると非常に簡単です。たとえば:Python CashFlow Calculator

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と一緒に、彼らは借り手が軽減するINORDERを支払わなければならない毎月の金額ですself.pmt変数を決定するときの毎月の期間でありますself.oringalPrinの値はself.amortMonthsの末尾まで0になります。

例:

は、私が最初の月のための私の利息の支払額が1000×10%= $ 100の10%の金利で$ 1000(OutstandingPrin)のローンを持っていると言うことができます。 self.pmtの金額を見つけるために、私はnumpy.pmt関数を使ってoutstandingPrin、rate、amortMonthsをパラメータとして取って毎月の支払い額を生成し、amortMonthsの終わりまでOutstandingPrinを0に減らしました。 self.pmt = $120、次にprincipal_pmt = 120 - 100 = $20と言います。したがって、来月のoutstandingPrinは1000-20=$980です。それはちょうど繰り返しプロセスになります。

私は実際には、反復プロセスを必要とせずにこれを行うことができる式を決定するためにいくつかの助けが必要です。どうやら、私は線形代数を使用する必要がありますが、私は数学の背景から来ていないので、私は誰もがアイデアを持っているのだろうかと思っていた?

EDIT:

したがって、このような何か:

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

+1

あなたが答える前に、私が試している新しい解決策を見つけました。基本的に、numpyを使って、私は一連のシステム方程式を解いています。各項には方程式があります。私はそれを行列形式にして、numpyを使って解きます。 A X = B.しかし、私は本当にあなたの解答と時間を感謝します。 – anderish

答えて

0

は私のソリューションです。

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) 

私は手作業で計算した値を手作業で作成しました。次のステップは、用語、元の残高、金利をもとに自動生成する方法を私が理解することです。

2

は、以下に設定され、次の値を持つthis Excel exampleの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ののFinancial functionsを使用することができます。これらは実行中のローン残高に依存しないことに注意してください。一定時間使用のように残高を計算

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) 

enter image description here

我々は以下に定義することができます良いところは、以下の結果が配列(支払い予定)であるということです。あなたが実装するときに徴候に注意してください。

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