2017-07-04 2 views
1

J'essaie de formuler une équation qui peut calculer le outstanding_balance en une seule fois en utilisant python. C'est assez simple en utilisant le processus itératif. Par exemple: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 

Alors self.amortMonths est essentiellement la durée mensuelle au cours de laquelle le prêt doit être payé au large et avec self.rate, ils détermineront la variable self.pmt qui est le montant mensuel de l'emprunteur doit payer afinde réduire la self.oringalPrin valeur à 0 à la fin de self.amortMonths.

Exemple:

Disons que j'ai un prêt de 1000 $ (OutstandingPrin) avec un taux d'intérêt de 10% alors mon paiement d'intérêts pour le premier mois est de 1000 * 10% = 100 $. Afin de trouver le montant self.pmt, j'ai utilisé une fonction numpy.pmt qui prend le outstandingPrin, taux, amortMonths en tant que paramètres pour générer une valeur de paiement mensuel qui permettra de réduire le OutstandingPrin à 0 à la fin de l'amortMonths. Disons que self.pmt = $120 puis le principal_pmt = 120 - 100 = $20. Donc, l'encours du mois prochain est 1000-20=$980. Alors cela devient juste un processus itératif.

J'ai donc vraiment besoin d'aide pour déterminer une équation qui peut le faire en une fois sans avoir besoin d'un processus itératif. Apparemment, je dois utiliser l'algèbre linéaire, mais je ne viens pas d'une formation en mathématiques, donc je me demandais si quelqu'un avait des idées?

EDIT:

donc quelque chose comme ceci:

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

+1

Avant de répondre, je suis tombé sur une nouvelle solution que j'essaie. Fondamentalement, en utilisant numpy, je suis en train de résoudre un tas d'équations du système. Pour chaque terme, il y a une équation. Je l'ai mis en format matriciel et utilise numpy pour le résoudre. A X = B. Mais j'apprécie vraiment votre solution et votre temps. – anderish

Répondre

0

Voici ma solution.

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) 

Les valeurs de tableau I les ont créées manuellement en fonction de calculs manuels.La prochaine étape serait pour moi de comprendre comment les générer automatiquement compte tenu de la durée, le solde initial et le taux d'intérêt.

2

crée Voici une implémentation Python de this Excel example avec les valeurs suivantes définies:

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 

Ensuite, vous pouvez utiliser Financial functions de NumPy pour trouver l'intérêt et du capital par période. Notez que ceux-ci ne dépendent pas de votre solde de prêt en cours. La bonne chose est que les résultats ci-dessous sont des tableaux (horaires de paiement):

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) 

calcul du solde impayé d'un certain temps utilise: enter image description here

Ce que nous pouvons définir ci-dessous. Attention aux signes lorsque vous implémentez.

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

De même, calculez une valeur PMT "constante". C'est l'intérêt plus le principal et est constant pendant toutes les périodes. C'est une valeur scalaire, plutôt que tableau.

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

Enfin, mettre ci-dessus ainsi que sous forme de tableau:

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