#coding:utf-8
import sys
from prettytable import PrettyTable

'''
月利率 = 年利率/12

1.等额本息计算公式:每月还款金额 =〔贷款本金×月利率×(1+月利率)^还款月数〕÷〔(1+月利率)^还款月数 - 1〕
  每月利息 = 每月还款金额 - (1 + 月利率 )^(还款期数-1) * (每月还款金额 - 月利率*贷款本金)
  每月偿还本金 = ( 1 + 月利率)^(还款期数-1) * (每月还款金额 - 月利率*贷款本金)

 
2.等额本金计算公式:每月还款金额 =(贷款本金 / 还款月数)+(本金 — 已归还本金累计额)* 每月利率
    每月偿还本金=贷款本金/还款月数
    每月利息=(本金-累计已还本金)×月利率

'''
YEAR_LPR=0.0385 #年利率
MONTH_LPR=round(YEAR_LPR/12,12) #月利率
UNIT= 10000 #单位万元

'''
月供计算
periods:第n期还款
pay_month:总还款月数
total:单位(万元)
等额本息:pay_way=1
等额本金:pay_way=2
'''

#月供
def get_month_pay(total,periods=1,pay_month=360,pay_way=1):
    result=0
    if pay_way==1:
        result = (total*UNIT*MONTH_LPR*((MONTH_LPR+1)**pay_month))/((MONTH_LPR+1)**pay_month-1)
    elif pay_way==2:
        result=(total*UNIT/pay_month)+(total*UNIT - (total*UNIT/pay_month)*(periods-1) )*MONTH_LPR
    return round(result,6)

#  每月还款利息
def get_month_interest(total,periods=1,pay_month=360,pay_way=1):
    result=0
    if pay_way==1:
        month_pay  = round((total*UNIT*MONTH_LPR*((MONTH_LPR+1)**pay_month))/((MONTH_LPR+1)**pay_month-1),6) #每月还款金额
        result = month_pay-((1 + MONTH_LPR)**(periods-1)) * (month_pay - MONTH_LPR * total * UNIT)
    elif pay_way==2:
        result = (total*UNIT - (total*UNIT/pay_month)*(periods-1) )*MONTH_LPR
    return round(result,6)

#每月还款本金
def get_month_principal(total,periods=1,pay_month=360,pay_way=1):
    result=0
    if pay_way==1:
        month_pay  = round((total*UNIT*MONTH_LPR*((MONTH_LPR+1)**pay_month))/((MONTH_LPR+1)**pay_month-1),6) #每月还款金额
        result = ((1 + MONTH_LPR)**(periods-1)) * (month_pay - MONTH_LPR * total* UNIT)

    elif pay_way==2:
        result = total*UNIT/pay_month
    return round(result,6)


def main(total,pay_month):
    tb = PrettyTable(["期数", "还款金额", "还款本金","还款利息","总还款数","总还款本金","剩余还款本金","总还款利息"])
    sum_month_pay1 =0 
    sum_month_pay2 =0
    sum_month_principal1=0
    sum_month_principal2 =0
    sum_month_interest1 = 0
    sum_month_interest2 = 0
    for periods in range(1,pay_month+1):
        month_pay1=get_month_pay(total,periods,pay_month,pay_way=1) #月供
        month_pay2=get_month_pay(total,periods,pay_month,pay_way=2)

        month_interest1 = get_month_interest(total,periods,pay_month,pay_way=1) #利息
        month_interest2 = get_month_interest(total,periods,pay_month,pay_way=2)

        month_principal1 = get_month_principal(total,periods,pay_month,pay_way=1)  #本金
        month_principal2 = get_month_principal(total,periods,pay_month,pay_way=2)

        sum_month_pay1 += month_pay1 #总还款数
        sum_month_pay2 += month_pay2

        sum_month_principal1 += month_principal1 #总还款本金
        sum_month_principal2 += month_principal2

        sum_month_interest1 += month_interest1 #总还款利息
        sum_month_interest2 += month_interest2


        


        row1=['等额本息-{}'.format(periods),round(month_pay1,2),round(month_principal1,2),round(month_interest1,2),round(sum_month_pay1,2),round(sum_month_principal1,2),
round(total*UNIT -sum_month_principal1,2),round(sum_month_interest1,2)] row2=['等额本金-{}'.format(periods),round(month_pay2,2),round(month_principal2,2),round(month_interest2,2),round(sum_month_pay2,2),round(sum_month_principal2,2),
round(total*UNIT -sum_month_principal2,2),round(sum_month_interest2,2)] tb.add_row(row1) tb.add_row(row2) # if periods>24:break print(tb) if __name__ == "__main__": main(45,360)

  

 

 posted on 2024-03-21 16:38  boye169  阅读(3)  评论(0编辑  收藏  举报