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']
单调性验证通过:收益率上升 -> 价格下降