Strasmore Research
Deep Dives · Matt ConnorBy Matt Connor · · Updated 2026-08-01

Kelly Criterion Position Sizing: How E Dey Work

Kelly criterion na how to size bet based on your edge. We check wetin ten years of daily stock returns show about full Kelly, drawdown, and half Kelly for real life.

Kelly criterion na formula for bet size. You give am probability of winning, how much you go win, and how much you go lose, and e go show you wetin you go use from your money to make am grow pass for long run. John Kelly publish am for Bell Labs for 1956 as information-theory result, and gamblers and traders come dey use am after. This page go show you how the formula dey work from scratch, then measure wetin e talk for ten years of real daily stock returns, where the prescription turn out to be unlivable.

Wetin Kelly criterion actually talk

Make we take bet wey dey repeat, wey dey win fraction g of wetin you bet with probability p, and lose fraction l of wetin you bet with probability q, where q na one minus p. The fraction of capital wey you suppose use for each repetition to make am grow pass well well na:

f* = p / l - q / g

For the normal even-money case, where win dey pay wetin loss dey cost, g and l both equal 1 and the formula become f* = p - q. That difference na the edge itself. A wager wey dey win 60% of the time at even money get 20-point edge, and Kelly stake 20% of the bankroll on am.

The derivation na one step of calculus applied to the expected logarithm of wealth. To make the average log of wealth per bet maximum na the same as to make the compound growth rate maximum over a long sequence, and the fraction wey achieve am na the one above. Two properties come from that. Kelly never stake the whole bankroll on a bet wey fit lose everything, because the logarithm of zero na negative infinity. And any fixed fraction wey no be f, if you repeat am long enough, e dey compound slower than f dey do.

A coin flip you fit check with hand

The figures for this section na hypothetical, chosen to make the arithmetic clear. Make we take a coin wey dey land heads 60% of the time and dey pay even money, with a starting bankroll of $1,000.

  • Stake 20% of the bankroll on every flip. A win carry $1,000 to $1,200; a loss carry am to $800. One win and one loss, for any order, leave $960.
  • Stake 40% of the bankroll on every flip. The same win-then-loss pair run $1,000 to $1,400 to $840.
  • Stake the whole bankroll on every flip. One single tail end the sequence forever, no matter the edge.

That 4% round-trip cost at 20% staking na the price of compounding a volatile bankroll, and a 60/40 coin cover am many times over for a long sequence. At 40% staking the round-trip cost na 16%, and the coin no longer cover am: the growth rate at twice the Kelly fraction land at roughly zero. Past that point a bet with a real, verified edge no dey grow anything at all, which na the most useful single fact the formula carry.

Wetin the formula ask for on a daily stock bet

Now point the same formula at a market. Treat one trading day for one stock as one repetition of the bet: the win probability na the share of days wey close up, the win size na the average up-day move, and the loss size na the average down-day move. Ten full calendar years of daily closes, 2016 through 2025, across six familiar names:

QueryKelly inputs from daily closes, 2016 through 2025: win rate, average gain, average loss, and the fraction the formula returns
The exact SQL behind every number
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'NVDA', 'TSLA')
      AND window_start >= '2016-01-01 00:00:00'
      AND window_start <  '2026-01-01 00:00:00'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, dt
),
steps AS (
    SELECT ticker, dt, c,
           lagInFrame(c) OVER (PARTITION BY ticker ORDER BY dt
                               ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM daily
),
rets AS (
    SELECT ticker, c / prev - 1 AS ret
    FROM steps
    WHERE prev > 0 AND c != prev
)
SELECT ticker,
       round(100 * countIf(ret > 0) / count(), 1) AS win_rate_pct,
       round(100 * avgIf(ret, ret > 0), 2) AS avg_gain_pct,
       round(100 * abs(avgIf(ret, ret < 0)), 2) AS avg_loss_pct,
       round(countIf(ret > 0) / count() / abs(avgIf(ret, ret < 0))
             - countIf(ret < 0) / count() / avgIf(ret, ret > 0), 1) AS full_kelly_x
FROM rets
GROUP BY ticker
HAVING countIf(ret > 0) > 0 AND countIf(ret < 0) > 0
ORDER BY full_kelly_x DESC
Run this yourself

Read the first three columns and the edge look small. Win rates dey cluster near a coin flip, and the average up day and the average down day dey close in size for every name for the panel. SPY close higher on 55.3% of its sessions, gaining 0.71% on an average up day against 0.76% on an average down day.

The last column na where the trouble start. Those small, almost balanced inputs dey for the denominators of the formula, and small denominators produce big answers. The fraction the formula return for SPY na 10.1 times capital, and the lowest of the 6 names still land at 2 times. Full Kelly on a daily equity bet no be percentage of the account. E be demand for leverage wey no broker dey give and no account dey survive.

The shape of the tradeoff

That na the theory. The next panel na the experiment. Take the actual daily returns of the S&P 500 tracker over the same ten years, scale each day's return by a fixed bet size, and compound the result. A bet size of 1.0x na the unlevered index. A bet size of 3.0x commit three dollars for every dollar of capital, every day, rebalanced daily. Each row na one full ten-year path, with its ending wealth and the deepest peak-to-trough fall wey e take along the way.

QueryOne decade of S&P 500 daily returns compounded at eight fixed bet sizes: ending wealth and worst drawdown
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2016-01-01 00:00:00'
      AND window_start <  '2026-01-01 00:00:00'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
steps AS (
    SELECT dt, c,
           lagInFrame(c) OVER (ORDER BY dt ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM daily
),
rets AS (
    SELECT dt, c / prev - 1 AS ret
    FROM steps
    WHERE prev > 0
),
sizes AS (
    SELECT arrayJoin([0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 4.0, 5.0]) AS bet
),
paths AS (
    SELECT bet, dt,
           exp(sum(log(greatest(1 + bet * ret, 0.0001)))
               OVER (PARTITION BY bet ORDER BY dt
                     ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)) AS equity
    FROM rets CROSS JOIN sizes
),
peaks AS (
    SELECT bet, dt, equity,
           max(equity) OVER (PARTITION BY bet ORDER BY dt
                             ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS peak
    FROM paths
)
SELECT concat(toString(bet), 'x') AS bet_size,
       round(argMax(equity, dt), 2) AS ending_multiple,
       round(100 * max(1 - equity / peak), 1) AS max_drawdown_pct
FROM peaks
GROUP BY bet
ORDER BY bet
Run this yourself

At 0.5x the path end at 1.92 times its starting capital, with a worst fall of 18.2% from a prior high. At 5x, the same daily returns and the same decade, the path end at 14.35 times, with a worst fall of 94.5%.

The two columns move different, and that na the whole lesson of fractional Kelly. Ending wealth dey rise with bet size for a while, flatten, and then turn down as the drag from compounding volatility overtake the extra exposure. The drawdown column get no such turning point. E dey climb at every step across the 8 rows, and e dey climb faster than the wealth column ever do. Half of the growth of the optimal bet dey available at half the optimal bet size, at a small fraction of the pain. That asymmetry na the argument for staking less than f*, and na why the half-Kelly convention dey exist at all.

The estimate na the weak part, no be the formula

The formula na exact for a bet wey its odds dey known. For a casino the odds dey printed. For a market dem dey estimate am from history, and the estimate dey wobble. Here na the same calculation as the first panel, run separately on each of the ten calendar years for one index tracker.

QueryThe same Kelly calculation on the S&P 500 tracker, year by year, 2016 through 2025
The exact SQL behind every number
WITH daily AS (
    SELECT toDate(toTimeZone(window_start, 'America/New_York')) AS dt,
           argMax(toFloat64(close), window_start) AS c
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker = 'SPY'
      AND window_start >= '2016-01-01 00:00:00'
      AND window_start <  '2026-01-01 00:00:00'
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY dt
),
steps AS (
    SELECT dt, c,
           lagInFrame(c) OVER (ORDER BY dt ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) AS prev
    FROM daily
),
rets AS (
    SELECT dt, c / prev - 1 AS ret
    FROM steps
    WHERE prev > 0 AND c != prev
)
SELECT toString(toYear(dt)) AS year,
       round(100 * countIf(ret > 0) / count(), 1) AS win_rate_pct,
       round(100 * avgIf(ret, ret > 0), 2) AS avg_gain_pct,
       round(100 * abs(avgIf(ret, ret < 0)), 2) AS avg_loss_pct,
       round(countIf(ret > 0) / count() / abs(avgIf(ret, ret < 0))
             - countIf(ret < 0) / count() / avgIf(ret, ret > 0), 1) AS full_kelly_x
FROM rets
GROUP BY year
HAVING countIf(ret > 0) > 0 AND countIf(ret < 0) > 0
ORDER BY year
Run this yourself

Every row na an estimate of the same unknown quantity, built from roughly 250 observations. Year 2016 return 13.7, on a win rate of 53.8%. Year 2025 return 12.3, on a win rate of 57.8%. The chart show how far apart 10 readings of one number fit land when each dey draw from one year.

That dispersion matter pass any refinement of the formula. If you overstate your edge by two times and the formula give back roughly twice the bet size, wey place you at or past the point where growth turn negative. If you understate am and you give up growth wey you for don compound, without risk of ruin. The two errors no dey symmetric, and the cheap side of the asymmetry na the small side. Practitioners wey dey use Kelly at all tend to stake half of am, or a quarter, and treat the formula as a ceiling instead of a target.

Where the model stop dey describe a market

Kelly assume a bet wey you fit repeat with fixed, known odds, and outcomes wey dey independent from one repetition to the next. A market break all of that. Odds dey estimated and change over time. Daily returns dey cluster: quiet stretches follow quiet stretches, and violent days arrive in groups, wey stretch drawdowns beyond wetin an independence assumption dey predict. Positions no dey settle at the end of each day, gaps skip past the price where a bet for don close, and margin calls arrive on the schedule of the broker instead of the schedule of the model.

The formula still earn its keep as a boundary. E talk, for one line, say there be a bet size past which more conviction produce less wealth, and e locate that boundary from quantities wey a trader fit at least try to measure. That na also why the same logic point toward diversification: several partly independent bets share the same total risk budget more efficient than one bet do, which na the arithmetic under concentration risk. And for an investor wey dey add money on a schedule instead of sizing discrete wagers, the position-sizing question dey answered by the schedule itself, which na the case for dollar-cost averaging.

FAQ

Wetin be the Kelly criterion formula?

For a bet wey dey win fraction g of the stake with probability p and lose fraction l with probability q, the growth-optimal fraction of capital na f = p / l - q / g. For the even-money case e simplify to f = p - q, the edge itself.

Why traders dey use half Kelly instead of full Kelly?

Growth dey close to flat near the optimum while risk keep rising past am, so cutting the bet in half surrender a modest amount of long-run growth and remove a big share of the drawdown. Estimation error compound the argument: a doubled bet from an overstated edge sit near the point where growth stop.

Does the Kelly criterion work for stocks?

E apply as arithmetic, and its assumptions of fixed known odds and independent outcomes no dey hold for markets. Applied naively to daily equity returns e ask for leverage well past wetin any account fit carry, as the first panel above show.

Wetin happen if you bet more than the Kelly fraction?

The long-run growth rate fall. At roughly twice the Kelly fraction e reach about zero, and beyond that a bet with a real edge shrink capital over time while its drawdowns keep deepening.

Is the Kelly criterion the same as risking 1% or 2% per trade?

No. A fixed-percentage rule ignore the odds entirely and apply the same number to every setup. Kelly scale the stake with the measured edge, which make am more responsive when the edge dey known and more fragile when the edge dey guessed.


Every figure above come from a stored query you fit open, edit, and re-run. Swap the tickers, the window, or the bet-size grid and measure the tradeoff yourself on the Strasmore terminal.