乐于分享
好东西不私藏

债券计提利息计算逻辑说明

债券计提利息计算逻辑说明


一、概述

债券持有期间,系统需在不同业务场景下进行利息计提,包括月末计提结息计提到期计提卖出计提四种类型。各类型的计算逻辑存在差异,本文档对每种类型的计算公式、处理步骤及差异原因进行详细说明。

统一入口

所有计提类型的利息计算均由 AbstractInvestInterestCore.calcInterest() 方法分发:

calcInterest()
  ├── PROVISION  → calcProvisionInterest()   // 月末计提
  ├── SETTLE     → calcSettleInterest()      // 结息计提
  ├── MATURITY   → calcMaturityInterest()    // 到期计提
  └── SELL       → calcSellInterest()        // 卖出计提

通用术语说明

术语
字段名
含义
票面利率
bondRate
债券票面标注的年利率
实际利率
bondRealRate
摊余成本法下计算的实际年利率
券面总额
totalBondAmt
持有债券的总面值(分)
摊余成本余额
bondAccInvestment
当前摊余成本账面余额
已计提名义利息总额
provisionInterestAccumulated
从上次结息日到当前累计已计提的名义利息
买入时应计利息
buyAccInterestAmt
买入时债券已产生的应计利息总额
每期付息金额
couponInterest
一个完整付息周期的票面利息金额
利息调整
actAmortized
实际利息与名义利息的差额,用于摊销折溢价
计提天数
interestDays
本期计提的实际天数
周期天数
periodDays
当前付息周期的总天数
付息频率基数
basis
付息频率对应的一年计息次数(如年付=1,半年付=2)

二、月末计提(PROVISION)

2.1 触发场景

月末定时任务执行,对仍在持有期的债券进行当月利息计提。

2.2 计算公式

名义利息

实际利息

分母规则

计息基准
分母
实际/实际(CALC_INTEREST_ACTUAL
周期天数 × 付息频率基数
实际/365固定(CALC_INTEREST_ACTUAL_360
365
实际/360固定(CALC_INTEREST_ACTUAL_360_FIXED
360

利息调整

利息调整由 initProvisionRecord 中统一计算,月末计提采用自然摊销方式。

税费(需纳税时)

不含税实际利息

2.3 倒轧处理

计提日次日为结息日时,需进行倒轧调整,确保累计计提金额与付息金额一致:

倒轧原因:公式法逐月计提会产生四舍五入尾差,在结息日前最后一次计提时,通过倒轧补齐差额,保证名义利息累计值与付息金额精确匹配。

三、结息计提(SETTLE)

3.1 触发场景

付息日当天,由结息定时任务触发。当到期日 ≠ 结息日时,按结息类型处理。

3.2 计算公式

名义利息(轧差法)

首次结息需扣减买入时应计利息的原因每期付息金额是从上一个付息日到当前付息日的完整期间利息,但买入时应计利息部分不属于持有期间收益,应予扣除。

实际利息

注意:结息计提的实际利息分母固定为 周期天数 × 付息频率基数,不受计息基准枚举影响,与月末计提的分母规则不同。

利息调整

税费(需纳税时)

不含税实际利息

注意:结息计提的不含税实际利息 = 实际利息 – 税费,加回利息调整。


四、到期计提(MATURITY)

4.1 触发场景

到期日当天,由结息定时任务触发。当到期日 = 结息日时,按到期类型处理。

4.2 计算公式

名义利息(轧差法)

到期计提不扣减买入时应计利息。因为到期是最终清算,利息调整会一次性清零,整体保证摊余成本归零即可。

利息调整(一次性清零)

这是到期计提的核心特殊处理:不是按”实际利息 – 名义利息”自然摊销,而是将剩余利息调整余额一次性全部摊销,使期末摊余成本等于券面总额。

实际利息

税费(需纳税时)

不含税实际利息

代码中到期计提先设置 curRealInterestPretax = curRealInterest,再在需纳税时重新计算为 名义利息 + 利息调整 - 税费,两者等价。

五、卖出计提(SELL)

5.1 触发场景

债券卖出交易确认时,由卖出策略(BondSellStrategy)触发一阶段计提(operationProvisionTry),二阶段确认(operationProvisionConfirm)时落库并记账。

5.2 计算公式

名义利息(轧差 + 剩余计算法)

卖出计提的名义利息分为卖出部分剩余部分分别计算,再求和:

卖出部分名义利息(轧差法):

  • curAmt:卖出回单上的应计利息总额(来自外部交易系统)
  • 轧差逻辑:用回单真实利息减去卖出部分已计提的利息,确保卖出部分利息与实际收到金额一致

剩余部分名义利息(公式法):

  • 剩余部分继续持有,按公式法正常计算当期应计提利息

实际利息

注意:实际利息计算使用的是全部摊余成本余额,而非按卖出比例分摊。利息调整(= 实际利息 – 名义利息)会自然反映卖出部分的摊销影响。

分母规则

与月末计提相同,根据计息基准枚举确定。

利息调整

税费(需纳税时)

不含税实际利息

5.3 倒轧处理

与月末计提相同,当卖出日次日为结息日时进行倒轧:

5.4 卖出名义利息累计(供结息使用)

卖出时还需计算两个辅助字段,供后续结息时使用:

  • norminalInterestSum:从上次结息日到卖出日的累计名义利息总额
  • accountInterest:卖出部分应分摊的名义利息金额

计算逻辑sellNormimalInterestCalculate):

  1. 查询上次结息日到卖出日之间的所有月末计提记录,累加 curInterest
  2. 加上本次卖出计提的 curInterest
  3. 若全部卖出且无历史结息记录,需加上 buyAccInterestAmt(买入时应计利息)
  4. 按卖出面值占比分摊:accountInterest = norminalInterestSum × 卖出面值 / 当前总面值
  5. 若有历史卖出记录,还需加上历史卖出的 norminalInterestSum 按比例分摊的部分

六、横向对比

6.1 名义利息计算方式对比

计提类型
计算方式
核心逻辑
月末计提
公式法
票面利率 × 券面总额 × 天数比例
结息计提
轧差法
每期付息金额 – 已计提累计(首次扣买入应计利息)
到期计提
轧差法
每期付息金额 – 已计提累计(不扣买入应计利息)
卖出计提
混合法
卖出部分轧差 + 剩余部分公式

6.2 实际利息计算方式对比

计提类型
计算方式
核心逻辑
月末计提
公式法
实际利率 × 摊余成本 × 天数比例
结息计提
公式法
实际利率 × 摊余成本 × 天数比例(分母固定为周期天数×基数)
到期计提
倒推法
名义利息 + 利息调整(利息调整一次性清零)
卖出计提
公式法
实际利率 × 摊余成本 × 天数比例

6.3 利息调整计算方式对比

计提类型
计算方式
核心逻辑
月末计提
自然摊销
实际利息 – 名义利息
结息计提
自然摊销
实际利息 – 名义利息
到期计提
一次性清零
券面总额 – 摊余成本余额
卖出计提
自然摊销
实际利息 – 名义利息

6.4 买入时应计利息处理对比

计提类型
是否扣减 buyAccInterestAmt
处理时机
月末计提
倒轧时扣(首次结息)
仅当次日为结息日时
结息计提
首次结息扣
计算名义利息时直接扣减
到期计提
不扣
卖出计提
倒轧时扣(首次结息)
仅当次日为结息日时

6.5 不含税实际利息对比

计提类型
公式
备注
月末计提
实际利息 – 税费
等价于 名义利息 + 利息调整 – 税费
结息计提
实际利息 – 税费
未加回利息调整
到期计提
名义利息 + 利息调整 – 税费
等价于 实际利息 – 税费
卖出计提
实际利息 – 税费
未加回利息调整

七、差异原因分析

7.1 为什么月末计提用公式法,而结息/到期用轧差法?

月末计提是日常周期性操作,用公式法逐日精确计算即可。每日/每月计提不需要与外部凭证对账,公式法计算结果在合理精度范围内即可。

结息/到期是终结性事件,必须保证名义利息累计值与外部付息金额精确一致。公式法由于每月四舍五入,长期累积会产生尾差,轧差法(外部金额 – 已计提累计)能确保零误差。

7.2 为什么结息计提首次要扣 buyAccInterestAmt,到期不扣?

  • 结息计提每期付息金额是从上一个付息日到当前付息日的完整期间利息,包含了买入前产生的利息部分。买入时应计利息(buyAccInterestAmt)不属于持有期间收益,必须扣除。
  • 到期计提:到期是最终清算,利息调整会一次性全部清零,整体保证摊余成本归零即可。不扣 buyAccInterestAmt 是因为到期时利息调整的清零处理已经包含了折溢价的全部摊销,不需要再单独扣减。

7.3 为什么到期计提的利息调整是一次性清零?

到期时债券不再存续,必须将所有利息调整余额一次性摊销完毕,使摊余成本等于券面总额,实现完美退出。如果继续按”实际利息 – 名义利息”自然摊销,可能因四舍五入导致期末摊余成本与券面总额存在微小差异。

7.4 为什么卖出计提采用混合法?

卖出涉及部分持仓退出

  • 卖出部分:必须与外部回单金额一致,所以用轧差法(回单利息 – 已计提 × 卖出比例)
  • 剩余部分:仍在持有中,继续用公式法正常计提

这种”回单真实金额 + 公式计算”的混合方法,既保证了卖出部分利息与实际收到金额一致,又确保剩余持仓的计提不受影响。

7.5 为什么卖出计提的实际利息用全部摊余成本,不按比例分摊?

卖出计提的实际利息使用全部摊余成本计算,利息调整(= 实际利息 – 名义利息)自然反映卖出部分的影响。由于名义利息中卖出部分已用回单真实金额轧差,利息调整会自动调整到合理值,无需额外对实际利息按比例分摊。


八、流程总览图

┌──────────────────────────────────────────────────────────────────┐
│                     债券利息计提流程总览                          │
├──────────────────────────────────────────────────────────────────┤
│                                                                  │
│  月末定时任务 ──→ interestProvisionTask() ──→ PROVISION          │
│       │                                               │          │
│       │                                          公式法计算      │
│       │                                        名义利息+实际利息  │
│       │                                              │          │
│       │                                    次日=结息日? → 倒轧    │
│       │                                              │          │
│       ▼                                              ▼          │
│  结息定时任务 ──→ settleInterestTask()                            │
│       │                                               │          │
│       ├─ 到期日=结息日? ──→ MATURITY ──→ 轧差法+一次性清零       │
│       │                                               │          │
│       └─ 到期日≠结息日 ──→ SETTLE ──→ 轧差法(首次扣买入利息)     │
│                                                     │          │
│  卖出交易 ──→ BondSellStrategy ──→ SELL ──→ 混合法               │
│                                     卖出部分轧差+剩余部分公式      │
│                                         │                        │
│                               次日=结息日? → 倒轧                │
│                                                                  │
└──────────────────────────────────────────────────────────────────┘

九、关键数据流

9.1 余额表更新规则

字段
更新公式
说明
摊余成本余额
期初值 + 利息调整
利息调整可正可负
利息调整余额
期初值 + 利息调整
累计利息调整余额
已计提名义利息总额
期初值 + 本次名义利息
结息后清零
已计提实际利息总额
期初值 + 本次不含税实际利息
结息后清零

9.2 结息后余额表清零

到期结息策略(BondMaturityInterestStrategy)在 generateInnerInstructions 中将以下字段清零:

  • provisionInterestAccumulated → 0
  • provisionRealInterestAccumulated → 0

9.3 计提流水关键字段

字段
含义
各类型赋值
curInterest
本次名义利息
各类型核心计算结果
curRealInterest
本次实际利息
各类型核心计算结果
actAmortized
本次利息调整
实际利息 – 名义利息(到期为:券面总额 – 摊余成本)
curRealInterestPretax
不含税实际利息
实际利息 – 税费
taxAmt
税费
名义利息/(1+税率) × 税率
bondAccInvestment
期末摊余成本
期初摊余成本 + 利息调整
norminalInterestSum
累计名义利息(结息用)
仅卖出计提赋值
accountInterest
卖出分摊利息(结息用)
仅卖出计提赋值

十、注意事项

  1. 精度控制:所有金额计算统一使用 BigDecimal,精度为 DEFAULT_MONEY_SCALE(2位小数),中间计算使用 CALCULATE_ACCURACY 或 FOUR_SCALE_SIZE(4位小数)。
  2. 倒轧触发条件:仅当计提日次日为结息日时触发倒轧,非结息日前的月末计提不倒轧。
  3. 首次结息判断:通过比较上一个付息日与买入结算日判断是否为首次结息(CashFlowUtil.isEqBefore)。
  4. 幂等控制:各类型计提前均会检查当日是否已计提过,防止重复计提。
  5. 记账白名单:发送核算指令前会校验产品类型和计息频率是否在白名单内,不在白名单的跳过记账。
  6. 卖出二阶段:卖出计提采用二阶段提交(Try-Confirm-Cancel),Try阶段生成计提流水但未落库,Confirm阶段落库并记账,Cancel阶段删除流水。