5D Library › Non-Ergodic Wealth Dynamics, the Kelly Criterion and Volatility Drag · 中文
Chapter 2 Geometric Brownian Motion, Itô’s Lemma and Volatility Drag
Multiplicative growth in continuous time
The coin game is discrete. Carried into continuous time, the most common model is geometric Brownian motion:
where μ is the expected rate of return per year (the drift), σ the volatility and Wt a standard Brownian motion. The model says that over each very short interval the percentage change in price has a deterministic part μ dt and a random part σ dWt. It underlies Black–Scholes option pricing and Merton’s continuous-time portfolio theory (Merton 1969), and it is a deliberately simplified model: real prices jump, their volatility clusters, and their tails are fat (Chapter 6).
Itô’s lemma
We care about the logarithm of wealth because (Chapter 1) the log growth rate is the ergodic quantity. Taking a function of a random process, the chain rule of ordinary calculus needs a correction term, and that is Itô’s lemma (Itô 1944). For f(S) = ln S:
The extra −σ2/2 comes from a property of Brownian motion: (dWt)2 is not a negligible higher-order term but equals dt. Intuitively, a price that rises 10 % and then falls 10 % ends at 1.1 × 0.9 = 0.99, one per cent lower: fluctuation by itself erodes compounding.
So ln ST is normally distributed with mean (μ − σ2/2)T and variance σ2T, and there are two different growth rates:
- expected wealth E[ST] = S0 eμT grows at rate μ;
- median wealth (and the long-run growth of almost every path) grows at rate g = μ − σ2/2.
The difference, σ2/2, is often called volatility drag, or the “volatility tax”.
Calculation
With the expected return fixed at 8 % a year, the mean and median after 30 years for different volatilities; then five yearly returns checking that “geometric mean ≈ arithmetic mean − variance/2”.
# Geometric Brownian motion dS = mu S dt + sigma S dW. Ito's lemma gives
# d ln S = (mu - sigma^2/2) dt + sigma dW,
# so the MEAN of S grows at rate mu but the MEDIAN (and, in the long run, almost every
# single path) grows at g = mu - sigma^2/2. Simulated with exact log-normal steps, one a
# year (the log-normal step is exact, so finer steps would give the same distribution).
import math, random, statistics
def simulate(mu, sigma, years=30, paths=20000, seed=7):
random.seed(seed)
a, b = mu - 0.5 * sigma ** 2, sigma
return [math.exp(sum(a + b * random.gauss(0, 1) for _ in range(years)))
for _ in range(paths)]
mu = 0.08
print(f"mu = {mu:.0%} a year, 30 years; multiples of the starting wealth")
print(f"{'sigma':>5} {'g':>7} {'exp(mu T)':>9} {'sim mean':>9} {'exp(g T)':>9}"
f" {'sim median':>10} {'P(end<start)':>13}")
for sigma in (0.10, 0.20, 0.30, 0.40):
w = simulate(mu, sigma)
g = round(mu - 0.5 * sigma ** 2, 9) + 0.0 # round away a -1e-17
print(f"{sigma:5.2f} {g:+7.3f} {math.exp(mu * 30):9.1f} {statistics.fmean(w):9.1f}"
f" {math.exp(g * 30):9.2f} {statistics.median(w):10.2f}"
f" {sum(x < 1 for x in w) / len(w):13.1%}")
# The same identity for discrete yearly returns: geometric mean ~ arithmetic - variance/2.
rets = [0.30, -0.20, 0.25, -0.15, 0.10]
am = statistics.fmean(rets)
gm = math.prod(1 + r for r in rets) ** (1 / len(rets)) - 1
print(f"\nyearly returns {rets}")
print(f"arithmetic mean {am:+.2%}, geometric mean {gm:+.2%},"
f" approximation {am - statistics.pvariance(rets) / 2:+.2%}")
# mu = 8% a year, 30 years; multiples of the starting wealth
# sigma g exp(mu T) sim mean exp(g T) sim median P(end<start)
# 0.10 +0.075 11.0 11.0 9.49 9.52 0.0%
# 0.20 +0.060 11.0 11.0 6.05 6.09 4.9%
# 0.30 +0.035 11.0 11.0 2.86 2.89 26.1%
# 0.40 +0.000 11.0 10.9 1.00 1.01 49.6%
#
# yearly returns [0.3, -0.2, 0.25, -0.15, 0.1]
# arithmetic mean +6.00%, geometric mean +3.98%, approximation +3.93%With the same expected return (8 %), raising volatility from 10 % to 40 % leaves expected wealth after 30 years at 11 times the start in every case, while the median falls from 9.5 times to 1 time: at σ = 40 %, g = 0.08 − 0.08 = 0, and half the paths are below the start after 30 years. Discrete yearly returns behave the same way: five years with an arithmetic mean of 6 % have a geometric mean of only about 4 %, within 0.1 percentage points of “arithmetic mean − variance/2”.
How leverage turns against compounding
Hold the risky asset with leverage L (for L > 1, borrowing L − 1 at the risk-free rate r and continuously readjusting back to L times). The portfolio is again a geometric Brownian motion, with drift r + L(μ − r) and volatility Lσ. Its long-run growth rate is
The expected return rises linearly with L, but the volatility tax rises with the square of L. The parabola peaks at L* = (μ − r)/σ2, falls back to the risk-free rate at 2L*, and beyond that drops below the risk-free rate and eventually below zero.
Calculation
Illustrative parameters: μ = 7 %, σ = 18 %, r = 3 % (not an estimate for any market). Growth rates for different leverage, median wealth after 20 years, and the probability of halving from a peak at least once in 20 years (weekly steps, 2,000 paths).
# Leverage and volatility drag. Hold L times the risky asset (mu, sigma), borrowing L - 1
# at the risk-free rate r, and rebalance continuously. The portfolio is again a geometric
# Brownian motion with drift r + L (mu - r) and volatility L sigma, so its long-run
# growth rate is g(L) = r + L (mu - r) - L^2 sigma^2 / 2.
# Illustrative parameters, not a forecast: mu = 7 %, sigma = 18 %, r = 3 %.
import math, random, statistics
mu, sigma, r = 0.07, 0.18, 0.03
def g(L):
return r + L * (mu - r) - 0.5 * (L * sigma) ** 2
Lstar = (mu - r) / sigma ** 2
Lzero = ((mu - r) + math.sqrt((mu - r) ** 2 + 2 * r * sigma ** 2)) / sigma ** 2
print(f"growth-optimal leverage L* = (mu - r)/sigma^2 = {Lstar:.2f}")
print(f"growth back to the risk-free rate at 2 L* = {2 * Lstar:.2f}; zero at {Lzero:.2f}")
print(f"{'L':>5} {'mean return':>11} {'drag':>7} {'g(L)':>7} {'median, 20 y':>12}"
f" {'P(halve from a peak)':>21}")
random.seed(3)
for L in (0.0, 0.5, 1.0, Lstar, 1.5, 2 * Lstar, 3.0):
dt, n, paths = 1 / 52, 52 * 20, 2000 # weekly steps, 20 years
a, b = g(L) * dt, L * sigma * math.sqrt(dt)
finals, halved = [], 0
for _ in range(paths):
x = peak = 0.0
hit = False
for _ in range(n):
x += a + b * random.gauss(0, 1)
peak = max(peak, x)
hit = hit or x - peak < -math.log(2)
finals.append(math.exp(x)); halved += hit
drag = 0.0 - 0.5 * (L * sigma) ** 2 + 0.0
print(f"{L:5.2f} {r + L * (mu - r):+11.3f} {drag:+7.3f} {g(L):+7.3f}"
f" {statistics.median(finals):12.2f} {halved / paths:21.0%}")
# A product that resets leverage DAILY follows the continuous model only approximately;
# and with discrete daily moves, one day's fall of 1/L wipes out an L-times position.
for L in (2, 3):
print(f"L = {L}: a one-day fall of {100 / L:.0f} % in the underlying wipes out the"
" position")
# growth-optimal leverage L* = (mu - r)/sigma^2 = 1.23
# growth back to the risk-free rate at 2 L* = 2.47; zero at 3.07
# L mean return drag g(L) median, 20 y P(halve from a peak)
# 0.00 +0.030 +0.000 +0.030 1.82 0%
# 0.50 +0.050 -0.004 +0.046 2.52 0%
# 1.00 +0.070 -0.016 +0.054 2.95 34%
# 1.23 +0.079 -0.025 +0.055 2.93 63%
# 1.50 +0.090 -0.036 +0.054 2.98 86%
# 2.47 +0.129 -0.099 +0.030 1.69 100%
# 3.00 +0.150 -0.146 +0.004 1.04 100%
# L = 2: a one-day fall of 50 % in the underlying wipes out the position
# L = 3: a one-day fall of 33 % in the underlying wipes out the positionWith these parameters, the leverage that maximises long-run growth is about 1.23, giving growth of about 5.5 %; at 3 times leverage the expected return is 15 % but the long-run growth rate only 0.4 %, median wealth after 20 years has barely grown, and every path has been halved from a peak at least once. Even near the optimal leverage, the probability of at least one halving from a peak in 20 years is close to two-thirds.
Evidence
Leveraged products that reset daily. For exchange-traded products that reset their leverage to a fixed multiple every day, long-run performance depends on the path: in a volatile market without a clear direction the product falls even if the underlying returns to its starting level. Cheng and Madhavan, and Avellaneda and Zhang, derived that the value of such a product is approximately the underlying price raised to the power L, multiplied by a factor that decays with the accumulated variance, exp(−(L2 − L)σ2T/2), less financing costs and fees (Cheng and Madhavan 2009; Avellaneda and Zhang 2010). It is the same mathematical structure as the continuous model above.
Note
Discrete jumps. The continuous model assumes prices do not jump. In real markets, an L-times position is wiped out if the underlying falls by 1/L between two readjustments (50 % for 2 times leverage, about 33 % for 3 times), and a margin account may be closed out by force before that. Leverage in the real world is therefore more dangerous than the continuous model shows, not less.
Summary
Itô’s lemma shows that in geometric Brownian motion expected wealth grows at μ while the typical path grows at μ − σ2/2: volatility is itself a tax. Leverage raises the expected return linearly and the volatility tax quadratically, so the long-run growth rate is a parabola in leverage, with an optimum at L* = (μ − r)/σ2; beyond 2L* one does worse than taking no risk at all. The next chapter starts from this optimum, with the Kelly criterion and why one should bet less when the parameters are uncertain.
References
Fan, Y. (2026). Non-Ergodic Wealth Dynamics, the Kelly Criterion and Volatility Drag: From Itô's Lemma on Geometric Brownian Motion and Ruin Barriers to Barbell Portfolios, Read Beside the Shiji's 'Biographies of the Money-Makers' [非遍历性财富动力学、凯利准则与波动率税] (Version 1.0.0). 5D Library. https://doi.org/10.5281/zenodo.23754709 · Licensed under Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0).