3. 债券应计利息与全价计算

债券应计利息与全价计算 学习卡片

任务说明

债券在两次付息日之间交易时,买方需向卖方补偿从上一付息日到结算日已产生的利息,即应计利息。市场报价通常为净价,实际交割金额为全价:

  • 应计利息 = 票面利息 × (结算日 − 上一付息日) / (下一付息日 − 上一付息日)
  • 全价 = 净价 + 应计利息

本案例用 Python 的 datetime 实现上述计算,输入为上一付息日、下一付息日、结算日、票面利率、面值与净价。

计算流程

上一付息日 last_coupon 结算日 settlement 下一付息日 next_coupon 应计利息 accrued_interest 全价 dirty_price

完整代码

from datetime import date

def accrued_interest(last_coupon, next_coupon, settlement,
                     coupon_rate, face_value=100.0):
    """计算应计利息(按实际天数/实际天数)。"""
    total_days = (next_coupon - last_coupon).days
    accrued_days = (settlement - last_coupon).days
    if total_days <= 0:
        raise ValueError("下一付息日必须晚于上一付息日")
    if not (0 <= accrued_days <= total_days):
        raise ValueError("结算日必须落在付息区间内")
    period_coupon = face_value * coupon_rate
    return period_coupon * accrued_days / total_days

def dirty_price(last_coupon, next_coupon, settlement,
                coupon_rate, clean_price, face_value=100.0):
    """全价 = 净价 + 应计利息。"""
    ai = accrued_interest(last_coupon, next_coupon, settlement,
                          coupon_rate, face_value)
    return clean_price + ai, ai

if __name__ == "__main__":
    last = date(2024, 1, 15)
    nxt  = date(2024, 7, 15)
    settle = date(2024, 4, 1)
    rate = 0.04          # 年票面利率 4%
    clean = 99.50        # 净价

    dirty, ai = dirty_price(last, nxt, settle, rate, clean)
    print(f"应计利息: {ai:.4f}")
    print(f"净价:     {clean:.4f}")
    print(f"全价:     {dirty:.4f}")

运行与验证

直接运行脚本:python bond_accrued.py。程序会打印应计利息、净价与全价。

判定标准:

  • 应计利息 = 100 × 0.04 × (77 / 182) ≈ 1.6923(2024-01-15 到 2024-04-01 共 77 天,付息区间共 182 天)。
  • 全价 = 99.50 + 1.6923 ≈ 101.1923。
  • 若结算日等于上一付息日,应计利息应为 0;若等于下一付息日,应计利息应等于整期票息 4.0。

可自行修改 settle 验证边界:date(2024,1,15) 得 0,date(2024,7,15) 得 4.0。