计算贷款还款
等额本金与等额本息贷款
银行提供的贷款一般有两种分期付款方式:等额本金和等额本息,等额本金是指每个月还的本金都是一样的,利息是动态变化的,随着每期归还本金不断递减。等额本息是指还款总额(本金+利息)均等地分摊到每个月,即每个月还款额都是一样。
假设贷款总额为B,银行月利率为y,还款总期数为m(月),第j个月还款额为hj,第j个月已还款累计总额为Hj,下面给出了两种贷款方式的还款公式。
等额本金每月的还款公式:
hj = B/m + (B - Hj)*y
等额本息的月还款公式:
h = B * y * (1+y)**m / ((1+y)**m - 1)
从公式可以看出,等额本金还款需要每个月单独计算,每个月还款的第一项是不变的,称为本金还款,第二项是变化的,是利息还款,利息还款随着还款时间推进而不断减少。等额本息每个月的还款额是相同的,只需要计算一次。
计算还款Python程序
def repay(b, y, r, mode=1):
“”"
按贷款总额、利率、年限、方式,进行月还款与利息计算
:parameter
:param b:float 贷款总额
:param y:int 还款年数,正整数
:param r:float 年利率
:param mode:int 还款方式,1–等额本金, 2–等额本息
:return:tuple
(month_repay: list, total_repay: float, total_interest: float)
(月还款,总还款,总利息)
# 示例1:使用等额本息方式
>>> r1 = repay(2000000, 30, 0.049, mode=1)
>>> round(r1.month_repay[0], 2)
13722.22
>>> round(r1.total_repay, 2)
3474083.33
>>> round(r1.total_interest, 2)
1474083.33
# 示例2:使用等额本息方式
>>> r2 = repay(2000000, 30, 0.049, mode=2)
>>> format(r2.month_repay[0], ‘.2f’)
‘10614.53’
“”"
# 还款月数、月息
m = y * 12
mr = r / 12
# 计算月还款
if mode == 1:
# 等额本金方式每月本金、利息、还款
month_principle = [b/m] * m
month_interest = [(b - b/m * j) * mr for j in range(m)]
month_repay = [x+y for x, y in zip(month_principle, month_interest)]
elif mode == 2:
# 等额本息方式月还款
month_repay = [(b * mr * (1 + mr) ** m) / ((1 + mr) ** m - 1)] * m
else:
# 无效模式
raise ValueError(‘Invalid Mode: {}’.format(mode))
# 总还款
total_repay = sum(month_repay)
# 总利息
total_interest = total_repay - b
# 计算结果的命名元组
return (month_repay, total_repay, total_interest)