Skip to content
All library documents

Spot-Measure LMM Drift and Convexity in Future Rates

Article Quant Q&A · Author: JoeBass

Summary

The document asks why a Libor Market Model (LMM) simulated under the spot measure produces a future one-year rate whose average exceeds the initial flat forward rate. It presents a discretized LMM update with constant volatility and a flat curve, then reports R and MATLAB simulations in which future rates rise above the initial level.

The accepted explanation is that, under the money-market numeraire, discounted bond prices—not future short rates themselves—must satisfy the martingale condition. For a two-year bond with a known first-year rate, this condition implies an expectation for the exponential of the second-year rate. Convexity then makes the expected rate exceed the forward rate when volatility is positive. The discussion frames this as a bond convexity effect rather than an arbitrage or necessarily a discretization error. It gives a conceptual derivation and simulation illustrations, but does not assess implementation details or quantify discretization bias.

Key ideas

  • Under the spot measure, bond prices divided by the money-market account are martingales.
  • The martingale condition constrains discounted bond prices rather than the arithmetic mean of future rates.
  • Convexity can make the expected future rate exceed the corresponding forward rate when volatility is positive.
  • The described convexity effect grows with volatility and vanishes when volatility is zero.

Tags

Full text
# Should the Libor Market Model using spot measure as numeraire simulate an arbitrage free forward curve?


# Should the Libor Market Model using spot measure as numeraire simulate an arbitrage free forward curve?












I have been looking at the following resource:

Reference Paper

Using equation [4] for the discretized version of the forward libor rate:

$\tilde{L}^i_{T_{j+1}} = \tilde{L}^i_{T_{j}} exp[\sigma^i(\sum^i_{k = j + 1}\frac{\tau_k L^k_{T_{j}} \sigma^k}{1 + \tau_k L^k_{T_{j}}} - \frac{1}{2}\sigma^i)\tau_j + \sigma^i\sqrt{\tau_j}Z_j]$

Now with some simplifying assumptions, namely that the time slice $\tau$ is 1 period and the volatility function $\sigma$ is a constant of 1, I get the following:

$\tilde{L}^i_{T_{j+1}} = \tilde{L}^i_{T_{j}} exp[(\sum^i_{k = j + 1}\frac{L^k_{T_{j}}}{1 + L^k_{T_{j}}} - \frac{1}{2}) + Z_j]$

Next, I assume an initial flat market forward curve at time $t_0$ of 6% (and thus also the spot curve is flat at 6%).

The question is then, shouldn't monte-carlo simulations based on the above create an arbitrage free forward curve in the future?

Suppose I invest 1 dollar in the 2 year spot at 6%, giving me 1.27497 at $t_2$ (continuous compounding). Alternatively, I could invest 1 dollar in the 1 year spot, giving me 1.061837 at $t_1$, and then I invest in the new 1 year spot at time $t_1$. This implies that the spot at $t_1$ should average to 6% for arbitrage free conditions to hold.

I simulate this in R...

```
F0 <- c(.06, .06, .06, .06, .06) # initial forward curve starting at T[0] and going to T[4]

paths <- 100000

Z0 <- rnorm(paths)

F1_0 <- F0[2] * exp((F0[2] / (1 + F0[2])) - .5 + Z0)
F1_1 <- F0[3] * exp((F0[2] / (1 + F0[2])) + (F0[3] / (1 + F0[3])) - .5 + Z0)
F1_2 <- F0[4] * exp((F0[2] / (1 + F0[2])) + (F0[3] / (1 + F0[3])) + (F0[4] / (1 + F0[4])) - .5 + Z0)
F1_3 <- F0[5] * exp((F0[2] / (1 + F0[2])) + (F0[3] / (1 + F0[3])) + (F0[4] / (1 + F0[4])) + (F0[5] / (1 + F0[5])) - .5 + Z0)

mean(F1_0) # 0.06359581
```

The mean future 1 year $t_0$ spot rate has converged to 0.0635, which is not arbitrage free. According to my setup, I should just invest in the 1 year spot now and then the 1 year spot next year.

So what gives? Am I misinterpreting the components of the discretized LMM? Does the discretized version introduce some sort of drift error?

Edit:

When I use the LMM in Matlab with a similar setup for the instantaneous volatility, I see somewhat similar behaviour:

```
Settle = datenum('1-Jan-2021');
CurveTimes = 0:10;
Rates = [0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06 0.06];
CurveDates = daysadd(Settle,360*CurveTimes,1);

irdc = IRDataCurve('Forward',Settle,CurveDates,Rates,'Compounding',-1);

LMMVolFunc = @(a,t) 1;
LMMVolParams = [1];
  
numRates = 21;
VolFunc(1:numRates,1) = {@(t) LMMVolFunc(LMMVolParams,t)};
  
Beta = 0;
CorrFunc = @(i,j,Beta) exp(-Beta*abs(i-j));
Correlation = CorrFunc(meshgrid(1:numRates)',meshgrid(1:numRates),Beta);
  
LMM = LiborMarketModel(irdc,VolFunc,Correlation,'Period',1,'NumFactors',1);

[ZeroRates, ForwardRates] = simTermStructs(LMM, 10,'nTrials',10000);

mean(ForwardRates(1,1,:)) % ans = 0.0618
mean(ForwardRates(2,1,:)) % ans = 0.0650
mean(ForwardRates(3,1,:)) % ans = 0.0925
```

Again, the mean future $t_0$ spot rates are drifting upwards instead of staying flat. How should I interpret this drift? Do I just live with it? Note: I am significantly less competent in Matlab as I am in R, so there is certainly some possibility I am doing something inappropriate here.

## Answer by dm63 (score 1, accepted)

https://quant.stackexchange.com/a/67946

I think that under the spot (money market) measure, the ratio of bond prices to the money market account is a martingale. So consider a world where the continuously compounded rate for the first year is known at 6%, and there is a two year zero coupon bond priced at exp(-0.12). We simulate the rate r in the second year. The above martingale condition gives $$ exp(-0.12)/1=E[ 1/exp(0.6+r)].$$ This simplifies to $$E[exp(-r)]=exp(-0.06).$$ But since the exponential function is negatively convex we have $$E[exp(-r)]<exp(-E[r])$$ or $$E[r]>0.06.$$ Fundamentally the expectation of the rate is higher than the forward rate due to convexity of bonds. The ‘error’ should increase as volatility increases and should go to zero if volatility is zero.

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.