债券计提利息计算逻辑说明
一、概述
债券持有期间,系统需在不同业务场景下进行利息计提,包括月末计提、结息计提、到期计提和卖出计提四种类型。各类型的计算逻辑存在差异,本文档对每种类型的计算公式、处理步骤及差异原因进行详细说明。
统一入口
所有计提类型的利息计算均由 AbstractInvestInterestCore.calcInterest() 方法分发:
calcInterest()
├── PROVISION → calcProvisionInterest() // 月末计提
├── SETTLE → calcSettleInterest() // 结息计提
├── MATURITY → calcMaturityInterest() // 到期计提
└── SELL → calcSellInterest() // 卖出计提
通用术语说明
|
|
|
|
|---|---|---|
|
|
bondRate |
|
|
|
bondRealRate |
|
|
|
totalBondAmt |
|
|
|
bondAccInvestment |
|
|
|
provisionInterestAccumulated |
|
|
|
buyAccInterestAmt |
|
|
|
couponInterest |
|
|
|
actAmortized |
|
|
|
interestDays |
|
|
|
periodDays |
|
|
|
basis |
|
二、月末计提(PROVISION)
2.1 触发场景
月末定时任务执行,对仍在持有期的债券进行当月利息计提。
2.2 计算公式
名义利息
实际利息
分母规则
|
|
|
|---|---|
CALC_INTEREST_ACTUAL) |
|
CALC_INTEREST_ACTUAL_360) |
|
CALC_INTEREST_ACTUAL_360_FIXED) |
|
利息调整
利息调整由
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):
-
查询上次结息日到卖出日之间的所有月末计提记录,累加 curInterest -
加上本次卖出计提的 curInterest -
若全部卖出且无历史结息记录,需加上 buyAccInterestAmt(买入时应计利息) -
按卖出面值占比分摊: accountInterest = norminalInterestSum × 卖出面值 / 当前总面值 -
若有历史卖出记录,还需加上历史卖出的 norminalInterestSum按比例分摊的部分
六、横向对比
6.1 名义利息计算方式对比
|
|
|
|
|---|---|---|
|
|
公式法 |
|
|
|
轧差法 |
|
|
|
轧差法 |
|
|
|
混合法 |
|
6.2 实际利息计算方式对比
|
|
|
|
|---|---|---|
|
|
公式法 |
|
|
|
公式法 |
|
|
|
倒推法 |
|
|
|
公式法 |
|
6.3 利息调整计算方式对比
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
一次性清零 |
|
|
|
|
|
6.4 买入时应计利息处理对比
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
|
|
bondAccInvestment |
|
|
norminalInterestSum |
|
|
accountInterest |
|
|
十、注意事项
-
精度控制:所有金额计算统一使用 BigDecimal,精度为DEFAULT_MONEY_SCALE(2位小数),中间计算使用CALCULATE_ACCURACY或FOUR_SCALE_SIZE(4位小数)。 -
倒轧触发条件:仅当计提日次日为结息日时触发倒轧,非结息日前的月末计提不倒轧。 -
首次结息判断:通过比较上一个付息日与买入结算日判断是否为首次结息( CashFlowUtil.isEqBefore)。 -
幂等控制:各类型计提前均会检查当日是否已计提过,防止重复计提。 -
记账白名单:发送核算指令前会校验产品类型和计息频率是否在白名单内,不在白名单的跳过记账。 -
卖出二阶段:卖出计提采用二阶段提交(Try-Confirm-Cancel),Try阶段生成计提流水但未落库,Confirm阶段落库并记账,Cancel阶段删除流水。
夜雨聆风