1. 零息债券定价与收益率计算

零息债券定价与收益率计算 学习卡片

任务说明

零息债券(Zero-Coupon Bond)到期只支付面值,期间无现金流。给定面值 F、期限 T(年)、连续复利收益率 r,价格为 P = F·e^(−rT)。本案例实现价格、到期收益率、连续复利收益率之间的相互转换,并验证价格-收益率关系(收益率上升,价格下降)。

核心公式

  • 定价:P = F · exp(−r·T)
  • 由价格反推连续复利收益率:r = −ln(P/F) / T
  • 离散复利收益率(年复利)与连续复利换算:r_cont = ln(1 + r_annual)

完整代码

import math

def price_zero_coupon(face, T, r_cont):
    """连续复利收益率 -> 零息债券价格"""
    return face * math.exp(-r_cont * T)

def yield_from_price(face, T, price):
    """价格 -> 连续复利收益率"""
    return -math.log(price / face) / T

def cont_to_annual(r_cont):
    """连续复利 -> 年复利"""
    return math.exp(r_cont) - 1.0

def annual_to_cont(r_annual):
    """年复利 -> 连续复利"""
    return math.log(1.0 + r_annual)

if __name__ == "__main__":
    F, T = 100.0, 5.0

    # 1) 定价
    r = 0.04
    P = price_zero_coupon(F, T, r)
    print(f"r_cont={r:.4f}  ->  P={P:.6f}")

    # 2) 反推收益率(应与 r 一致)
    r_back = yield_from_price(F, T, P)
    print(f"P={P:.6f}  ->  r_cont={r_back:.6f}  (误差={abs(r_back-r):.2e})")

    # 3) 连续复利 <-> 年复利
    ra = cont_to_annual(r)
    rc = annual_to_cont(ra)
    print(f"r_cont={r:.4f} -> r_annual={ra:.6f} -> r_cont={rc:.6f}")

    # 4) 验证价格-收益率关系:收益率上升,价格下降
    rs = [0.02, 0.03, 0.04, 0.05, 0.06]
    ps = [price_zero_coupon(F, T, x) for x in rs]
    print("r_cont :", [f"{x:.2f}" for x in rs])
    print("price  :", [f"{p:.4f}" for p in ps])
    assert all(ps[i] > ps[i+1] for i in range(len(ps)-1)), "价格应随收益率单调下降"
    print("单调性验证通过:收益率上升 -> 价格下降")

运行方式

python zero_coupon.py

验证方法与通过条件

  • 第 2 步反推的 r_cont 与输入 r=0.04 误差应接近 0(浮点量级 ~1e-16)。
  • 第 3 步连续复利与年复利往返换算后应回到原值。
  • 第 4 步断言通过:收益率从 0.02 升到 0.06 时价格严格递减。
  • 若断言失败或误差明显偏大,说明公式或参数使用有误。

预期输出(由代码与给定输入唯一确定)

r_cont=0.0400  ->  P=81.873075
P=81.873075  ->  r_cont=0.040000  (误差=0.00e+00)
r_cont=0.0400 -> r_annual=0.040811 -> r_cont=0.040000
r_cont : ['0.02', '0.03', '0.04', '0.05', '0.06']
price  : ['90.4837', '86.0708', '81.8731', '77.8801', '74.0818']
单调性验证通过:收益率上升 -> 价格下降