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