The Kelly criterion is the bet-sizing formula that maximizes long-run logarithmic growth of your bankroll. It is mathematically optimal under specific conditions, and on average exactly nobody bets it at full size. The reason isn't that bettors are dumb; it's that the conditions Kelly assumes don't quite hold in sports betting. This post is about what Kelly actually says, why fractional Kelly is the working default, and the four ways that estimating-your-edge goes wrong in practice.
For a binary bet at decimal odds d with your estimated win probability p:
fraction_of_bankroll = (b * p - q) / b
where:
b = d - 1 # net payout per $1 staked
p = your estimated win probability
q = 1 - p # your estimated loss probability
Worked example. You estimate Yankees -145 has a 60% win probability. -145 is decimal 1.69 (1.69 - 1 = 0.69 net payout per $1).
b = 0.69
p = 0.60
q = 0.40
fraction = (0.69 * 0.60 - 0.40) / 0.69
= (0.414 - 0.40) / 0.69
= 0.014 / 0.69
= 0.0203
= 2.03% of bankroll
For a $10,000 bankroll, full Kelly says stake $203 on this bet. Across thousands of bets at this same edge, this stake-size maximizes the rate of geometric growth. The proof is in Kelly's 1956 paper "A New Interpretation of Information Rate"; the intuition is that bigger stakes win more on the upside but the downside risk grows faster (you can't bet 100% on a 60-40 because one loss zeros you).
Three reasons, each individually fatal:
Kelly assumes you know p exactly. You don't. You have an estimate. If your estimate is even slightly off, full Kelly is no longer optimal; it's actually heavily over-sized. Specifically: if your estimated edge is twice your true edge, full Kelly is roughly equivalent to two times Kelly on the true edge, which has the same expected log-growth as betting NOTHING (it's the breakeven point of the variance-vs-expectation tradeoff). If your estimate is more than 2x off, full Kelly actually loses money.
In sports betting, edge estimates are noisy. CLV studies suggest that a +EV scanner's estimated edge correlates with realized edge at maybe 0.6 to 0.8. That sounds high, but at 0.6 correlation a 2% estimated edge is consistent with a true edge anywhere from -1% to +5%. Sizing full Kelly on the 2% estimate, when the true edge is 0%, is catastrophic.
Full Kelly has unbounded downside variance over short horizons. A 50% drawdown from peak is roughly a 1-in-3 event over 1000 bets at full Kelly with a true 2% edge. Most bettors can't psychologically survive that, even if the math says they should.
Fractional Kelly (1/2, 1/3, 1/4 of full Kelly stake) trades some long-run growth for dramatically less variance. At half-Kelly you get ~75% of full Kelly's long-run growth with ~25% of the drawdown probability. Most pros size at 1/4 to 1/2 Kelly for this reason.
Books cap your stake size. Sharps especially get limited fast (see how sportsbooks detect arbitrage bettors). If Kelly says bet $2,000 and the book limits you to $50, your effective stake is $50 regardless of the math. Sizing studies in sports rarely hit Kelly's binding constraint because the book-imposed cap binds first.
Practical recommendation for most sports bettors:
fraction = max(0, min((b * p - q) / b, 0.05)) * 0.25
# Multiply Kelly result by 0.25 (quarter-Kelly)
# Hard-cap at 5% of bankroll per bet regardless of edge
This handles the three issues:
Some scenarios where you should NOT use Kelly:
| Scenario | Why Kelly fails | What to do instead |
|---|---|---|
| You have less than 100 bets of history at this edge | Your p estimate is unreliable. | Flat stake (1% of bankroll). Re-evaluate after 200+ bets. |
| Your bets are highly correlated (same-game parlay, simultaneous arbs across 5 NFL games) | Kelly assumes independent bets. Correlated bets compound variance. | Use Kelly on the joint probability, not per-bet, OR cut individual stakes by sqrt(N) for N correlated legs. |
| The edge is below 0.5% | Estimation noise dominates; the size Kelly recommends is below typical book min-stakes anyway. | Skip the bet or use flat min-stake. |
| You're playing on a sweepstakes or DFS app with non-cash payouts | The bankroll isn't cash-fungible. Kelly's log-utility assumption breaks. | Use the app's "exposure" tools instead of Kelly. |
| You can't psychologically tolerate 30%+ drawdowns | Even quarter-Kelly produces 25%+ drawdowns occasionally. Your real risk tolerance is binding. | Sixth-Kelly or flat stake at 0.5% of bankroll. |
Kelly is only as good as your p. Four ways the estimate goes wrong:
The book offers -145 = 59.18% implied. That's NOT your p; it's the book's offer. If you're using it as your win probability you're just betting that "the book is fair" which means you have zero edge. p must come from your own model, devigged sharp anchor, or some other independent estimate. See no-vig CLV explained.
Same trap, slightly subtler. Pinnacle has Yankees -145 (59.18% implied), so you assume p = 59.18%. But that includes Pinnacle's vig (~1.7%). Devig first: 59.18 / (59.18 + 42.55) = 58.18% no-vig. The 1-point gap between 59.18% and 58.18% is enough to flip a +EV play into a -EV one. See no-vig CLV explained.
You have three +EV scanners (sharp-anchor devig, multi-source consensus, your own GBM). They disagree on which side has edge. You take the one that says "+3% on Yankees" and ignore the two that say "no edge." Predictably, your realized edge is ~1/3 of what the cherry-picked model claimed. Pick a method per market type before scanning, then commit. See multi-source consensus pricing.
You bet Yankees ML at +EV. The same scanner now flags Yankees -1.5 spread at +EV. These are correlated. Sizing both at full Kelly assumes independence; your effective stake on "Yankees side" is now Kelly_ML + Kelly_spread, which is over-sized in expectation. Either bet the more-edged of the two, or size each at the joint-probability Kelly.
The /v1/sports/{sport}/ev endpoint returns the no-vig fair probability and the book's implied probability. Combine them with the offered American odds to compute Kelly:
def kelly_fraction(american_price, fair_prob, kelly_multiplier=0.25, max_fraction=0.05):
"""Return the suggested fraction of bankroll to stake.
Args:
american_price: int, the American odds you're considering taking
fair_prob: float, your estimated win probability (0..1)
kelly_multiplier: float, fractional-Kelly factor (default 0.25)
max_fraction: float, hard cap per bet (default 5%)
"""
# American -> decimal
if american_price > 0:
decimal = 1 + american_price / 100
else:
decimal = 1 + 100 / abs(american_price)
b = decimal - 1
p = fair_prob
q = 1 - p
raw_kelly = (b * p - q) / b
if raw_kelly <= 0:
return 0
return min(raw_kelly * kelly_multiplier, max_fraction)
Worked example with a +EV response:
{
"side": "Yankees",
"price": -135, # what you'd bet at
"book_implied_pct": 57.45,
"fair_prob_pct": 58.18, # Pinnacle-anchored devig
"edge_pct": 0.73,
"book": "FanDuel"
}
# stake = kelly_fraction(-135, 0.5818) * bankroll
# = 0.25 * 0.0125 * bankroll
# ~ 0.31% of bankroll
# On a $10,000 bankroll: stake ~ $31.
That's a small bet. It SHOULD be small: a 0.73% edge with noisy estimation is barely above zero in expectation. Quarter-Kelly sizes correctly for the edge size.
Full Kelly is the theoretical maximum-growth bet size assuming you know p exactly. You don't. Fractional Kelly (1/4 to 1/2) trades a small fraction of long-run growth for dramatically less variance. The 5% hard-cap-per-bet rule handles the "edge estimate is wildly wrong" case where Kelly would otherwise recommend something disastrous.
If you remember nothing else: multiply Kelly by 0.25 and cap at 5% of bankroll. That's the working default. From there you can adjust based on your specific edge-estimation confidence, correlation structure, and risk tolerance.