Valuation of Interest Rate Derivatives › Worked Example: Hedging Floating-Rate Exposure

Michael BrenndoerferDecember 8, 20255 min read
Quantitative FinanceAll chapters
Part 7 of 15Interest Rate Models and Derivatives
Chapter 40Valuation of Interest Rate Derivatives › Worked Example: Hedging Floating-Rate Exposure
Reading section 7 of 13 · Worked Example: Hedging Floating-Rate Exposure · 5 minSection 7 of 13 · 5 min

Book contents

Section 7 of 13 · 5 min read

Valuation of Interest Rate Derivatives › Worked Example: Hedging Floating-Rate ExposureOne section · Sections in this chapter7 / 13 ↓
Reading tools Definitions & inline links

Choose your expertise level to adjust how many terms are explained. Beginners see more tooltips, experts see fewer to maintain reading flow. Hover over underlined terms for instant definitions.

Article links

Make inline references clickable

Consider managing $100 million of floating-rate debt linked to 3-month rates, resetting quarterly for the next 3 years. Current rates are 5%, and you want protection if rates exceed 6%.

Step 1: Define the Hedging Instrument

We need a 3-year quarterly cap with a 6% strike. This provides 12 caplets, one for each quarterly reset.

In[20]:
Code
# Corporate hedge parameters
notional_corporate = 100_000_000  # $100 million
strike_cap = 0.06  # 6% cap strike
cap_tenor = 3  # 3 years
current_rate = 0.05  # 5% current rate
cap_vol = 0.22  # 22% implied volatility

# Quarterly resets
payment_dates_corp = np.arange(0.25, cap_tenor + 0.25, 0.25)
n_caplets = len(payment_dates_corp)
times_to_expiry_corp = payment_dates_corp - 0.25

# Assume a gently upward-sloping rate curve
forward_rates_corp = current_rate + 0.001 * np.arange(n_caplets)

# Discount factors (using current rate for simplicity)
discount_factors_corp = np.exp(-current_rate * payment_dates_corp)
day_count_fractions_corp = np.full(n_caplets, 0.25)

# Price each caplet
caplet_details = []
for i in range(n_caplets):
    if times_to_expiry_corp[i] <= 0:
        price = 0
    else:
        price = black_caplet_price(
            forward_rates_corp[i],
            strike_cap,
            cap_vol,
            times_to_expiry_corp[i],
            discount_factors_corp[i],
            day_count_fractions_corp[i],
            notional_corporate,
        )
    caplet_details.append(
        {
            "period": i + 1,
            "fixing_time": times_to_expiry_corp[i],
            "forward_rate": forward_rates_corp[i],
            "price": price,
        }
    )

total_cap_cost = sum(c["price"] for c in caplet_details)
Out[21]:
Console
Corporate Interest Rate Hedge Analysis
============================================================
Notional:     $100,000,000
Cap Strike:   6.00%
Current Rate: 5.00%
Cap Tenor:    3 years (12 quarters)

Caplet Breakdown (first 6 and last 2):
------------------------------------------------------------
Period   Fixing     Forward    Price ($)      
------------------------------------------------------------
1        0.00       5.00%      0.00           
2        0.25       5.10%      4,571.68       
3        0.50       5.20%      20,221.17      
4        0.75       5.30%      39,525.68      
5        1.00       5.40%      59,925.40      
6        1.25       5.50%      80,588.41      
...
11       2.50       6.00%      180,506.71     
12       2.75       6.10%      199,378.80     
------------------------------------------------------------
Total Cap Cost:              $1,110,210.41
Cost as % of Notional:       1.1102%

Step 2: Analyze Cost-Benefit

The cap costs approximately 0.16% of notional upfront. To evaluate whether this is worthwhile, consider the breakeven analysis:

In[22]:
Code
# Breakeven analysis: at what average rate above strike does cap pay for itself?
# Assume rates jump immediately to a constant level above strike


def cap_payoff_at_rate(
    constant_rate, strike, notional, n_periods, df_array, dcf_array
):
    """Calculate total cap payoff if rates stay constant above strike."""
    if constant_rate <= strike:
        return 0
    payoffs = [
        (constant_rate - strike) * notional * dcf * df
        for dcf, df in zip(dcf_array, df_array)
    ]
    return sum(payoffs)


# Find breakeven rate
from scipy.optimize import brentq


def net_value(rate):
    payoff = cap_payoff_at_rate(
        rate,
        strike_cap,
        notional_corporate,
        n_caplets,
        discount_factors_corp,
        day_count_fractions_corp,
    )
    return payoff - total_cap_cost


# Breakeven is where net value = 0
breakeven_rate = brentq(net_value, strike_cap, 0.15)
Out[23]:
Console
Breakeven Analysis:
If rates rise to and stay at 6.40%, the cap pays for itself.
This is 1bp above current rates.

Scenario Analysis (constant rate assumption):
--------------------------------------------------
Rate       Cap Payoff      Net Value      
--------------------------------------------------
5.00%      $0              $-1,110,210    
6.00%      $0              $-1,110,210    
7.00%      $2,768,465      $1,658,255     
8.00%      $5,536,930      $4,426,720     
9.00%      $8,305,396      $7,195,185

The analysis shows that if rates rise to 8% or higher, the cap provides substantial protection, more than covering its initial cost.

Out[24]:
Visualization
Line chart of cap net value in millions of dollars versus interest rate percentage, with separate shading above zero for the profit zone and below zero for the loss zone, and vertical lines marking the current rate, strike, and breakeven.
Corporate interest rate hedge scenario analysis showing net value (cap payoff minus premium paid) under different constant rate assumptions. The cap provides increasing protection as rates rise above the 6% strike, with the breakeven point occurring when the net value reaches zero.