一文吃透等额本息及其应用

您所在的位置:网站首页 等额本息公式是如何推算出来的 一文吃透等额本息及其应用

一文吃透等额本息及其应用

2023-11-10 18:19| 来源: 网络整理| 查看: 265

目录 一、前言1.1 基础概念1.1.1 贷款本金1.1.2 分期数1.1.3 利率1.1.4 还款日1.1.5 月供1.1.6 在贷本金1.1.7 还款计划1.1.8 Apr1.1.9 Irr 二、等额本息2.1 月供公式推导2.2 生成还款计划2.3 计算精度2.4 尾期调平2.5 反算利率2.5.1 IRR利率计算2.5.2 XIRR2.5.3 APR 2.6 计算工具2.6.1 网络工具2.6.2 Excel实现2.6.3 算法的系统实现 2.7 一般性规则2.7.1 利息金额递减,本金金额递增2.7.2 同样本金和利率,不同分期数下, 首期的还款利息都是一样的2.7.3 相同本金和期数(多期),利率越低,首期还款本金越高 2.8 小金额问题 三、优惠的实现3.1 折扣、免息3.2 部分期数免息3.3 部分金额免息3.4 部分天数免息 四、结语

一、前言

随着社会经验的增加, 我们或多或少的接触过一些金融产品,尤其是余额宝的普及,互联网金融已经是飞入寻常百姓家了。 在我们使用“花呗”、“白条”等金融服务,或者办理房贷时,我们不可避免的,会接触到“等额本息”这一概念,但实际上,真的能算清楚这笔账的人可不多。本文从一个互联网相关从业者的角度来讲讲等额本息是什么,怎么计算,以及在实现中碰到的一些特殊的场景。

1.1 基础概念

在正式开始介绍等额本息之前,我们先了解一下这些概念,避免后续理解不一致。

1.1.1 贷款本金

即借款本金,用于计算等额本息还款计划的基础参数之一,在分期电商/房贷等应用场景中,要注意是使用扣除首付金额和本金优惠金额后的部分。在系统设计中,一般会记一个原始订单金额,另外还会记录一个用于贷款计算的金额。

1.1.2 分期数

即按揭的期数,通常一个自然月为一期,房贷为240期、360期;互联网金融公司一般为3、6、9、12期。实际上,尽管每一期的还款金额应该是一致的,但由于每个月的天数不一样,系统上实际表现可能会有些细微差异。

1.1.3 利率

计息利率,直接用于等额本息计算的为月利率,系统中通常还有日利率、年利率等相关字段设计。其转换关系为: 年利率 = 月利率 * 12 = 日利率 * 360。

“年化利率是指通过产品的固有收益率折现到全年的利率。假设某金融产品收益期为a年,收益率为b,那么年化利率r,r=(1+b)^a-1。年利率:年利息÷本金×100%,例如:存入银行100万,一年利息2万,年利率是,2÷100×100%=2%。年化利率主要是用在存款和贷款上。”

在民间借贷中,我们还会经常听到“月息几厘”这样的说法,这里的“厘”表示千分之一,也就是说,月息6厘表示月利率0.6%,也就是年化利率7.2%。其实在民间借贷当中,年息一般用分来指代,厘则通常指代月息,毫则用来指代日息(一分等于百分之一,一毫等于万分之一)。

需要注意的是,贷款时年利率是不能超过36%的,也就是年息不过超过三十六分。若超过的话,那就属于高利贷了。

1.1.4 还款日

发生借贷行为后,每期需要偿还贷款的日子。一般有两种确定还款日的方式: 1)用户在平台上固定设计的还款日,每月都是同一日。 2)根据当次借款时间确定的还款日,通常为放款成功日期。

由于2月的特殊性, 还款日的设计应该避免使用28 ~ 31这几个日子。而同一个还款日下,根据月份不同,每期的天数也不完全相同。在实际计算中, 一年当做12月,每月当做30天处理。

1.1.5 月供

每期还款的金额,一般由 当期还款的本金+当期应还的利息 组成。

1.1.6 在贷本金

用于计算当期利息的本金部分,每月还款后,在贷本金相应减少,并应该在最后一期还款完成后清零(确保每期本金之和与总本金相等)。

1.1.7 还款计划

每期还款数据的明细情况,即各期的月供、本金、利息各项数据,在具体系统实现中, 可能还有包含其他特定计费项,如优惠金额、信用评估费、担保费等。

1.1.8 Apr

美国诚信信贷法中要求披露的贷款利率,在精算中又叫名义利率,计算方式为: 年化收益率APR=(期初费用+总还款额-合同约定贷款本金)/借款年限/合同约定贷款本金x100%。

1.1.9 Irr

内部收益率(Internal Rate of Return (IRR)),就是资金流入现值总额与资金流出现值总额相等、净现值等于零时的折现率。如果不使用电子计算机,内部收益率要用若干个折现率进行试算,直至找到净现值等于零或接近于零的那个折现率。内部收益率,是一项投资渴望达到的报酬率,是能使投资项目净现值等于零时的折现率。

二、等额本息

等额本息还款法即借款人每月按相等的金额偿还贷款本息,其中每月贷款利息按月初剩余贷款本金计算并逐月结清。由于每月的还款额相等,因此,在贷款初期每月的还款中,剔除按月结清的利息后,所还的贷款本金就较少;而在贷款后期因贷款本金不断减少、每月的还款额中贷款利息也不断减少,每月所还的贷款本金就较多。

从上面的定义中,我们提炼出几个基本规则: 1) 每月偿还本息金额相等 2) 每月利息部分按剩余在贷本金计算 3) 利息部分逐期递减 4) 还款本金部分逐期增加

2.1 月供公式推导

根据上述的定义,假设贷款总额为M,银行月利率为R,总期数为n(个月),月还款额固定为X,则各个月所欠银行贷款为: 第一个月后在贷本金 C1 = M(1 + R) - X

第二个月后在贷本金 C2 = (M(1 + R) - X) (1 + R) - X = M(1 + R)^2 - X[ 1 + (1 + R)]

第三个月后在贷本金 C3 = (M(1 + R)^2 - X[ 1 + (1 + R)]) (1 + R) - X = M(1 + R)^3 - X[ 1 + (1 + R)+ (1 + R)^2]

所以: (这一步需要套用等比数列求和公式) Cn = M(1 + R)^n - X[ 1 + (1 + R)+ (1 + R)^2 +…+(1+R)^(n-1)] = M(1 + R)^n - X[ (1 + R)^n]/R

由于还款总期数为n,也即第n月刚好还完银行所有贷款,即Cn = 0, 所以 0 = M(1 + R)^n - X[ (1 + R)^n - 1]/R 则 X = MR(1 + R)^n / [(1 + R)^n - 1]

综上,我们得到了月供的计算公式 在这里插入图片描述 也就是说,如果已知利率、分期数、借款本金,我们就能完成月供的计算。

2.2 生成还款计划

上面已经把月供的计算公式推导出来了。回顾前文提到的另外两个公式:

月供=当期还款的本金+当期应还的利息当期应还的利息 = 在贷本金 * 月利率

那么,我们就能通过已知的月供和利息,算出当期还款的本金,并且算出,更新后的在贷本金也就知道了,重复执行这个步骤,我们就能得到一份完整的还款计划。

当期还款的本金 = 月供 - 当期应还的利息剩余在贷本金 = 当期计息本金 - 当期还款的本金

举例如下:

已知:本金 1000元,借款3期,月利率2%

月供 = 本金 * 月利率 * (1+月利率)^ 期数 / ((1+月利率)^ 期数 - 1 ) =1000 * 0.02 * 1.02^3 / (1.02^3 - 1) = 21.22416 / 0.061208 = 346.7546725918181第一期应还的利息 = 在贷本金 * 月利率 = 1000 * 0.02 = 20第一期应还本金 = 月供 - 第一期应还的利息 = 346.7546725918181 - 20 = 326.7546725918181第一期还完后的剩余在贷本金 = 第一期的计息本金 - 第一期的还款本金 = 1000 - 326.7546725918181 = 673.2453274081819第二期应还的利息 = 在贷本金 * 月利率 (即对其他期数重复第2 ~ 4步,篇幅原因,后面直接给出结果) = 673.2453274081819 * 0.02 = 13.46490654816364第二期应还本金 = 333.2897660436545第二期还完后的剩余在贷本金 = 339.9555613645274第三期应还的利息 = 6.799111227290548第三期应还本金 =339.9555613645276第三期还完后的剩余在贷本金 = -0.0000000000002

上述的计算数据是用计算机自带的计算器计算的结果,看得出来,是计算器对小数点后的精度有损失。

我们对上面的计算结果做一下整理,就得到了我们所需要的一份还款计划

期数月供还款本金利息剩余在贷本金1346.7546725918181326.754672591818120673.24532740818192346.7546725918181333.289766043654513.46490654816364339.95556136452743346.7546725918181339.95556136452766.799111227290548-0.0000000000002 2.3 计算精度

在上文中,尽管我们精度已经保留了足够多,但不可避免的还是有计算误差在,而实际应用中, 我们往往只关注到“分”,也就是说,这里其实需要我们设计一套比较友好的舍入规则来处理。

我们对常见的一些舍入策略做一下对比,:

舍入规则(针对月供计算来看)特点四舍五入最为常见的舍入策略,大众容易理解向下取整即直接将精度要求后面的位数直接抹去,如 346.7546725918181,保留精度到分为 346.75元向上取整如果要求精度的后面,还有剩余的位数,将后面的位数直接抹去,前一位+1,如 346.7546725918181,保留精度到分为 346.76元银行家舍入规则可以概括为 “四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。”

银行家舍入的介绍可以参考:《编写高质量代码:改善Java程序的151个建议》 建议25: 不要让四舍五入亏了一方。

银行家舍入策略有它自己的合理性。在存款、贷款量大且金额分散的业务里,可以更加公平的计算收益。

从上面的表格中,我们可以直观的看出来的是: 向上取整会比向下取整,每期都要多一分钱。而在互联网浪潮中,这1分钱的能量也不容小觑。所以,在法律合规的基础上(年化利率不超过36%),考虑使用向上取整来计算息费也是一种选择。为了方便计算,本文后续采用向上取整的舍入策略。

两位精度向上取整舍入后的还款计划:

期数月供还款本金利息剩余在贷本金1346.76326.7620673.242346.76333.2913.47339.953346.76339.966.80-0.01

从上面的还款计划我们发现,3期还款本金加起来 1000.01,已经超过了原始借款的金额,这显然是难以接受的,也很难理解。也许有人会问,这是否是由于向上取整带来的问题,因为之前精度较高时,总本金差异虽然有,但是很小的。我们直接对几种舍入策略做一个对比。

两位精度向下取整舍入后的还款计划:

期数月供还款本金利息剩余在贷本金1346.75326.7520673.252346.75333.2913.46339.963346.75339.966.790

两位精度四舍五入后的还款计划:

期数月供还款本金利息剩余在贷本金1346.75326.7520673.252346.75333.2913.46339.963346.75339.956.800.01

两位精度银行家舍入后的还款计划:

期数月供还款本金利息剩余在贷本金1346.75326.7520673.252346.75333.2913.46339.963346.75339.956.800.01

比较上面4种舍入计算的结果,后面3种的月供都少收了1分钱。且四舍五入和银行家舍入都少收了一分钱本金。实际上,舍入策略对还款计划的计算会有一定的影响,但主要还是体现在月供上。换一组数据计算结果可能就不太一样了。所以为了解决保留精度带来的误差,我们需要额外的做一些处理。

2.4 尾期调平

上面提到, 只要中间数据发生舍入,其舍入误差就可能会体现到最后的剩余在贷金额上,也就是还款计划总本金和原始借款本金会有差异。所谓尾期调平,就是对最后一期做特殊处理,使得还款计划总本金和原始借款本金能够对齐。

这个特殊处理,简单来说就是改变最后一期的计算规则,不再以 计算利息 -> 月供 - 利息 = 还款本金 这种先计算利息,再减出本金的方式来计算,而是先确定本金,再减出利息的方式来计算。以此来确保最后一期的本金可以清零。

到了最后一期,我们认为所有的本金都应该还清, 那么本金部分 = 总借款本金 - 前面各期还款本金的总和。再用月供减去最后一期的本金得到利息。

两位精度向上取整舍入 + 尾期调平后的还款计划:

期数月供还款本金利息剩余在贷本金1346.76326.7620673.242346.76333.2913.47339.953346.76339.956.810

经过尾期调平后,月供不变的情况下,借款和还款本金达成一致。

2.5 反算利率

不管是上面说的精度调整,还是尾期调平。我们都对还款计划的数据进行了修改。 那么,经过我们这样修改之后,年化利率真的还是我们开始定义的那个年化利率吗?我们试着来验证一下。

2.5.1 IRR利率计算

IRR的概念不太容易理解,这里就不展开了, 可以从下面两个方面去深入了解,这里简单做个举例介绍。

(1)净现值 与 折现率 NPV(净现值)=∑(CI-CO)(1+i)^-t 其中: 1. t 表示第t个时间段 2. CI 表示第t个时间段的总投入/成本 3. CO表示第t个时间段的总收入 4. i 表示折现率

(2)内部收益率 IRR IRR = 找到NPV为0的那个点的折现率。即找到一个i值,使得上面NPV的值为0。结合公式来看,t、CI、CO都是已知的,且NPV= 0,那就是对应了一个一元高次多项式(IRR的定义式)的根。由阿贝尔—鲁菲尼定理可知,除了一些特殊的多项式,我们无法找到一个通解来计算这个折现率,那么我们就得用一些求根法来找到这个根

阿贝尔—鲁菲尼定理指出,五次及更高次的代数方程没有一般的代数解法,即这样的方程不能由方程的系数经有限次四则运算和开方运算求根。

求根法可以自行回顾一下,我们直接使用上面的还款计划来做个计算,先假设折现率 i = 10% (这是excel迭代法的默认猜想值)

时间段t收益现值计算现值0-1000-1000 / (1 + 0.1) ^ 0-10001346.76346.76 / (1 + 0.1) ^ 1315.2363642346.76346.76 / (1 + 0.1) ^ 2286.5785123346.76346.76 / (1 + 0.1) ^ 3260.52592

净现值 : -1000 + 315.236364 + 286.578512 + 260.52592 = -137.659204 由上可见,当折现率为10%时,净现值为负,要使净现值为0的话,需要调小折现率才可以,接下来,我们尝试将折现率缩小到2%来再做一次验证。

时间段t收益现值计算现值0-1000-1000 / (1 + 0.02) ^ 0-10001346.76346.76 / (1 + 0.02) ^ 1339.9607842346.76346.76 / (1 + 0.02) ^ 2333.2948873346.76346.76 / (1 + 0.02) ^ 3326.759693

净现值 : -1000 + 339.960784 + 333.294887 + 326.759693 = 0.01536373 这时候已经很接近0了,这里我们先借助程序来计算,看NPV逼近0的时候,折现率应该为多少。计算的结果为 0.020007887489101293, 我们验证下:

时间段t收益现值计算现值0-1000-1000 / (1 + 0.020007887489101293) ^ 0-10001346.76346.76 / (1 + 0.020007887489101293) ^ 1339.95815547426843242346.76346.76 / (1 + 0.020007887489101293) ^ 2333.28973201484273543346.76346.76 / (1 + 0.020007887489101293) ^ 3326.7521125108985088

净现值 : -1000 + 1000.0000000000096766 = 0.0000000000096766。确实又更趋近于0了, 但是还不是那个等于0的点。这又回到了我们上面说的精度问题。

我们大概能看出来了,这里说的折现率实际上就是描述的我们说的月利率,这是取决于我们时间段t 是按月维度计算的。换个说法,就是 1000元借3期,346.76的月供对应的IRR下的年化利率为 24.00946498692155%。 我们再借助工具计算下 346.75的月供对应的折现率: 0.01999308196593063,对应IRR年化为 23.99169835911676%

这数据很有代表性了,我们计算月供时,用的年化是24%,但我们计算过程中对月供做了一次精度处理,再来反推IRR年化时,直接影响到最终年化的取值,并且结果是带有偏向性的。

接触过借贷产品的人应该清楚, 国家有借贷利率不超过36%的红线,若我们计算还款计划只是一个取整完事的话,很可能我们反推出来的IRR年化利率会超过36%, 那可就吃不了兜着走了。一种比较保守的做法是统一改成向下取整, 这样即使反算利率,也不会超过既定利率,但如上文所说,这会少收很多的利息。

精明一点的设计,可以利用计算工具,枚举测算各金额、各利率、各期数下的IRR数据,确定一个边界条件, 边界内的表示向上取整可能会导致IRR年利率超36%, 此时修改算法为向下取整。边界外的属于安全数据,直接向上取整确保收入不损失。

2.5.2 XIRR

我们先思考一下, 前文说的计算还款计划也好, 反算IRR年化也好, 我们都是把每个月作为一个固定的时间间隔来看的。但实际上,每个月的天数是不同的,1月31天我们当做一个月,2月28天我们也当做是一个月, 中间差的几天并没有在利率计算中体现出来,这其实就是不公平的。甚至严格算下来,可能IRR反推的年利率没有超过36%,但按实际天数来计算的年利率就超过了36%,这又是很恐怖的一个问题。

而XIRR就是用来解决这个问题的算法,在IRR需要总本金和每期还款金额的基础上,额外还需要每期的还款日期。通常来说,我们可以约定每期的天数是相等的,用IRR来简化计算。但如果是严格的场景,还是要使用XIRR来做利率校验。

其实,IRR定义中的时间间隔t, 并没有限定是要以月为单位。假设我们是按日计息的,我们有每天的还款数据, 那此时我们利用IRR计算出来的年化和XIRR计算出来的年化实际应该是一致的。

XIRR的算法实现就不展开了,感兴趣的可以自行查阅相关资料。我们实际应用中按需选择合适的计算方式即可。

2.5.3 APR

APR的算法跟IRR比起来简直不要太容易。通常我们说的APR利率 = 总利息 x 借款期数 / 12 / 贷款本金 x 100%,如果要精确到天的话,APR利率 = 总利息 x 借款天数 / 365 / 贷款本金 x 100%即可。

需要注意的是,由于APR和IRR的计算方式不同,同样一组数据产生的结果也会不同。并且, 同样年化利率同样金额,在不同期数下, IRR利率值是稳定的, 而APR利率值是会不稳定的。

2.6 计算工具

也许上面的各种逻辑推导会显得比较复杂,如果无心理解其实也没关系。现在有各种现成的计算工具可以帮助我们来计算等额本息相关的数据。

2.6.1 网络工具

我们通常会使用网上已经提供的计算工具来完成数据的核验工作,比如:招行贷款计算器、新浪个人贷款理财计算器 其实他们实现的算法也是有误差的, 仔细对比下其中的数据就会发现问题。不过这仅用来大致比对还款计划,有一点误差其实问题不大,重要的是,我们能够根据上述的理解,实现稳定的计算逻辑。 在这里插入图片描述 在这里插入图片描述

2.6.2 Excel实现

Excel还是强,无论是正着算还是反着算都能支持。 (1)计算等额本息还款表 可以直接看office官方的函数说明,比较详细: 1、计算月供用的 PMT函数-Office支持 2、计算每月还款本金用的 PPMT函数 - Office支持 3、计算每月还款利息用的 IPMT函数 - Office支持

我们来实践一下上述方法,使用excel函数来测试一下,结果如下。可以看出来,最后一期的还款计划明显是有问题的。这其实也符合我们之前的分析。 在这里插入图片描述

(2)根据还款计划计算年化利率

同样, Excel也已经提供了相关计算方法: 1、用于计算净现值的NPV函数 - Office支持 2、用于计算年利率的IRR函数 - Office支持 3、用于计算年利率的XIRR函数 - Office支持

这里不展开了,感兴趣的读者自己尝试一下。 我们来看下IRR的逻辑说明,这对我们实现IRR算法也有一定的借鉴意义。

语法 IRR(values, [guess]) IRR 函数语法具有下列参数: Values 必需。 数组或单元格的引用,这些单元格包含用来计算内部收益率的数字。 1 Values 必须包含至少一个正值和一个负值,以计算返回的内部收益率。 2 IRR 使用值的顺序来说明现金流的顺序。 一定要按您需要的顺序输入支出值和收益值。 3 如果数组或引用包含文本、逻辑值或空白单元格,这些数值将被忽略。 Guess 可选。 对函数 IRR 计算结果的估计值。 1 Microsoft Excel 使用一种迭代技术来计算 IRR。 从 guess 开始,IRR 循环遍历计算,直到结果在0.00001% 范围内精确。 如果 IRR 在尝试20次后找不到结果,则 #NUM! 错误值。 2 多数情况下,不必为 IRR 计算提供 guess 值。 如果省略 guess,则假定它为 0.1 (10%)。 3 如果 IRR 给出 #NUM! 错误值,或者如果结果与预期不符,请使用不同的推测值重试。

2.6.3 算法的系统实现

算法实现等额本息还款表的计算逻辑就不做赘述了,参考上面的分析步骤即可,没有什么特别复杂的点。这里对如何计算IRR做一个简单的分析。算法实现IRR的计算可以参考excel中的方法,提炼下计算规则就是:

猜测一个折现率遍历各期还款额,完成当前折现率下的净现值计算对净现值求导,并计算相对变化率若相对变化率精度小于等于1.0E-7D,则停止查找迭代未到20次时,更新折现率,重复上面步骤如到20次遍历都还不满足结果精度要求,结束,返回异常

算法实现的代码倒是不复杂,但是要理解其中的逻辑还是要有些数学功底。其实就是用了牛顿迭代公式求根,详情见牛顿法

在这里插入图片描述

public static double irr(double[] values, double guess) { int maxIterationCount = true; 结果精度 double absoluteAccuracy = 1.0E-7D; double x0 = guess; for(int i = 0; i ++k; // 完成对所有期数下的净现值计算 if(k >= values.length) { // fValue / fDerivative 表示当前折现率下净现值的相对变化率(y/y') // 牛顿法计算下一个折现率取值 double x1 = x0 - fValue / fDerivative; // 相对变化率非常小:精度到7位精度后停止 if(Math.abs(x1 - x0)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3