每月还款计算方式
等额本息的特点是每期还款额固定,由本金与利息组成,设为
设贷款总额为,还款总期数为
,月利率为
,年利率为
,则有
从第一期还款日之后每期欠款余额为
第期还款前产生的利息为
,总欠款余额为
第期还款后的总欠款余额为
第期后还完贷款,此时
由上可得方程组
其中前三期还款后的总欠款余额为
由数学归纳法得
由等比数列求和公式得
所以第期还款后的总欠款余额
并且和
时也成立
则有第期(最后一期)还款后的总欠款余额
由方程组可得方程
解得每期还款额
还款总额为
每期还款额中的利息为
每期还款额中的本金为
注意:月利率、总还款期数
、总贷款额度
为自变量,每期还款额
为因变量,所以不能在计算其它数据时带入每期还款额
小数点的影响
上式中的各个等式在数学上是成立的,但是在实际中存在小数点的问题,所以每个公式都应该用来表示而不是
。
并且最后一期还款额中的本金可能不再是
而是减去前
次还款额中的本金之和,即
15万的等额本息贷款
问:若贷款总额150000元,年利率(单利)为3.6%,不调整利率,按月还款总期数为36,还款方式为等额本息,则每月应还多少元?
解:当,
,
时,有
每期还款额
第一期还款额中的利息为
第二期还款额中的利息为
不过银行通常会耍无赖,第一期的利息是从放款后开始算的。比如4月25日放款给你150000,还款日为每月19日,而第一个月不需要你还款,即5月19日不是你的第一期还款日,6月19日才是你的第一期还款日。那么第一期还款额中的利息是从4月25日开始算到6月19日,此时你的第一期还款额中的利息为
不过同样的,因为是4月25日放款给你的,所以最后一期还款日也应该是三年后的4月25日。即在三年后的4月19日是你的倒数第二期还款日,而六天后的25日就是你的最后一期还款日。
最后一期还款日还款后的本金需要用总贷款额度减去前面所有还款额的本金之和,所以这里需要算出前35次还款额的本金。
计算太多,这里直接用程序计算出
那么最后一期还款额中的利息为
所以每月应还贷款为4401.96元
使用Python实现计算
下面使用python写了一个类,用来计算一个等额本息贷款的每期本金、利息等数据。
# 计算等额本息贷款每期还款额
class EqualLoanPayment:
mLoanLimit = 0 # 总贷款额,一般为100,000~10,000,000
mAnnualInterestRate = 0.0000 # 年利率,一般为3.4%~6.8%,这里要填0.034~0.068
mRepaymentPeriods = 0 # 还款期数,一般1个月为1期,还3~30年,那就是36~360
mMonthlyInterestRate = 0.0000 # 月利率,一般为年利率/12
mRepaymentAmountPI = 0 # 每期还款总额,是一个固定值
mRepaymentPrincipalPI = [] # 每期还款额中的本金,是一个列表
mRepaymentInterestPI = [] # 每期还款额中的利息,是一个列表
mInterestAmount = 0 # 总利息额,一般为1,000~5,000,000
mInterestRate = 0 # 总利息率,一般为0.1~1
# 构造函数
# loanLimit:总贷款额
# annualInterestRate:年利率
# repaymentPeriods:总还款期数
def __init__(self, loanLimit, annualInterestRate, repaymentPeriods):
self.mLoanLimit = loanLimit
self.mAnnualInterestRate = annualInterestRate
self.mRepaymentPeriods = repaymentPeriods
self.mMonthlyInterestRate = round(annualInterestRate / 12, 4)
self.calculate()
# 根据所给值计算每期还款额中的本金和利息
def calculate(self):
# tmp1为(1+x)^N
tmp1 = (1 + self.mMonthlyInterestRate) ** self.mRepaymentPeriods
self.mRepaymentAmountPI = self.mLoanLimit * tmp1 * self.mMonthlyInterestRate / (tmp1 - 1)
# 每期还款额保留2位小数
self.mRepaymentAmountPI = round(self.mRepaymentAmountPI, 2)
for i in range(0, self.mRepaymentPeriods - 1):
# 用公式计算每期还款额中的利息,银行眼里只有利息,所以会先算利息
tmp2 = self.mMonthlyInterestRate * (tmp1 - ((1 + self.mMonthlyInterestRate) ** i))
# 每期还款额中的利息保留2位小数
repaymentInterest = round(self.mLoanLimit * tmp2 / (tmp1 - 1), 2)
self.mInterestAmount = round(self.mInterestAmount + repaymentInterest, 2)
self.mRepaymentInterestPI.append(repaymentInterest)
# 用公式计算每期还款额中的本金
# tmp4 = self.mLoanLimit * self.mMonthlyInterestRate * ((1 + self.mMonthlyInterestRate) ** i) / (tmp1 - 1)
# self.mRepaymentPrincipalPI.append(tmp4)
# 实际上应该用还款额减去其中的利息
repaymentPrincipal = round(self.mRepaymentAmountPI - repaymentInterest, 2)
self.mRepaymentPrincipalPI.append(repaymentPrincipal)
# 对于最后一期还款额中的本金,应该用总还款额减去前几次还款额中的本金之和来计算
lastRepaymentPrincipal = self.mLoanLimit
for repaymentPrincipal in self.mRepaymentPrincipalPI:
lastRepaymentPrincipal = round(lastRepaymentPrincipal - repaymentPrincipal, 2)
self.mRepaymentPrincipalPI.append(lastRepaymentPrincipal)
# 对于最后一期还款额中的利息,应该用最后一期还款额中的本金乘以月利率
lastRepaymentInterest = round(lastRepaymentPrincipal * self.mMonthlyInterestRate, 2)
self.mRepaymentInterestPI.append(lastRepaymentInterest)
self.mInterestAmount = round(self.mInterestAmount + lastRepaymentInterest, 2)
# 计算总利息率
self.mInterestRate = round(self.mInterestAmount / self.mLoanLimit, 5)
# 打印计算的结果
def print(self):
print('期数:' + str(self.mRepaymentPeriods) + ' 年利率:' + '{:.2%}'.format(self.mAnnualInterestRate)
+ ' 月利率:' + '{:.2%}'.format(self.mMonthlyInterestRate) + ' 贷款额总额:' + str(self.mLoanLimit)
+ ' 每期还款额:' + str(self.mRepaymentAmountPI) + ' 利息总额:' + str(self.mInterestAmount)
+ ' 总利息率:' + '{:.2%}'.format(self.mInterestRate))
repaymentPeriods = ''
repaymentPrincipals = ''
repaymentInterests = ''
for i in range(0, self.mRepaymentPeriods):
repaymentPeriods = repaymentPeriods + str(i + 1) + '\t\t\t'
if i < len(self.mRepaymentPrincipalPI):
repaymentPrincipals = repaymentPrincipals + str(self.mRepaymentPrincipalPI[i]) + '\t\t'
else:
repaymentPrincipals = repaymentPrincipals + 'NULL\t\t'
if i < len(self.mRepaymentInterestPI):
repaymentInterests = repaymentInterests + str(self.mRepaymentInterestPI[i]) + '\t\t'
else:
repaymentInterests = repaymentInterests + 'NULL\t\t'
print(repaymentPeriods)
print(repaymentPrincipals)
print(repaymentInterests)
使用此类进行计算。
equalLoanPayment = EqualLoanPayment(150000, 0.036, 36)
equalLoanPayment.print()
结果输出如下。
期数:36 年利率:0.036 月利率:0.003 贷款额总额:150000 每期还款额:4401.96
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
3951.96 3963.82 3975.71 3987.63 3999.6 4011.6 4023.63 4035.7 4047.81 4059.95 4072.13 4084.35 4096.6 4108.89 4121.22 4133.58 4145.98 4158.42 4170.9 4183.41 4195.96 4208.55 4221.17 4233.84 4246.54 4259.28 4272.05 4284.87 4297.73 4310.62 4323.55 4336.52 4349.53 4362.58 4375.67 4388.65
450.0 438.14 426.25 414.33 402.36 390.36 378.33 366.26 354.15 342.01 329.83 317.61 305.36 293.07 280.74 268.38 255.98 243.54 231.06 218.55 206.0 193.41 180.79 168.12 155.42 142.68 129.91 117.09 104.23 91.34 78.41 65.44 52.43 39.38 26.29 13.17
可以看到能够准确计算各项数据。
在具体计算时要注意小数点累计导致的结果偏差。