Solution: Itô vs. Ordinary Chain Rule — Where They Diverge Numerically
Part 1
import numpy as np
rng = np.random.default_rng(0)
mu, sigma, T = 0.10, 0.40, 1.0
N = 200_000
W_T = rng.normal(0.0, np.sqrt(T), size=N)
log_ret = (mu - 0.5 * sigma**2) * T + sigma * W_T # exact distribution of ln(S_T/S_0) under GBM
print(f"Empirical mean of ln(S_T/S_0): {log_ret.mean():.4f}")
print(f"Naive (A) : {mu * T:.4f}")
print(f"Itô-correct (B) : {(mu - 0.5*sigma**2) * T:.4f}")
# Empirical mean of ln(S_T/S_0): 0.0199
# Naive (A) : 0.1000
# Itô-correct (B) : 0.0200The empirical mean matches snippet B to three decimals. Snippet A is off by — the full Itô correction.
Part 2
From GBM: . Taking expectations using the Gaussian MGF :
So for . The naive-vs-correct gap is tiny for the arithmetic return because the two terms cancel — this is the coincidence that sometimes fools people into thinking GBM drift is everywhere.
emp_arith = np.exp(log_ret).mean() - 1
print(f"Empirical arith return E[S_T/S_0] - 1: {emp_arith:.4f}")
print(f"Theoretical e^{{mu T}} - 1 : {np.exp(mu*T) - 1:.4f}")
# Empirical arith return E[S_T/S_0] - 1: 0.1057
# Theoretical e^{mu T} - 1 : 0.1052The lesson: the drift of log-return is ; the drift of arithmetic return is . Naive calculus conflates them.
Part 3
The naive drift is ; the Itô drift is . Naive is within 10% of Itô iff:
Rearranging: , so , giving , i.e. .
Interpretation. For low-vol assets (bonds, index futures) the Itô correction is small — about per year. For high-vol assets (single stocks, crypto, options on vol) the correction dominates: at the correction is per year; at it is per year — larger than the drift itself. Options pricing is entirely about volatility, so option models that drop the Itô correction are wrong at the order of the quantity they are trying to price.
Part 4 (extension)
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(0)
mu, sigma, T = 0.10, 0.80, 1.0
N = 100_000
W_T = rng.normal(0.0, np.sqrt(T), size=N)
log_ret = (mu - 0.5*sigma**2)*T + sigma*W_T
fig, ax = plt.subplots()
ax.hist(log_ret, bins=80, density=True, alpha=0.7)
ax.axvline(mu*T, color='red', linestyle='--', label='Naive A: 0.10')
ax.axvline((mu - 0.5*sigma**2)*T, color='green', linestyle='-', label='Itô B: -0.22')
ax.set_xlabel('ln(S_T/S_0)'); ax.set_ylabel('density'); ax.legend()
# The green line sits in the middle of the histogram; the red line is deep in the right tail.At , the Itô-correct mean is and the naive mean is . The histogram is centred near . More than half the mass sits to the left of the naive prediction. Anyone using the naive drift would systematically over-predict log-returns and under-price downside risk.
Takeaways
- The Itô correction is the difference between a pricing model that works and one that doesn't. It is not a small effect at high volatility — it scales as , not .
- Log-return drift ≠ arithmetic-return drift. ; . Conflating them mis-prices every option.
- High-vol assets exaggerate the mistake. For crypto or single names at the Itô correction exceeds the drift in magnitude — ignoring it produces not just a bad number but a wrongly-signed one.
- Simulation doesn't lie. If your theoretical prediction and your Monte Carlo disagree, one of the two is wrong — usually the theoretical calculation, usually because of a missing Itô term.