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),其余验证逻辑不变。