1. 零息债券定价

零息债券定价:从贴现因子到价格 学习卡片

任务说明

零息债券(Zero-Coupon Bond)在存续期内不支付利息,只在到期日一次性支付面值。其理论价格等于面值按到期收益率贴现的结果:

P = F / (1 + y)n

其中 F 为面值,y 为年化到期收益率(小数),n 为剩余年数。本案例实现该定价函数,并验证两条关系:收益率越高价格越低;价格始终低于面值(y>0 时)。

核心代码

def zero_coupon_price(face_value: float, ytm: float, years: float) -> float:
    """零息债券理论价格。
    face_value: 面值
    ytm: 年化到期收益率(小数, 如 0.05 表示 5%)
    years: 剩余年数
    """
    if face_value <= 0:
        raise ValueError("面值必须为正")
    if years <= 0:
        raise ValueError("期限必须为正")
    if ytm <= -1:
        raise ValueError("收益率必须大于 -100%")
    return face_value / (1 + ytm) ** years

if __name__ == "__main__":
    F = 100.0

    # 1) 基准定价
    p = zero_coupon_price(F, 0.05, 3)
    print(f"面值{F}, ytm=5%, 3年 -> 价格 = {p:.4f}")

    # 2) 验证:收益率上升,价格下降
    prices = [(y, zero_coupon_price(F, y, 3)) for y in (0.01, 0.03, 0.05, 0.08, 0.10)]
    for y, price in prices:
        print(f"ytm={y:.0%} -> {price:.4f}")
    assert all(prices[i][1] > prices[i + 1][1] for i in range(len(prices) - 1)), \
        "收益率上升时价格应下降"

    # 3) 验证:y>0 时价格低于面值
    assert zero_coupon_price(F, 0.05, 3) < F

    # 4) 验证:y=0 时价格等于面值
    assert abs(zero_coupon_price(F, 0.0, 3) - F) < 1e-9

    print("全部验证通过")

运行方式

python zero_coupon.py

验证与判定

  • 脚本无异常退出,且打印 全部验证通过。
  • 收益率序列 1%→10% 对应的价格严格递减。
  • y=5%、3 年时价格低于面值 100;y=0 时价格等于 100。

预期输出(由代码逻辑唯一确定)

面值100.0, ytm=5%, 3年 -> 价格 = 86.3838
ytm=1% -> 97.0588
ytm=3% -> 91.5142
ytm=5% -> 86.3838
ytm=8% -> 79.3832
ytm=10% -> 75.1315
全部验证通过

关键点

贴现因子 1/(1+y)^n 是零息债券定价的核心;期限越长、收益率越高,贴现因子越小,价格越低。若需支持连续复利,可将分母改为 exp(y*n),其余验证逻辑不变。