2009-10-06 45 views
6

如何计算贷款的月费?Python:更智能的计算贷款支付方式

假设是:

  • 一:量贷款。
  • b:贷款期限(月数)。
  • c:利率p.a. (利息每月计算和增加,增加利息的1/12,所以如果利息是12%,则每月增加1%利息)。 d:期末结欠后的金额。
  • d:期末欠款金额。

这个问题有点不同于平常,因为目标不是让贷款在单独的期限结束后付清,而是还欠一定的金额。如果我想支付全部金额,我就能够找到一种算法来解决问题,但如果目标是由于给定数量而不是由于欠缺任何东西而最终结束,那么它就不能解决这个问题。

我设法解决这个问题,从猜测开始,然后继续改进猜测直到足够接近。不过,我想知道是否有更好的方法来简单计算,而不仅仅是猜测。

编辑:这是我现在正在做的。

def find_payment(start, end, months, interest): 
    difference = start 
    guess = int(start/months * interest) 
    while True: 
     total = start 
     for month in range(1, months + 1): 
      ascribe = total * interest/12 
      total = total + ascribe - guess 
     difference = total - end 
     # See if the guess was good enough. 
     if abs(difference) > start * 0.001: 
      if difference < 0: 
       if abs(difference) < guess: 
        print "payment is %s" % guess 
        return evolution(start, guess, interest, months) 
       else: 
        mod = int(abs(difference)/start * guess) 
        if mod == 0: 
         mod = 1 
        guess -= mod 
      else: 
       mod = int(difference/start * guess) 
       if mod == 0: 
        mod = 1 
       guess += mod 
     else: 
      print "payment is %s" % guess 
      return evolution(start, guess, interest, months) 

演变就是这样显示的贷款会是什么样子支付和支付利息的兴趣,总结支付利息的总金额等

一个例子是,如果我想给一个函数找出贷款开始$ 100,000和$ 50K用的8%权益,70个月期限结束的每月付款,要求

>>> find_payment(100000, 50000, 70, 0.08) 
payment is 1363 

在上述情况下,由于49935我将结束了,我经历了5次循环。通过循环所需的次数取决于我接近数量的距离有多近,并且会有所不同。

+1

也许如果你能提供你猜的解决方案,它成为你想要做什么清晰。 – nosklo 2009-10-06 13:39:52

+0

是不是只是一个简单的几何级数? http://en.wikipedia.org/wiki/Geometric_progression – Pod 2009-10-06 14:01:23

+0

“evolution()”在做什么功能?我在哪里可以找到该功能? – 2017-09-21 09:30:43

回答

9

这基本上是一个mortgage repayment calculation

假设开始大于end,而兴趣是0(即0.1为10%的股权)和1之间

首先考虑要还清款项的一部分。

pay_a = (interest/12)/(1 - (1+interest/12)^(-months))) * Principal 

然后,您需要考虑额外的利益:

Principal = start - end 

每月支付由下式给出。这只是等于剩余本金乘以月利率

pay_b = interest/12 * end 

因此总付款是

payment = (interest/12) * (1/(1 - (1+interest/12)^(-months))) * Principal + end) 

在你给的

Start: 100000 
End: 50000 
Months: 70 
Interest: 8% 
pay_a = 896.20 
pay_b = 333.33 
Payment = 1229.54 

当我在测试这些值的例子Excel在70笔支付后的剩余贷款为5万美元。假设您在每个月付款前支付名义上的利息。

0

您可以继续支付每月的利息;那么,你会一直欠着同样的灵魂。

Owe_1 = a 

Int_2 = Owe_1*(InterestRate/12) 
Pay_2 = Int_2 
Owe_2 = Owe_1 + Int_2 - Pay_2 # ==> Owe_1 + Int_2 - Int_2 = Owe_1 

Int_3 = Owe_2*(InterestRate/12) 
Pay_3 = Int_3 
Owe_3 = Owe_2 + Int_3 - Pay_3 # ==> Owe_2 + Int_3 - Int_3 = Owe_2 = Owe_1 
4

也许考虑这个最简单的方法是在两个部分分裂贷款,完全和另一部分,你不还清任何偿还一部分是。您已经计算出第一部分的月费。

+0

+1,正好!书中最简单的会计等值,真的。 – 2009-10-06 14:17:23

+0

聪明把贷款分成两部分,没有想到这一点。 – googletorp 2009-10-06 14:42:36

0

Python代码来计算EMI

class EMI_CALCULATOR(object): 
# Data attributes 
# Helps to calculate EMI 

    Loan_amount = None # assigning none values 
    Month_Payment = None # assigning none values 
    Interest_rate = None #assigning none values 
    Payment_period = None #assigning none values 

    def get_loan_amount(self): 
#get the value of loan amount 
     self.Loan_amount = input("Enter The Loan amount(in rupees) :") 
     pass 

    def get_interest_rate(self): 
    # get the value of interest rate 
     self.Interest_rate = input("Enter The Interest rate(in percentage(%)) : ") 
     pass 

    def get_payment_period(self): 
    # get the payment period" 
     self.Payment_period = input("Enter The Payment period (in month): ") 
     pass 


    def calc_interest_rate(self): 
    # To calculate the interest rate" 
     self.get_interest_rate() 

     if self.Interest_rate > 1: 
     self.Interest_rate = (self.Interest_rate /100.0) 

     else: 
     print "You have not entered The interest rate correctly ,please try again " 
     pass 

    def calc_emi(self): 
    # To calculate the EMI"   

     try: 

     self.get_loan_amount() #input loan amount 
     self.get_payment_period() #input payment period 
     self.calc_interest_rate() #input interest rate and calculate the interest rate 

     except NameError: 
      print "You have not entered Loan amount (OR) payment period (OR) interest rate correctly,Please enter and try again. " 

     try: 
     self.Month_Payment = (self.Loan_amount*pow((self.Interest_rate/12)+1, 
          (self.Payment_period))*self.Interest_rate/12)/(pow(self.Interest_rate/12+1, 
          (self.Payment_period)) - 1) 

     except ZeroDivisionError: 
        print "ERROR!! ZERO DIVISION ERROR , Please enter The Interest rate correctly and Try again." 

     else: 
     print "Monthly Payment is : %r"%self.Month_Payment 
     pass 


    if __name__ == '__main__':# main method 

     Init = EMI_CALCULATOR() # creating instances 


     Init.calc_emi() #to calculate EMI 

更多信息,请访问:https://emilgeorgejames.wordpress.com/2015/07/29/python-emi-equated-monthly-installment-calculator/

0

这个相当详细的方式,但会给整个支付以及

# Mortgage Loan that gives the balance and total payment per year 

# Function that gives the monthly payment 
def f1 (principle,annual_interest_rate,duration): 
    r = annual_interest_rate/1200 
    n = duration*12 
    a=principle*r*((1+r)**n) 
    b= (((1+r)**n)- 1) 
    if r > 0 : 
     MonthlyPayment = (a/b) 
    else : 
     MonthlyPayment = principle/n 

    return MonthlyPayment 

# Function that gives the balance 
def f2 (principle,annual_interest_rate,duration,number_of_payments): 
    r = annual_interest_rate/1200 
    n = duration*12 
    a= ((1+r)**n) 
    b= ((1+r)**number_of_payments) 
    c= (((1+r)**n)-1) 
    if r > 0 : 
     RemainingLoanBalance = principle*((a-b)/c) 
    else : 
     RemainingLoanBalance = principle*(1-(number_of_payments/n)) 

    return RemainingLoanBalance 
# Entering the required values 
principle=float(input("Enter loan amount: ")) 
annual_interest_rate=float(input("Enter annual interest rate (percent): ")) 
duration=int(input("Enter loan duration in years: ")) 

# Output that returns all useful data needed 
print ("LOAN AMOUNT:",principle,"INTEREST RATE (PERCENT):",annual_interest_rate) 
print ("DURATION (YEARS):",duration,"MONTHLY PAYMENT:",int(f1(principle,annual_interest_rate,duration))) 


k=duration+1 
BALANCE=principle 
total=0 
for i in range (1,k): 
    TOTALPAYMENT= f1(BALANCE,annual_interest_rate,k-i)*12 
    total+= TOTALPAYMENT 
    BALANCE= f2(principle,annual_interest_rate,duration,12*i) 
    print("YEAR:",i,"BALANCE:",int(BALANCE),"TOTAL PAYMENT",int(total)) 
0

怎么样这个?

def EMI_calc(principle, rate, time, frequency): 
    return (principle/((1-((1+(rate/frequency))**(-1*(time*frequency))))/(rate/frequency))) 

print(""" 
----- Welcome to EMI programe for Python ----- 
""") 
print("\n You have chosen to know the EMI for Loan.\n") 
input('\nTo Continue Press ENTER --- to ABORT Press ctrl+c > \n') 

print("\nPlease Enter amount of Loan to be taken: >\n") 
principle = int(input()) 
print("\nEnter rate of interst (%): >\n") 
rate = float(input())/100 
print("\nEnter Term (Years): >\n") 
time = float(input()) 
print("\nPlease enter the frequency of installments) : >\n") 
frequency = int(input()) 

EMI = round(EMI_calc(principle, rate, time, frequency),0) 

print(""" 

--------------------------------------------------------------------- 

""") 
print(f""" 
The EMI for Loan of Rs.{principle}; 
at interest rate of {rate*100} % for {time} years; 
would be: Rs.""", EMI) 

print(""" 

--------------------------------------------------------------------- 

""") 
+1

欢迎来到Stack Overflow!感谢您的代码片段,它可能会提供一些即时的帮助。通过展示*为什么*这是一个很好的解决方案,对未来的读者会有更好的解决方案,这将为它的教育价值提供一个合适的解释[//大大提高](// meta.stackexchange.com/q/114762)但不完全相同的问题。请编辑您的答案以添加解释,并指出适用的限制和假设。 – 2017-09-04 16:42:42

0

这是使用numpy函数的代码片段。这将向您显示每个月的付款,本金,利息,分期付款和总额。运行它并查看输出。您还可以检查Excel“IPMT()”和“PPMT()”函数的语法以获取更多参数说明。 https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.pmt.html#numpy.pmt

import math 
import numpy as np 
rate = 0.08 
start_amount = 100000.0 
end_amount = 50000.0 
diff_amount = start_amount - end_amount 
# nr_years = 4 
payment_frequency = int (12) 
nr_months = 70 # = nr_years * payment_frequency 
per_np = np.arange (nr_months) + 1 # +1 because index starts with 1 here 
pay_b = rate/payment_frequency * end_amount 
ipmt_np = np.ipmt (rate/payment_frequency, per_np, nr_months, diff_amount) - pay_b 
ppmt_np = np.ppmt (rate/payment_frequency, per_np, nr_months, diff_amount) 
for payment in per_np: 
    idx = payment - 1 
    principal = math.fabs (ppmt_np [idx]) 
    start_amount = start_amount - principal 
    interest = math.fabs (ipmt_np [idx]) 
    instalment = principal + interest 
    print payment, "\t", principal, "\t", interest, "\t\t", instalment, "\t\t", start_amount 
print np.sum (ipmt_np)