I have been looking at the following resource:
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.