Kelly Criterion and Position Sizing

Finance

The Kelly criterion is the answer to a question every trader, gambler, and investor must answer: GIVEN a profitable opportunity, how much of your bankroll should you stake on it? Bet too little and you sacrifice long-term growth. Bet too much and you risk ruin — even with a positive expectancy. Kelly (J. L. Kelly Jr., 1956) showed that there is a UNIQUE optimal fraction that maximizes the LONG-RUN GEOMETRIC GROWTH RATE of wealth, and that betting MORE than twice this fraction is RUINOUS regardless of how favorable the odds.

The result is one of the cleanest in quantitative finance — closed-form, intuitive, and broadly applicable. It is used (in fractional form) by serious gamblers, hedge funds, market makers, and anyone optimizing long-run wealth under risk. It's also widely misunderstood: the "naive" application leads to recommended bet sizes far larger than most institutions can stomach, and the use of FRACTIONAL Kelly (typically half or quarter Kelly) reflects practical reality about parameter uncertainty rather than a rejection of the theory.

The binary case

The cleanest statement. Repeatedly bet a fraction of your bankroll on a wager that pays dollars per unit staked with probability , and loses the stake with probability . After one bet, wealth is multiplied by either or . After independent bets:

The LOG-WEALTH growth rate per bet is

Maximize: gives

A few sanity checks. (1) requires — positive expectancy. With : expected return per unit staked is , edge is 10%, and Kelly says bet exactly 10% — edge over odds. (2) Larger edge → larger fraction. (3) Higher payoff at fixed edge increases proportionally less because the upside is already big. (4) (bet everything) is only optimal in the degenerate case (sure thing).

The continuous case

For log-normal returns — i.e., a continuously compounded return — the analysis is even simpler. With a fraction in the risky asset and the rest at risk-free rate , the portfolio follows

The long-run log-growth rate (using Itô) is

Maximize: gives

Continuous Kelly: bet a fraction equal to the EXCESS RETURN over the VARIANCE. With , , : — Kelly says LEVER 2× into the market. With , : — Kelly says levered slightly. Reduce and Kelly grows quadratically.

Note: continuous Kelly often gives , meaning LEVERAGE. Whether you can actually borrow at the risk-free rate at the level Kelly demands is a separate (real-world) question. Most institutional investors find Kelly's prescription too aggressive in practice — see fractional Kelly below.

The ruinous over-betting region

The growth-rate function is concave with a unique maximum at . Beyond , growth DECREASES. Beyond , growth becomes NEGATIVE — even though every individual bet has positive expected value, the long-run growth rate is negative and the bankroll trends to zero almost surely. For the binary case exactly; for continuous Kelly, the level at which growth becomes zero is by the same algebra.

This is the cruellest fact in position sizing. A positive-EV opportunity, sized too large, doesn't just give worse-than-Kelly returns — it actively destroys wealth. The intuition: large bets create wild swings, and the GEOMETRIC mean of wild swings is below their ARITHMETIC mean (Jensen's inequality on log). Sufficient compounding losses cannot be undone by even larger compounding gains because of this geometric-arithmetic gap.

Code: growth rate vs bet fraction

# Kelly criterion: the fraction of bankroll that maximizes long-run
# logarithmic growth rate. Three cases:
#   1. Discrete binary bet
#   2. Continuous (Gaussian) returns
#   3. Monte Carlo verification of the growth-rate maximum

import numpy as np

def kelly_binary(p, b):
    """Optimal fraction for a binary bet: probability p of winning b dollars
    per unit staked, probability 1-p of losing the unit stake."""
    return (p*b - (1-p)) / b

def kelly_continuous(mu, sigma, r=0.0):
    """Optimal fraction for log-normal returns: f* = (mu - r) / sigma²."""
    return (mu - r) / sigma**2

print("Binary bet examples:")
for p, b in [(0.55, 1.0), (0.60, 1.0), (0.51, 2.0), (0.40, 3.0)]:
    f = kelly_binary(p, b)
    print(f"  p={p:.2f}, b={b:.1f}:  f* = {f:.4f}  (bet {100*f:.1f}% of bankroll)")

print("\nContinuous Kelly: f* = mu / sigma² (r = 0):")
for mu, sigma in [(0.05, 0.15), (0.08, 0.20), (0.10, 0.30)]:
    print(f"  mu={mu:.2f}, sigma={sigma:.2f}:  f* = {kelly_continuous(mu, sigma):.4f}")

# Monte Carlo: simulate growth rate vs bet fraction, show Kelly is the optimum.
def simulate_growth(p, b, f, n=500, n_paths=10000, seed=0):
    rng = np.random.default_rng(seed)
    wins = rng.random((n_paths, n)) < p
    log_returns = np.where(wins, np.log(1 + f*b), np.log(1 - f))
    return np.mean(log_returns.sum(axis=1)) / n

p, b = 0.55, 1.0
f_kelly = kelly_binary(p, b)
print(f"\nGrowth rate vs bet fraction (p={p}, b={b}, Kelly = {f_kelly}):")
print(f"  {'f':>8s}  {'E[ln(W)/n]':>14s}  {'comment':>12s}")
for f in [0.05, 0.08, f_kelly, 0.15, 0.20, 0.25]:
    g = simulate_growth(p, b, f)
    tag = '← Kelly' if abs(f - f_kelly) < 1e-3 else ('  RUIN' if g < 0 else '')
    print(f"  {f:>8.4f}  {g:>14.6f}  {tag:>12s}")
print("Over-betting at 2*Kelly gives ZERO growth; > 2*Kelly is ruinous.")

Output:

Binary bet examples:
  p=0.55, b=1.0:  f* = 0.1000  (bet 10.0% of bankroll)
  p=0.60, b=1.0:  f* = 0.2000  (bet 20.0% of bankroll)
  p=0.51, b=2.0:  f* = 0.2650  (bet 26.5% of bankroll)
  p=0.40, b=3.0:  f* = 0.2000  (bet 20.0% of bankroll)

Continuous Kelly: f* = mu / sigma² (r = 0):
  mu=0.05, sigma=0.15:  f* = 2.2222
  mu=0.08, sigma=0.20:  f* = 2.0000
  mu=0.10, sigma=0.30:  f* = 1.1111

Growth rate vs bet fraction (p=0.55, b=1.0, Kelly = 0.1):
         f      E[ln(W)/n]      comment
    0.0500        0.003766
    0.0800        0.004829
    0.1000        0.005036      ← Kelly
    0.1500        0.003776
    0.2000       -0.000083
    0.2500       -0.006659         RUIN

The growth rate is maximized at (Kelly), at value 0.0050 (about 0.5% per bet, or 0.5% × 500 = 250% over a lifetime of 500 bets). At 5% bet size: 75% of Kelly's growth. At 15% bet size: 75% of Kelly's growth (symmetric around ). At 20% (2× Kelly): essentially zero growth. At 25%: NEGATIVE growth — you lose money on average despite each bet having positive expected value.

Fractional Kelly

In practice, almost no one bets full Kelly. The two main reasons:

(1) Parameter uncertainty. Kelly assumes (or ) are KNOWN. They aren't — they're estimated from historical data with substantial uncertainty. A that's 1 percentage point too high turns a Kelly fraction of 2 into an actual optimum of 1 — and the wealth growth is much more sensitive to OVER-estimating Kelly (entering the ruinous region) than UNDER-estimating it. The asymmetry argues for using a conservative fraction.

(2) Variance reduction. Even at full Kelly, the path of wealth has very high variance. Half-Kelly gives 75% of Kelly's growth rate with HALF the variance of log-wealth. Most institutional investors prefer this trade. Two-thirds Kelly retains 89% of the growth rate.

The standard practitioner's choice: HALF KELLY (). Empirical observation from quant hedge funds, professional sports bettors, and the Kelly literature alike. Renaissance Technologies' Medallion Fund reportedly uses a fraction in the 25-50% Kelly range; gambler Edward Thorp explicitly advocated 0.5× Kelly in his books on blackjack and trading.

Multi-asset Kelly

With risky assets having mean excess returns and covariance , the multi-dimensional Kelly is:

Note the connection to the tangency portfolio: is the tangency portfolio (max-Sharpe direction), and the magnitude is the LEVERAGE. Multi-asset Kelly is "tangency portfolio + Kelly leverage" — the natural decomposition of position sizing in a multi-asset world.

The same parameter-uncertainty caveat applies, even more severely. The covariance matrix is noisy and ill-conditioned; amplifies that noise; the resulting multi-asset Kelly recommends large positions along the smallest-eigenvalue directions of , which are exactly the noisiest. Practitioners use SHRINKAGE on , FACTOR MODELS for the covariance, or simply scale down to fractional Kelly even more aggressively.

When Kelly fails

Related