【问题标题】:Python: smarter way to calculate loan paymentsPython:计算贷款支付的更智能方法
【发布时间】:2010-12-04 06:43:44
【问题描述】:

如何计算贷款的月费?

给出的是:

  • a:贷款金额。
  • b:贷款期限(月数)。
  • c: 年利率(每个月计算加利息,加1/12的利息。所以如果利息是12%,每个月加1%的利息)。
  • 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)

evolution 只是一个函数,它显示贷款的支付方式和利息支付方式,总结支付的利息总额等。

举个例子,如果我想找出从 10 万美元到 5 万美元的贷款的每月还款额,利息为 8%,期限为 70 个月,调用

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

在上述情况下,我最终会欠 49935,我经历了 5 次循环。通过循环所需的次数取决于我想要达到的数量,并且会有所不同。

【问题讨论】:

  • 也许如果你能提供你的猜测解决方案,你想做什么就更清楚了。
  • 这不就是一个简单的几何级数吗? en.wikipedia.org/wiki/Geometric_progression
  • 函数“evolution()”是做什么的?我在哪里可以找到该功能?

标签: python algorithm math finance


【解决方案1】:

这基本上是一个mortgage repayment calculation

假设 start 大于 end,并且利息介于 0 和 1 之间(即 0.1 表示 10% 的利息)

首先考虑您要还清的付款部分。

Principal = start - end

每月付款由:

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

然后您需要考虑额外的兴趣。刚好等于剩余本金乘以月利息

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 笔付款后,剩余贷款为 50,000。这是假设您在每月付款之前支付名义利息。

【讨论】:

    【解决方案2】:

    也许考虑这一点的最简单方法是将贷款分成两部分,一部分是全额偿还,另一部分是您不偿还任何费用。您已经计算了第一部分的月费。

    【讨论】:

    • +1,完全正确!真的是书中最简单的会计等价物。
    • 巧妙地将贷款分成两部分,没想到。
    【解决方案3】:

    您可以继续支付每个月的利息;那么,您将永远欠相同的金额。

    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】:

      计算emi的python代码

      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/

      【讨论】:

        【解决方案5】:

        这是一种相当详细的方式,但也会支付全部款项

        # 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))
        

        【讨论】:

          【解决方案6】:

          这个怎么样?

          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("""
          
          ---------------------------------------------------------------------
          
          """)
          

          【讨论】:

          • 欢迎来到 Stack Overflow!感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
          【解决方案7】:

          这是一个使用 numpy 函数的代码 sn-p。这将向您显示每个月的付款、本金、利息、分期付款和总金额。运行它并查看输出。您还可以检查 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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-06-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-16
            相关资源
            最近更新 更多