前言

在公司里面总是负责花呗中的机构商业贴息计算,因此来记录一下经常使用的积数计息法

尾差

尾差是指在处理数据精度时,因四舍五入等操作而产生的误差。尾差的存在会影响最终的计算结果,尤其是在金融计算中,尾差可能会导致利息计算不准确,从而影响客户的利益。

举一个简单的例子,假如我们有一笔 1000 元的贷款,需要分成 3 期进行还款,生成各个期次的数据如下

期次 还款金额
1 333
2 333
3 333
合计 999

可以看到,三期还款金额相加后为 999 元,而不是 1000 元。其中差的 1 元就是尾差。1 元的尾差导致这笔贷款回收回来的本金少了 1 元。当贷款数量多时这个尾差就会变得很大。一种做法是将尾差加到最后一期的还款金额中,即最后一期的金额等于总金额减去前面分出的金额,这样就能确保总还款金额与贷款金额一致。其结果如下

期次 还款金额
1 333
2 333
3 334
合计 1000

尾差在计算中是不可避免的,因此在进行金融计算时,必须考虑尾差的影响,并采取相应的措施来减小尾差对结果的影响。一种方法是提高计算的精度,还有种方法是尽量使用加减法计算,避免乘除法计算来避免乘除法带来的尾差。

积数计息法

积数计息法是一种常用的利息计算方法,主要用于计算计息金额变化比较频繁的情况,以及金额或者利息较小的情况。积数计息的公式如下所示

  • strk_int_rate:执行利率也是年化利率
  • dt_int_rate:日利率
  • prev_acm:前一天的积数 (previous accumulated amount)
  • acm:当前积数 (accumulated amount)
  • bal:当前余额 (balance)
  • days:天数 (days)
  • prev_acm_int_amt:前一天的积数利息 (previous accumulated interest amount)
  • acm_int_amt:当前积数利息 (accumulated interest amount)
  • int_amt:利息 (interest amount)
  • prev_int_amt:前一天的利息 (previous interest amount)
  • dt_int_amt:当日利息 (daily interest amount)
1
2
3
4
5
dt_int_rate = strk_int_rate / 360
acm = prev_acm + bal * days
acm_int_amt = acm * dt_int_rate
int_amt = FLOOR(acm_int_amt)
dt_int_amt = acm_int_amt - prev_int_amt

下面我将一一讲解各个公式。

日利率计算

dt_int_rate = strk_int_rate / 360

日利率等于年化利率除以 360。这里的 360 是银行业常用的计息天数,实际中也有使用 365 的情况。使用 360 天作为基数可以简化计算,并且在商业贷款中更为常见。日利率通常用高精度的小数表示,或者字符串进行表示。

当前积数计算

acm = prev_acm + bal * days

当前积数等于前一天的积数加上当前余额乘以天数。这里的天数是指从上一个计算日到当前计算日之间的天数。余额是指在这段时间内的待计息的余额,因为通常是每日计算利息,因此这个公式可以写为 acm = prev_acm + bal。积数通常用整型或者字符串进行保存。

当前积数利息计算

acm_int_amt = acm * dt_int_rate

当前积数利息等于当前积数乘以日利率。这个公式计算的是从贷款开始到当前计算日为止的累计利息。积数利息通常用高精度的小数表示,或者字符串进行表示。

当前利息计算

int_amt = FLOOR(acm_int_amt)

当前利息等于当前积数利息向下取整。这里使用向下取整是因为通常利息都是一个精确到分的整数,确保利息金额是一个整数。利息通常用整型进行保存。

当日利息计算

dt_int_amt = acm_int_amt - prev_int_amt

当日利息等于当前积数利息减去前一天利息,相当于做一个轧差得到当日实际应该计提的利息。日利息通常用高精度的小数表示,或者字符串进行表示。

积数计息用例

计息天数 bal prev_acm acm strk_int_rate dt_int_rate prev_cst_int_amt cst_int_amt prev_acm_int_amt acm_int_amt prev_int_amt int_amt dt_int_amt
1 500 0 500 0.45 0.00125 0 0 0 0.625 0 0 0
2 500 500 1000 0.45 0.00125 0 0 0.625 1.25 0 1 1
3 500 1000 1500 0.45 0.00125 0 0 1.25 1.875 1 1 0
4 1000 1500 2500 0.45 0.00125 0 0 1.875 3.125 1 3 2
5 1000 2500 3500 0.45 0.00125 0 0 3.125 4.375 3 4 1
6 1000 3500 4500 0.45 0.00125 0 0 4.375 5.625 4 5 1
7 1000 4500 5500 0.45 0.00125 0 0 5.625 6.875 5 6 1
8 1000 5500 6500 0.45 0.00125 0 0 6.875 8.125 6 8 2
9 1000 6500 0 0 0 0 8.125 8.125 8.125 8 8 0
10 1000 0 1000 0 0 8.125 8.125 8.125 8.125 8 8 0
11 100000 1000 100000 0.1 0.000277778 8.125 8.125 8.125 35.90277778 8 35 27

可以看到,当最开始余额和利率都较小时,直接按照日利率算没法直接算出利息,而是积累了一定的天数才算出第一笔 dt_int_amt 有值,可以有效的避免余额过小或者利率过小导致的贷款在整个计息周期内利息为 0 的情况

分段计息

当发生利率变化时,需要进行分段计息。否则会导致之前积累的积数乘以错误的利率。就以上面的例子进行举例,假如修改计息利率为 0,且没有进行分段计息,那么当日计息对应的利息等于 0,轧差得到的日利息会是负数,因此需要对计息进行分段。因此包含分段的公式如下。

  • prev_strk_int_rate:前一日执行利率 (previous strike interest rate)
  • prev_cst_int_amt:前一日固化利息 (previous cumulative static interest amount)
  • cst_int_amt:固化利息利息 (cumulative static interest amount)
1
2
3
4
5
6
7
8
9
10
11
dt_int_rate = strk_int_rate / 360
if prev_strk_int_rate != strk_int_rate then
cst_int_amt = prev_acm_int_amt + prev_cst_int_amt
acm = bal * days
else
cst_int_amt = prev_cst_int_amt
acm = prev_acm + bal * days
end if
acm_int_amt = acm * dt_int_rate + cst_int_amt
int_amt = FLOOR(acm_int_amt)
dt_int_amt = acm_int_amt - prev_int_amt

可以看到当利率发生变化时,需要将当日的积数清 0,然后把之前计算的积数对应的利息加入到固化利息中。这样就能确保之前积累的利息不会因为利率变化而丢失,也不会受到后面分段的利率影响。

分段计息用例

在下面这个例子可以看到在第 9 天和第 11 天发生了分段计息。

计息天数 bal prev_acm acm strk_int_rate dt_int_rate prev_cst_int_amt cst_int_amt prev_acm_int_amt acm_int_amt prev_int_amt int_amt dt_int_amt
1 500 0 500 0.45 0.00125 0 0 0 0.625 0 0 0
2 500 500 1000 0.45 0.00125 0 0 0.625 1.25 0 1 1
3 500 1000 1500 0.45 0.00125 0 0 1.25 1.875 1 1 0
4 1000 1500 2500 0.45 0.00125 0 0 1.875 3.125 1 3 2
5 1000 2500 3500 0.45 0.00125 0 0 3.125 4.375 3 4 1
6 1000 3500 4500 0.45 0.00125 0 0 4.375 5.625 4 5 1
7 1000 4500 5500 0.45 0.00125 0 0 5.625 6.875 5 6 1
8 1000 5500 6500 0.45 0.00125 0 0 6.875 8.125 6 8 2
9 1000 6500 0 0 0 0 8.125 8.125 8.125 8 8 0
10 1000 0 1000 0 0 8.125 8.125 8.125 8.125 8 8 0
11 100000 1000 100000 0.1 0.000277778 8.125 8.125 8.125 35.90277778 8 35 27

后记

积数计息法适合用于计息金额变化频繁的情况,以及金额或者利息较小的情况。这种情况下无法直接使用余额乘以天数和利率进行计算。积数计息法通过累积每日的余额和天数来计算利息,能够更准确地反映实际的利息情况。

参考文献