Valuation of Interest Rate Derivatives › Pricing with Interest Rate Models

Michael BrenndoerferDecember 8, 20254 min read
Quantitative FinanceAll chapters
Part 7 of 15Interest Rate Models and Derivatives
Chapter 40Valuation of Interest Rate Derivatives › Pricing with Interest Rate Models
Reading section 5 of 13 · Pricing with Interest Rate Models · 4 minSection 5 of 13 · 4 min

Book contents

Section 5 of 13 · 4 min read

Valuation of Interest Rate Derivatives › Pricing with Interest Rate ModelsOne section · Sections in this chapter5 / 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

Black's model provides a convenient closed-form solution but assumes constant volatility and a specific distributional form. More sophisticated pricing uses the interest rate models from Chapters 14 and 15. These models capture richer dynamics, including mean reversion, time-varying volatility, and correlations between different points on the yield curve.

Short-Rate Models

The Hull-White model from Chapter 14 allows pricing via lattice methods. The main advantage of this approach is consistency: a single model, calibrated to match market prices of liquid instruments, can then price a wide range of derivatives. This consistency becomes central when hedging complex positions, where we need all instruments to be valued in a coherent framework.

We build a trinomial tree for the short rate, then use backward induction to value the derivative. This approach handles path-dependent features like Bermudan exercise and provides consistent pricing across instruments. The tree structure naturally accommodates the mean reversion that characterizes interest rate dynamics, pulling rates back toward a long-run level even as random shocks push them away.

For a caplet in a Hull-White tree, the valuation proceeds in three stages. First, we build the short-rate tree out to the caplet's payment date, constructing all possible rate scenarios at each time step. Second, at the payment date nodes, we calculate the caplet payoff based on the realized rate at each scenario. Third, we work backward through the tree, discounting expected values at each node, until we arrive at today's value.

In[14]:
Code
def hull_white_caplet_tree(
    kappa,
    theta,
    sigma,
    time_to_fixing,
    time_to_payment,
    strike,
    notional,
    day_count_fraction,
    n_steps=50,
):
    """
    Price a caplet using a Hull-White trinomial tree.

    This is a simplified implementation that demonstrates the concept.
    """
    dt = time_to_payment / n_steps

    # Tree parameters
    dr = sigma * np.sqrt(3 * dt)

    # Build the tree forward
    n_fixing = int(time_to_fixing / dt)
    n_payment = n_steps

    # For simplicity, we use a recombining tree with 3 branches
    # In practice, more sophisticated tree construction is needed

    # Initialize tree at payment date
    # Maximum number of nodes at step n is 2n+1
    max_nodes = 2 * n_steps + 1

    # Rates at each level (centered at theta)
    rate_levels = theta + dr * np.arange(-(max_nodes // 2), max_nodes // 2 + 1)

    # Initialize payoffs at payment date
    payoffs = np.zeros(max_nodes)
    for j in range(max_nodes):
        # Payoff depends on rate at fixing time, but for simplicity
        # we use rate at payment time as proxy
        rate = rate_levels[j]
        payoffs[j] = notional * day_count_fraction * max(rate - strike, 0)

    # Backward induction
    # Probabilities for trinomial tree
    p_up = 1 / 6
    p_mid = 2 / 3
    p_down = 1 / 6

    values = payoffs.copy()

    for step in range(n_payment - 1, -1, -1):
        new_values = np.zeros(max_nodes)
        for j in range(1, max_nodes - 1):
            rate_j = rate_levels[j]
            # Mean reversion adjustment
            drift = kappa * (theta - rate_j) * dt

            # Discount factor for this step
            df_step = np.exp(-rate_j * dt)

            # Expected value under risk-neutral measure
            expected_value = (
                p_up * values[j + 1]
                + p_mid * values[j]
                + p_down * values[j - 1]
            )
            new_values[j] = df_step * expected_value

        values = new_values

    # Return value at root node
    return values[max_nodes // 2]

LIBOR Market Model

The LIBOR Market Model (LMM) from Chapter 15 directly models the forward rates that appear in cap and floor payoffs. This makes it particularly natural for pricing caps, as the forward rate dynamics are specified directly rather than derived from short-rate dynamics. Rather than modeling an abstract short rate and then computing forward rates, the LMM starts with the observable quantities that appear in derivative payoffs.

In the LMM, each forward rate Fi(t)F_i(t) evolves under its natural forward measure:

dFi(t)=σi(t)Fi(t)dWi(t)dF_i(t) = \sigma_i(t) F_i(t) dW_i(t)

where:

  • Fi(t)F_i(t): forward rate for period ii at time tt
  • σi(t)\sigma_i(t): instantaneous volatility of the forward rate
  • dWi(t)dW_i(t): Brownian motion increment under the forward measure

This equation describes how forward rates evolve randomly over time. The key feature is that under the forward measure, the drift term vanishes, leaving only the volatility-driven random component. This property, a consequence of careful measure selection, greatly simplifies pricing.

For caplet pricing, this reduces exactly to Black's model when volatility is constant. The LMM's power emerges when pricing instruments that depend on multiple forward rates, where the model captures correlations between different tenor rates. A spread option, which pays based on the difference between two rates, requires modeling how those rates move together. The LMM provides a framework for specifying and calibrating these correlations consistently.