Advanced Interest Rate Models (HJM and LMM) › The Heath-Jarrow-Morton Framework
Quantitative FinanceAll chapters Advanced Interest Rate Models (HJM and LMM) › The Heath-Jarrow-Morton FrameworkOne section · Sections in this chapter2 / 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
The HJM framework differs from short-rate modeling. Instead of specifying dynamics for a single rate and deriving forward rates, HJM directly models the evolution of the entire forward rate curve. Modeling the observed rate continuum directly is better than deriving it from a simple process. This section develops the framework step by step, building from the definition of instantaneous forward rates through to the central no-arbitrage condition that constrains all valid HJM models.
Instantaneous Forward Rates
Recall from our discussion of the term structure of interest rates in Part II that the instantaneous forward rate represents the rate at time for instantaneous borrowing at future time . This concept captures the market's expectation, adjusted for risk, of what very short-term borrowing costs will be at some future date. The instantaneous forward rate relates to zero-coupon bond prices through a fundamental relationship that connects the entire forward curve to tradeable securities:
where:
- : price at time of a zero-coupon bond maturing at
- : instantaneous forward rate at time for maturity
- : short rate, representing the instantaneous forward rate for immediate borrowing
This exponential relationship reveals a deep connection: the bond price is determined by accumulating the forward rates along the path from the current time to maturity. Intuitively, you can think of buying a zero-coupon bond as locking in a series of instantaneous forward borrowing rates from today until maturity. The integral in the exponent sums up all these infinitesimal forward rates, and the exponential converts this accumulated rate into a discount factor.
The key insight of HJM is that specifying the dynamics of for all maturities simultaneously determines the entire yield curve evolution. This means we can model the term structure as a single infinite-dimensional object evolving through time. However, not all specifications are arbitrage-free. If we were free to choose any dynamics for forward rates, we could inadvertently create money machines by trading in bonds of different maturities. The key insight of HJM is the precise restriction on forward rate dynamics that ensures no arbitrage, thereby identifying exactly which models are economically meaningful.
Forward Rate Dynamics Under HJM
Under the HJM framework, the instantaneous forward rate evolves according to a stochastic differential equation that allows both deterministic trends and random fluctuations:
where:
- : drift of the forward rate for maturity
- : volatility function (can be a vector for multiple factors)
- : Brownian motion under the real-world probability measure
The functions and can depend on the current time , the maturity , and potentially on the entire current forward rate curve . This flexibility is both a strength and a challenge. On one hand, it allows us to capture rich dynamics including level shifts, slope changes, and curvature movements in the yield curve. On the other hand, unrestricted choices of drift and volatility can lead to arbitrage opportunities or economically implausible behavior. The HJM framework addresses this by providing a precise mathematical condition that separates valid models from invalid ones.
The HJM Drift Condition
Under the risk-neutral measure , the drift is not free to choose. It is completely determined by the volatility function through the HJM drift condition:
where:
- : forward rate drift under the risk-neutral measure
- : volatility function of the forward rate
This result states that once you specify how forward rates fluctuate randomly (through the volatility function), the average direction they move (the drift) is automatically determined. There is no freedom to choose both independently. Defining the cumulative volatility , this condition can be written compactly as:
where:
- : forward rate drift under risk-neutral measure
- : forward rate volatility function
- : cumulative volatility
The cumulative volatility has a natural interpretation: it measures the total volatility accumulated from the current forward rate maturity out to the bond maturity. This quantity appears naturally because it represents the volatility of the zero-coupon bond price itself. The drift condition says that forward rates must drift upward by an amount equal to their own volatility times the bond price volatility.
The HJM drift condition states that in an arbitrage-free economy, the drift of forward rates under the risk-neutral measure is uniquely determined by the volatility structure. This means you only need to specify the volatility function to fully characterize the model.
Derivation of the HJM Drift Condition
To understand why this condition must hold, let's derive it step by step. The derivation illuminates the deep connection between forward rate dynamics and bond price behavior, and shows why the no-arbitrage requirement imposes such specific constraints. The zero-coupon bond price satisfies:
where:
- : price of a zero-coupon bond maturing at
- : instantaneous forward rate
Applying Itô's lemma requires determining the dynamics of the log-price, since the bond price is an exponential function of an integral. Let . Using the Leibniz integral rule for stochastic processes, which tells us how to differentiate an integral when both the integrand and limits change, the differential is:
where:
- : log-price of the zero-coupon bond
- : instantaneous short rate
- : drift of the forward rate
- : cumulative volatility
- : Brownian motion
The first term arises because as time advances, the lower limit of integration moves, and the forward rate at that point "drops out" of the integral. The second term captures how the forward rates within the integral are themselves changing. Notice that the stochastic term simplifies beautifully: integrating the volatility function from to gives exactly the cumulative volatility .
Since , Itô's lemma gives . The additional term is the Itô correction that accounts for the fact that exponentiating a stochastic process is not the same as exponentiating its drift. Substituting and noting that (since only the Brownian motion term contributes to the quadratic variation), the bond price dynamics are:
where:
- : instantaneous short rate
- : forward rate drift
- : volatility of the zero-coupon bond
- : Brownian motion
This equation tells us exactly how the bond price evolves. The drift consists of three parts: the short rate , a negative contribution from the integrated forward rate drifts, and a positive convexity adjustment . The volatility of the bond price is simply the cumulative forward rate volatility.
Under the risk-neutral measure , all traded assets must have a drift equal to the risk-free rate . This is the fundamental requirement of risk-neutral pricing: when we discount at the short rate, all asset prices become martingales. Therefore, the term in the parentheses must equal :
where:
- : instantaneous short rate
- : forward rate drift
- : cumulative volatility
Simplifying this equation by canceling from both sides:
where:
- : forward rate drift
- : cumulative volatility
This equation says that the integrated drift must equal half the squared cumulative volatility. To extract the drift at a specific maturity, we differentiate both sides with respect to . Differentiating both sides with respect to yields the HJM drift condition. Using the chain rule for the term :
where:
- : forward rate drift
- : cumulative volatility
- : forward rate volatility function
On the left side, the Fundamental Theorem of Calculus tells us that differentiating the integral gives us the integrand evaluated at the upper limit. On the right side, we apply the chain rule: the derivative of with respect to is , and we multiply by the derivative of with respect to , which is by the Fundamental Theorem again.
This restriction ensures that the discounted bond price is a martingale under , which is equivalent to the absence of arbitrage. This result applies universally: any arbitrage-free model of forward rates must satisfy this condition, regardless of the specific volatility structure chosen.
Short-Rate Models as HJM Special Cases
The HJM framework encompasses all short-rate models as special cases. By choosing specific volatility functions, we recover familiar models that we studied in the previous chapter. This unification provides important insight: the different short-rate models are not fundamentally different approaches to interest rate modeling but rather different choices of volatility structure within the HJM framework.
Ho-Lee Model: Setting (constant) gives a volatility that does not depend on either time or maturity. This is the simplest possible choice. The drift becomes:
where:
- : forward rate drift
- : constant volatility parameter
- : time to maturity
The forward rate dynamics become:
where:
- : instantaneous forward rate
- : Brownian motion increment under the risk-neutral measure
Notice that the drift increases linearly with maturity. This reflects the convexity adjustment: longer-maturity forward rates must drift upward faster to compensate for the risk in holding longer-dated bonds. The constant volatility means that all forward rates fluctuate by the same amount, leading to parallel shifts in the yield curve.
Hull-White Model: Setting the volatility function to:
where:
- : volatility function of the forward rate
- : short rate volatility parameter
- : mean reversion parameter
- : time to maturity
This specification recovers the Hull-White model. The mean reversion parameter controls how volatility decreases with maturity. Economically, this captures the intuition that short-term rates are more volatile than long-term rates because the latter represent averages of many future short rates. As maturity increases, the individual rate fluctuations average out, reducing overall volatility.
import numpy as np
from scipy.integrate import quad
def hjm_drift(t, T, sigma_func):
"""
Calculate HJM drift for a given volatility function.
Parameters:
-----------
t : float
Current time
T : float
Forward rate maturity
sigma_func : callable
Volatility function sigma(t, s) for s in [t, T]
"""
sigma_t_T = sigma_func(t, T)
integral, _ = quad(lambda s: sigma_func(t, s), t, T)
return sigma_t_T * integral
# Define volatility functions for different models
def ho_lee_vol(t, T, sigma=0.01):
"""Ho-Lee: constant volatility"""
return sigma
def hull_white_vol(t, T, sigma=0.01, kappa=0.1):
"""Hull-White: exponentially decaying volatility"""
return sigma * np.exp(-kappa * (T - t))
# Calculate drifts for different maturities
t = 0
maturities = np.linspace(0.01, 10, 100)
ho_lee_drifts = [hjm_drift(t, T, ho_lee_vol) for T in maturities]
hull_white_drifts = [
hjm_drift(t, T, lambda t, s: hull_white_vol(t, s, sigma=0.01, kappa=0.1))
for T in maturities
]

The Ho-Lee drift grows without bound as maturity increases, which can lead to unrealistic long-term behavior. Forward rates at very long maturities would drift upward at an accelerating pace, potentially reaching implausibly high levels. The Hull-White specification, with its exponentially decaying volatility, produces a bounded drift that stabilizes at longer maturities. This behavior aligns better with economic intuition: long-term rates should not exhibit explosive dynamics.
Simulating Forward Rate Curves Under HJM
To implement HJM in practice, we discretize time and simulate the forward rate curve evolution. Starting from today's observed forward curve , we evolve each point on the curve simultaneously. This parallel evolution captures how the entire term structure moves together while respecting the no-arbitrage constraint. The simulation proceeds by applying small increments to each forward rate, with the drift determined by the HJM condition and the random shock drawn from a standard normal distribution scaled by the volatility function.
def simulate_hjm_forward_curves(
f0_curve, maturities, dt, num_steps, sigma_func, num_paths=1000
):
"""
Simulate forward rate curve evolution under HJM framework.
Parameters:
-----------
f0_curve : array
Initial forward rate curve f(0, T) for each maturity
maturities : array
Maturity points T
dt : float
Time step
num_steps : int
Number of time steps
sigma_func : callable
Volatility function sigma(t, T)
num_paths : int
Number of Monte Carlo paths
Returns:
--------
f_curves : array of shape (num_paths, num_steps+1, len(maturities))
Simulated forward rate curves
"""
num_maturities = len(maturities)
f_curves = np.zeros((num_paths, num_steps + 1, num_maturities))
f_curves[:, 0, :] = f0_curve
for step in range(num_steps):
t = step * dt
dW = np.random.randn(num_paths) * np.sqrt(dt)
for j, T in enumerate(maturities):
if T > t: # Only evolve rates for maturities beyond current time
sigma = sigma_func(t, T)
# Calculate cumulative volatility for drift
# drift = sigma(t, T) * int_t^T sigma(t, s) ds
integral, _ = quad(lambda s: sigma_func(t, s), t, T)
drift = sigma * integral
f_curves[:, step + 1, j] = (
f_curves[:, step, j] + drift * dt + sigma * dW
)
else:
f_curves[:, step + 1, j] = np.nan # Rate has "expired"
return f_curves
# Initial flat forward curve at 5%
maturities = np.array([0.5, 1, 2, 3, 5, 7, 10])
f0_curve = np.ones(len(maturities)) * 0.05
# Simulate under Hull-White volatility
np.random.seed(42)
f_curves = simulate_hjm_forward_curves(
f0_curve,
maturities,
dt=0.01,
num_steps=100, # 1 year
sigma_func=lambda t, T: 0.01 * np.exp(-0.1 * (T - t)),
num_paths=1000,
)
The simulation shows how the forward rate curve evolves over time under HJM dynamics. The initial flat curve develops both level shifts and changes in shape, with uncertainty increasing over the simulation horizon. The widening confidence band reflects the accumulation of random shocks over time, while the upward drift of the median reflects the convexity adjustment built into the HJM drift condition. Note that as time passes, short-maturity rates "expire" and are no longer meaningful, which is why we shift the maturities when plotting the future distribution.