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

一、前言

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

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 生成还款计划

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

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

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

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

举例如下:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

期数月供还款本金利息剩余在贷本金
1346.75326.7520673.25
2346.75333.2913.46339.96
3346.75339.966.790

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

期数月供还款本金利息剩余在贷本金
1346.75326.7520673.25
2346.75333.2913.46339.96
3346.75339.956.800.01

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

期数月供还款本金利息剩余在贷本金
1346.75326.7520673.25
2346.75333.2913.46339.96
3346.75339.956.800.01

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

2.4 尾期调平

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

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

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

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

期数月供还款本金利息剩余在贷本金
1346.76326.7620673.24
2346.76333.2913.47339.95
3346.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-1000
1346.76346.76 / (1 + 0.1) ^ 1315.236364
2346.76346.76 / (1 + 0.1) ^ 2286.578512
3346.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-1000
1346.76346.76 / (1 + 0.02) ^ 1339.960784
2346.76346.76 / (1 + 0.02) ^ 2333.294887
3346.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-1000
1346.76346.76 / (1 + 0.020007887489101293) ^ 1339.9581554742684324
2346.76346.76 / (1 + 0.020007887489101293) ^ 2333.2897320148427354
3346.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. 猜测一个折现率
  2. 遍历各期还款额,完成当前折现率下的净现值计算
  3. 对净现值求导,并计算相对变化率
  4. 若相对变化率精度小于等于1.0E-7D,则停止查找
  5. 迭代未到20次时,更新折现率,重复上面步骤
  6. 如到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 < 20; ++i) {
            double factor = 1.0D + x0;
            int k = 0;
            // 记录净现值
            double fValue = values[k];
            double fDerivative = 0.0D;
            // 1+折现率,用于计算现值,作为分母
            double denominator = factor;

            while(true) {
                ++k;
                // 完成对所有期数下的净现值计算
                if(k >= values.length) {
                	// fValue / fDerivative 表示当前折现率下净现值的相对变化率(y/y')
                	// 牛顿法计算下一个折现率取值
                    double x1 = x0 - fValue / fDerivative;
                    // 相对变化率非常小:精度到7位精度后停止
                    if(Math.abs(x1 - x0) <= 1.0E-7D) {
                        return x1;
                    }
					// 未达到精度要求,更新折现率,进行下一次迭代计算
                    x0 = x1;
                    break;
                }
				// 当期收益
                double value = values[k];
                // 计算当期现值,累加更新到净现值
                fValue += value / denominator;
                // 更新分母,便于后续现值计算
                denominator *= factor;
                // 对NPV求导,这里可能要仔细理解下
                fDerivative -= (double)k * value / denominator;
            }
        }

        return 0.0D / 0.0;
    }

这是Apache POI包中的irr算法实现。看懂原理之后, 我们可以进行一些简单的优化:

  1. 算法是double实现的,计算中会有精度损失,可酌情考虑转换用BigDecimal来计算
  2. 比如系统的利率众数是24%,我们就可以指定猜想值是2%,这样,我们可以更快的找到我们预期的利率值
  3. 如果我们对结果精度要求没那么高,我们可以把精度比较范围调宽,也能减少一些计算。

减少了计算,就是减少了cpu资源,在计算密集型的应用中, 这些优化可以提升系统吞吐量。

2.7 一般性规则

等额本息的主要逻辑介绍的差不多了,下面再补充一些其他的特性。

2.7.1 利息金额递减,本金金额递增

这一点比较容易理解, 之前计算还款计划中提到, 我们每期的利息都是用在贷本金 * 月利率 计算来的, 随着每期还部分本金, 后面期数用的在贷本金越来越少,而利率是不变的,所以,每期还款的利息金额是递减的。同理,我们也容易推断出,每期的本金还款是递增的,因为我们月供是不变的。

2.7.2 同样本金和利率,不同分期数下, 首期的还款利息都是一样的

跟上面一点的逻辑类似,不管是分几期,在计算首期还款利息时,在贷本金都是原始本金,所以在相同利率下,计算出来的利息金额都是一致的。

2.7.3 相同本金和期数(多期),利率越低,首期还款本金越高

在我们做实际业务中,有个比较复杂的逻辑是本金对齐+利率优惠,这个不作展开。只是说这个问题是在业务实现过程中有碰到的, 我们从随机抽的几个利率的计算结果来看,是有这个趋势的,但是要证明这就是一个规律,也并不容易。

因为这次我们动态调整的是利率。 利率降低的话,月供、利息、本金都在变化。要看变化,我们首选的证明方式可能还是求导,导数的几何意义就是斜率。但是我们还有一个更直观的方法, 就是直接画出函数的图像,看随着利率的变化,各个数据的变化情况。

还是以前文描述的1000元本金,3期 来看, 月利率在0% - 100%间的各项金额曲线:结果也非常直观,首期的本金是随着利率的增加,单调递减的。(这里是特例说明,并非严谨证明。)

值得注意的一点是, 当分期数为1时,无论利率是多少, 首期的还款本金都应该是贷款本金,这个是不会变的。
在这里插入图片描述

在绘制函数图像时,还有一点非常有意思,就是随着利率的增加, 首期的利息会越来越趋近于月供,本金部分趋近于0。而算出来的还款计划也是非常有意思,这大概就是数学的魅力吧。

在这里插入图片描述
在这里插入图片描述

2.8 小金额问题

也许我们都有过类似的体验, 在使用花呗或者白条时,往往都需要我们达到一个起借金额,才允许我们使用。这后面的逻辑是什么呢?我们前面说了很多关于精度的问题,对于小金额的计算,精度的影响是更大的。假设说我们的商品金额就是几毛钱,但是分期数却支持到36期。怎样才能算出一份合理的还款计划?

我们看看银行的计算器,似乎也不能解决我们的问题,而且结果非常的奇怪。
在这里插入图片描述
这个问题我也没有特别好的思路,毕竟现有的货币制度下,最小单位就是分,精度是绕不过的问题。假设后续国家电子货币推广有效的话,每次交易,都能计算到100位精度以后, 小于分的那部分一直进行累加。累加到可用分计量后再做结算,没准算是一个相对公平的解决方式。

三、优惠的实现

最后我们简单来看下如何对等额本息做优惠,这是我们运营的常见手段。

3.1 折扣、免息

折扣和免息,都是针对利率来说的,就是直接对利率先进行一次打折:优惠后利率 = 原始利率 * 折扣比例。获取到优惠后利率后,再按正常的等额本息计算即得到优惠后的还款计划。此时,每期的优惠金额我们采取做差的方式来计算:每期的优惠金额 = 原始利率下的月供 - 优惠后利率下的月供

特别的,免息是折扣的一个特例,折扣比例为0,优惠后利率为0%,此类优惠不会导致各期月供不一致。

3.2 部分期数免息

经过我们上面的了解,我们知道还款计划中,每期的本息分布是不一样的,越到后面期数,利息是越少的。那么,我们会考虑一些更个性化的优惠策略,来辅助运营。

部分期数免息,就如字面理解,只对前面的部分期数或者后面的部分期数进行免息优惠,是针对利息金额来做优惠的, 此时,我们的计算逻辑是:

  1. 先按原始利率计算出优惠前的还款计划(月供、本金、利息)
  2. 对指定的期数,将利息部分抹去成0

所以,这种优惠方式下,还款计划不再是每期金额固定了, 优惠的期数只收取了那期的本金部分。优惠金额的计算就是将对应需要优惠的期数的原始利息金额相加。

3.3 部分金额免息

虽然叫做部分金额免息, 但其实还是对利率做的免息,举个例子来说明,借款10000元,其中2000元是享受免息的。

在计算时,我们会分成两部分来算:

  1. 2000的那部分,我们直接用0%的利率计算
  2. 剩下的8000元,我们就使用原有的利率计算等额本息还款计划
  3. 将上面2部分的还款计划合并(按科目相加)。

由上面3.1我们知道, 2000的部分和8000的部分都是月供稳定的(每期的月供金额是一致的),所以这种优惠方式下, 每期的月供也是一个固定值,优惠金额就是 2000那部分用原始利率计算出来的利息金额。

3.4 部分天数免息

部分天数免息,就是减免部分天数下的利息金额,通常只应用在第一期。在计算等额本息时,我们通常都是用月利率来计算还款计划,所以我们有几种思路来计算天数的优惠,以免息15天为例(使用上文的1000元本金分3期,年化24%还款计划):

(1)按天数缩放利息金额
这一点会比较好理解一些, 我们计算还款计划时是按一期30天来计算的,那么15天免息的话, 我们直接用 : 优惠后的利息 = 优惠前的利息 / 原始计息天数 * (原始计息天数 - 免息天数) 来计算。

所以按这种计算方式,优惠后的利息 = 20 / 30 * 15 = 10元。换个思路来说,就是将利息金额摊到每一天,然后按最后的计息天数计算应收的利息金额。

(2)按日利率计算优惠金额
与第一种计算方式类似,差别是将利率摊到每一天,也就是计算日利率。在一个还款周期内,是没有本金偿还的,所以期内每天用于计算的本金都是固定的。

  1. 计算日利率 : 2%的月利率对应0.06667%的日利率
  2. 计算每日产生的利息:1000 * 0.06667% = 0.6667元
  3. 计算优惠天数对应的利息: 0.6667元 * 15 = 10.0005
  4. 计算实际应收利息 20 - 10.0005 = 9.9995元

方案二在描述计算过程,将计算分开了,中间步骤保留精度导致产生了误差。 这里想说明一个问题就是,在我们做复合运算时,尽量不要增加中间环节,因为无论中间环节怎么保留精度,都有可能对结果产生影响。

四、结语

以上就是笔者对等额本息的一些理解,由于笔者不是专业的金融从事人员,文中可能有描述不到位或者不严谨的地方,如果您发现了,请留言,我后续做修正,感谢!希望本文能给读者带来一点帮助。若需转载,请注明出处,谢谢。

  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
操作系统是计算机系统中的核心组成部分,负责管理和协调计算机硬件和软件资源,提供程序运行环境。在CSDN上有很多关于操作系统的专题章,以下将从操作系统的基本概念、功能和常见类型等方面简要介绍一下。 首先是操作系统的基本概念。操作系统是一种系统软件,它是计算机硬件和应用软件之间的桥梁,提供给应用程序一系列的服务和资源,同时负责调度和管理系统资源。它为用户屏蔽了底层的硬件差异,提供了一个统一的、易于使用的界面。 操作系统主要有四个基本功能。首先是处理器管理,负责将处理器分配给系统中的各个进程,并进行进程切换,实现多道程序并发执行。其次是内存管理,管理计算机的内存资源,包括分配、回收和保护等操作。再次是件管理,负责管理件的存储、命名和保护等操作,提供了件操作的接口。最后是设备管理,负责管理计算机的各种设备,包括输入输出设备和存储设备等。 常见的操作系统有多种类型。最主流的是Windows、Linux和Mac OS等桌面操作系统。此外还有服务器操作系统,如Windows Server和Linux等,用于管理和部署服务器。还有嵌入式操作系统,如Android和iOS等,用于移动设备和物联网设备。操作系统也有实时操作系统,用于需要实时控制和响应的系统,如工控系统和航空航天系统等。 总之,操作系统是计算机系统中不可或缺的重要组成部分,通过CSDN上的相关章,我们可以更深入了解操作系统的基本概念、功能和不同类型。这些知识对于理解计算机系统的工作原理和提升编程能力都有着重要意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值