Bond Calculator
Calculate bond price, yield to maturity, and coupon payments.
Frequently Asked Questions
Code Implementation
def bond_price(face_value, coupon_rate, yield_rate, periods, frequency=1):
"""Calculate bond price given yield to maturity."""
coupon = face_value * coupon_rate / frequency
r = yield_rate / frequency
n = periods * frequency
# Present value of coupons (annuity)
pv_coupons = coupon * (1 - (1 + r) ** -n) / r if r != 0 else coupon * n
# Present value of face value
pv_face = face_value / (1 + r) ** n
return pv_coupons + pv_face
def bond_ytm(face_value, coupon_rate, price, periods, frequency=1, tol=1e-8):
"""Estimate yield to maturity using bisection method."""
lo, hi = 0.0001, 5.0
for _ in range(100):
mid = (lo + hi) / 2
p = bond_price(face_value, coupon_rate, mid, periods, frequency)
if abs(p - price) < tol:
break
if p > price:
lo = mid
else:
hi = mid
return mid
def macaulay_duration(face_value, coupon_rate, yield_rate, periods, frequency=1):
"""Calculate Macaulay duration."""
coupon = face_value * coupon_rate / frequency
r = yield_rate / frequency
n = int(periods * frequency)
price = bond_price(face_value, coupon_rate, yield_rate, periods, frequency)
weighted_cf = sum(
t * (coupon / (1 + r) ** t) for t in range(1, n)
) + n * ((coupon + face_value) / (1 + r) ** n)
return weighted_cf / price / frequency
# Example
face = 1000
coupon_rate = 0.06 # 6% annual coupon
yield_rate = 0.05 # 5% YTM
periods = 10 # years
price = bond_price(face, coupon_rate, yield_rate, periods)
duration = macaulay_duration(face, coupon_rate, yield_rate, periods)
ytm_back = bond_ytm(face, coupon_rate, price, periods)
print(f"Bond Price: ${price:.2f}")
print(f"Macaulay Duration: {duration:.4f} years")
print(f"YTM (verification): {ytm_back*100:.4f}%")
Comments & Feedback
Comments are powered by Giscus. Sign in with GitHub to leave a comment.