3. 债券应计利息与全价计算
任务说明
债券在两次付息日之间交易时,买方需向卖方补偿从上一付息日到结算日已产生的利息,即应计利息。市场报价通常为净价,实际交割金额为全价:
- 应计利息 = 票面利息 × (结算日 − 上一付息日) / (下一付息日 − 上一付息日)
- 全价 = 净价 + 应计利息
本案例用 Python 的 datetime 实现上述计算,输入为上一付息日、下一付息日、结算日、票面利率、面值与净价。
计算流程
完整代码
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。