Ammar Cephas Plumber

University of Iowa – Bond Analysis

Feb 21, 2025

This is a problem set from the UChicago Harris School’s Public Capital Markets Credential, which was hosted in Beijing, China, and co-sponsored by the Central University of Finance and Economics. Led by Professor Justin Marlowe, the program equips participants with essential analytical skills for public finance officials, including bond valuation, credit analysis, debt structuring and issuance strategies, and financial sustainability assessment.


Overview

In this problem set, we analyze the University of Iowa bond issuance designed to finance the construction and equipping of a new health science academic facility, along with covering bond issuance costs. The analysis includes:

  1. Issuer and Purpose – Identifying who issued the bond and what the proceeds will finance.
  2. Bond Description – Detailing key parameters such as dated date, maturity, principal, coupon, price, and yield at issuance.
  3. Spread Analysis – Comparing the bond’s yield to the ICE AAA Municipal Index and discussing how much of the spread is attributable to credit risk versus liquidity risk.
  4. Duration Analysis – Calculating both the initial and new Macaulay and Modified Durations with detailed Python code snippets, explaining the significance of these metrics in assessing interest rate risk.

Every term is defined and explained in advance, ensuring the full reasoning and calculation process is transparent.


Question 1: Issuer and Purpose

Question:

View the Official Statement (or use EMMA with a VPN) and find CUSIP 914364ZV9. Who issued this bond? What is the purpose of the proceeds?

Answer:

Key Definitions & Significance:

This information is essential for investors and municipal finance officials to understand the source of the debt and its intended use.


Question 2: Bond Description

Question:

What is this bond’s dated date? Maturity date? Principal amount? Coupon? Price at issuance? Yield at issuance?

Answer:

Key Definitions & Significance:

This detailed description outlines the bond’s cash flow profile and allows for an informed assessment of its financial attractiveness.


Question 3: Spread Analysis

Question:

Find the ICE AAA Municipal Index for November 1, 2024 (the date this bond was sold). What is the bond’s spread to the ICE AAA Index? In your estimation, how much of that spread is due to credit risk versus liquidity risk?

Answer:

Using the Bondwave AA QCurve (noting the methodological differences):

Attribution of Spread:

Key Definitions & Significance:

Understanding the breakdown of the spread helps investors and financial managers gauge whether the bond’s pricing properly compensates for its risk profile.


Question 4: Duration Analysis

Question:

Assume an investor bought this bond at issuance at the reoffering price and yield. One year later, market yields have increased to 5.5%. Compute the bond’s modified duration both initially and after one year. Explain every step in the analysis.

Answer:

Step 1: Initial Duration Calculation

The bond has semi-annual coupon payments. Initially, we expect about 17 payments (from November 2024 to June 2033).

Definitions:

Below is the Python code used to calculate the initial durations:

face = 1070000
coupon = 0.05  
initial_yield = 0.032
price = 1.13321 * face
coupon_payment = (coupon * face) / 2

weighted_times = 0
total_pv = 0

for t in range(1, 18):  # Payments 1 through 17
    time = t / 2  # Convert semi-annual periods to years
    payment = coupon_payment
    if t == 17:  # Final payment includes the face value
        payment += face
    
    discount = (1 + initial_yield / 2) ** t
    pv = payment / discount
    
    weighted_times += time * pv
    total_pv += pv

# Calculate durations
macaulay_duration = weighted_times / price
modified_duration = macaulay_duration / (1 + initial_yield / 2)

print(f"Initial Macaulay Duration: {macaulay_duration:.4f} years")
print(f"Initial Modified Duration: {modified_duration:.4f}%")

Results:

Initial Macaulay Duration: 7.1322 years

Initial Modified Duration: 7.0199%

Step 2: Revised Duration Calculation (One Year Later)

One year later, with market yields at 5.5%, there are now 15 semi-annual payments remaining, plus one month of accrued interest to account for.

Accrued Interest Calculation:

For one month accrued:

months_accrued = 1
accrued_payment = coupon_payment * (months_accrued / 6)

New Price Calculation with 15 Remaining Payments:

new_yield = 0.055
total_pv = 0

# Accrued interest for 1 month
months_accrued = 1
accrued_payment = coupon_payment * (months_accrued / 6)
total_pv += accrued_payment

for t in range(1, 16):  # 15 remaining semi-annual payments
    payment = coupon_payment
    if t == 15:  # Final payment includes the face value
        payment += face
    
    discount = (1 + new_yield / 2) ** t
    pv = payment / discount
    total_pv += pv

new_price = total_pv
price_to_par = new_price / face * 100

print(f"New price: ${new_price:,.2f}")
print(f"Price as % of par: {price_to_par:.3f}%")

Recalculate Durations with the New Price:

weighted_times = 0

# Account for accrued interest (1 month)
time_accrued = 1 / 12  # 1 month expressed in years
weighted_times += time_accrued * accrued_payment

for t in range(1, 16):
    time = t / 2
    payment = coupon_payment
    if t == 15:
        payment += face
    
    discount = (1 + new_yield / 2) ** t
    pv = payment / discount
    weighted_times += time * pv

macaulay_duration_new = weighted_times / new_price
modified_duration_new = macaulay_duration_new / (1 + new_yield / 2)

print(f"New Macaulay Duration: {macaulay_duration_new:.4f} years")
print(f"New Modified Duration: {modified_duration_new:.4f}%")

Results:

Key Definitions & Significance:


← Back to all articles