Python: более умный способ расчета платежей по кредиту - PullRequest
7 голосов
/ 06 октября 2009

Как рассчитать ежемесячную комиссию по кредиту?

Дано:

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

Эволюция - это просто функция, которая отображает, как кредит будет выглядеть как оплата за выплату и проценты за проценты, суммируя общую сумму уплаченных процентов и т. Д.

В качестве примера можно привести, если бы я хотел узнать ежемесячные платежи по кредиту, начиная с 100 тыс. Долл. И заканчивая 50 тыс. Долл. С процентной ставкой 8% и продолжительностью 70 месяцев, позвонив по номеру

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

В приведенном выше случае я должен был бы получить 49935, и я прошел через цикл 5 раз. Количество раз, необходимое для прохождения цикла, зависит от того, насколько близко я хочу приблизиться к сумме, и оно немного меняется.

Ответы [ 7 ]

10 голосов
/ 06 октября 2009

Это в основном расчет погашения ипотеки .

Предполагая, что начало больше конца, и этот процент составляет от 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. Это предполагает, что вы выплачиваете проценты по условной процентной ставке до того, как оплата будет произведена каждый месяц.

4 голосов
/ 06 октября 2009

Возможно, самый простой способ подумать об этом - это разделить кредит на две части: одну часть, которая должна быть погашена полностью, и другую, где вы ничего не погасите. Вы уже рассчитали ежемесячную плату за первую часть.

0 голосов
/ 21 сентября 2017

Вот фрагмент кода, использующий функции numpy. Это показывает вам платеж, основную сумму, проценты, взнос и total_amount каждый месяц. Запустите его и посмотрите вывод. Вы также можете проверить синтаксис для функций 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)
0 голосов
/ 04 сентября 2017

Как насчет этого?

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

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

""")
0 голосов
/ 14 февраля 2016

Это довольно подробный способ, но даст и весь платеж

# 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 голосов
/ 03 августа 2015

код 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 голосов
/ 06 октября 2009

Вы можете продолжать платить проценты каждый месяц; тогда ты всегда будешь в долгу.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...