等额本息还款计划的计算方式

每月还款计算方式

        等额本息的特点是每期还款额固定,由本金与利息组成,设为A

        设贷款总额为a_{0},还款总期数为N,月利率为x,年利率为X=12x,则有

        从第一期还款日之后每期欠款余额为a_{1}\sim ~a_{N}

        第k期还款前产生的利息为a_{k-1}x,总欠款余额为a_{k-1}(1+x)

        第k期还款后的总欠款余额为a_{k}=a_{k-1}(1+x)-A

        第N期后还完贷款,此时a_{N}=a_{N-1}(1+x)-A=0

        由上可得方程组

\left\{\begin{matrix} a_{1}=a_{0}(1+x)-A\\ a_{2}=a_{1}(1+x)-A\\ ...\\ a_{N}=a_{N-1}(1+x)-A \end{matrix}\right.

        其中前三期还款后的总欠款余额为

                a_{1}=a_{0}(1+x)-A

                a_{2}=a_{1}(1+x)-A=a_{1}(1+x)^{2}-A(1+x)-A

                a_{3}=a_{2}(1+x)-A=a_{2}(1+x)^{3}-A(1+x)^{2}-A(1+x)-A

        由数学归纳法得

                 a_{n}=a_{n-1}(1+x)-A=a_{0}(1+x)^{n}-A(1+x)^{n-1}-A(1+x)^{n-2}-...-A

        由等比数列求和公式得

                A(1+x)^{n-1}+A(1+x)^{n-2}+...+A=A\frac{1-(1+x)^{n}}{1-(1+x)}=A\frac{(1+x)^{n}-1}{x}

        所以第n期还款后的总欠款余额

a_{n}=a_{0}(1+x)^{n}-A\frac{(1+x)^{n}-1}{x}=(a_{0}-\frac{A}{x})(1+x)^{n}+\frac{A}{x}\, \, \, \, (1\leqslant n\leqslant N)

        并且a=0a=1时也成立

        则有第N期(最后一期)还款后的总欠款余额

                a_{N}=(a_{0}-\frac{A}{x})(1+x)^{N}+\frac{A}{x}=0

        由方程组可得方程

(a_{0}-\frac{A}{x})(1+x)^{N}+\frac{A}{x}=0

a_{0}(1+x)^{N}-\frac{A}{x}(1+x)^{N}+\frac{A}{x}=0

a_{0}(1+x)^{N}=\frac{A}{x}[(1+x)^{N}-1]

A=a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}

        解得每期还款额

                A=a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}

        还款总额为

                A_{0}=NA=a_{0}N\frac{(1+x)^{N}x}{(1+x)^{N}-1}

        每期还款额中的利息为

                b_{n}=a_{n-1}x=[(a_{0}-\frac{A}{x})(1+x)^{n-1}+\frac{A}{x}]x=(a_{0}x-A)(1+x)^{n-1}+A

                        =a_{0}x(1+x)^{n-1}-A(1+x)^{n-1}+A=a_{0}x(1+x)^{n-1}+A\left [1-(1+x)^{n-1}\right ]

                        =a_{0}\frac{(1+x)^{N}(1+x)^{n-1}x-(1+x)^{n-1}x}{(1+x)^{N}-1}+a_{0}\frac{(1+x)^{N}x-(1+x)^{N}(1+x)^{n-1}x}{(1+x)^{N}-1}

                        =a_{0}\frac{x\left [(1+x)^{N}-(1+x)^{n-1}\right ]}{(1+x)^{N}-1} \left ( 1\leqslant n\leqslant N \right )

        每期还款额中的本金为

                c_{n}=A-a_{n-1}x=A-\left [ (a_{0}x-A)(1+x)^{n-1}+A \right ]

                        =(A-a_{0}x)(1+x)^{n-1}=\left [ a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}-a_{0}x \right ](1+x)^{n-1}

                        = a_{0}\frac{x}{(1+x)^{N}-1}(1+x)^{n-1}=a_{0}\frac{x(1+x)^{n-1}}{(1+x)^{N}-1}\: \: \: \: \left ( 1\leqslant n\leqslant N \right )

        注意:月利率x、总还款期数N、总贷款额度a_{0}为自变量,每期还款额A为因变量,所以不能在计算其它数据时带入每期还款额A

小数点的影响

        上式中的各个等式在数学上是成立的,但是在实际中存在小数点的问题,所以每个公式都应该用\approx来表示而不是=

        并且最后一期还款额中的本金可能不再是

        ​​​​​​​        c_{N}=a_{0}\frac{x(1+x)^{N-1}}{(1+x)^{N}-1}

        而是a_{0}减去前N-1次还款额中的本金之和,即

                c_{N}=a_{0}-\left ( c_{1}+c_{2}+...+c_{N-1} \right )

15万的等额本息贷款

问:若贷款总额150000元,年利率(单利)为3.6%,不调整利率,按月还款总期数为36,还款方式为等额本息,则每月应还多少元?

解:当x=0.003a_{0}=150000N=36时,有

        每期还款额

                A=a_{0}\frac{(1+x)^{N}x}{(1+x)^{N}-1}=150000\times \frac{1.113867644352453150389\times 0.003}{1.113867644352453150389-1}

                        =150000\times \frac{0.003341602933057359451}{0.113867644352453150389}=150000\times0.0293463779993

                        =4401.9566998955\approx 4401.96

        第一期还款额中的利息为

                b_{1}=a_{0}x=150000\times 0.003=450

        第二期还款额中的利息为

                b_{2}=a_{1}x=\left ( a_{0}+a_{0}x-A \right )x=a_{0}x\left ( 1+x \right )-Ax

                        =450\times1.003-4401.9566998955\times0.003=438.14412990031

        ​​​​​​​        ​​​​​​​        \approx 438.14

        不过银行通常会耍无赖,第一期的利息是从放款后开始算的。比如4月25日放款给你150000,还款日为每月19日,而第一个月不需要你还款,即5月19日不是你的第一期还款日,6月19日才是你的第一期还款日。那么第一期还款额中的利息是从4月25日开始算到6月19日,此时你的第一期还款额中的利息为

               \overline{b_{1}}=a_{0} \times \frac{55}{30} x=150000\times \frac{55}{30} \times0.003=825        

        不过同样的,因为是4月25日放款给你的,所以最后一期还款日也应该是三年后的4月25日。即在三年后的4月19日是你的倒数第二期还款日,而六天后的25日就是你的最后一期还款日。

        最后一期还款日还款后的本金需要用总贷款额度减去前面所有还款额的本金之和,所以这里需要算出前35次还款额的本金。

        计算太多,这里直接用程序计算出

                c_{N}=a_{0}-\left ( c_{1}+c_{2}+...+c_{N-1} \right )\approx 4388.65 

        那么最后一期还款额中的利息为

                \overline{b_{N}}=c_{N} \times \frac{6}{30} x=4388.65\times \frac{6}{30} \times0.003=2.63319\approx 2.63       

        所以每月应还贷款为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

        可以看到能够准确计算各项数据。

        在具体计算时要注意小数点累计导致的结果偏差。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值