🛠️ToolsShed

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.