Most prediction market traders bet too much. Not because they're reckless — because they don't know the math that tells them exactly how much to bet.
The Kelly Criterion is a formula from 1956 that answers a precise question: given your edge and the odds, what percentage of your bankroll maximizes long-term growth without risking ruin?
The answer is almost always smaller than you think.
The Formula
The Kelly Criterion for a binary bet (which is what every Polymarket and Kalshi contract is):
f* = (p × b - q) / b
Where: - f = fraction of bankroll to bet - p = your estimated probability of winning - b = the net odds (payout / stake - 1) - q* = probability of losing (1 - p)
For prediction markets, where you buy a contract at price c that pays $1 if you win:
- b = (1 - c) / c (your profit per dollar risked)
- p = your model's fair probability
- c = the market price (what you pay)
Simplified for Prediction Markets
f* = p - c / (1 - c) × (1 - p)
Or even simpler — Kelly fraction = edge / odds:
f* = (p - c) / (1 - c)
Where p - c is your edge (the gap between your fair probability and the market price) and 1 - c is your potential profit per contract.
Python Implementation
def kelly_fraction(fair_prob: float, market_price: float) -> float:
"""
Kelly Criterion for a binary prediction market contract.
Args:
fair_prob: Your model's estimated win probability (0-1)
market_price: Current market ask price in dollars (0-1)
Returns:
Optimal fraction of bankroll to bet (0 to 1).
Returns 0 if no edge (or negative edge).
"""
if fair_prob <= market_price:
return 0.0 # No edge — don't bet
edge = fair_prob - market_price
odds = 1 - market_price # Profit if you win
return edge / odds
def quarter_kelly(fair_prob: float, market_price: float) -> float:
"""Quarter-Kelly — what professionals actually use."""
return kelly_fraction(fair_prob, market_price) * 0.25
# Example: Model says 70% fair, market asks 58c
f = kelly_fraction(0.70, 0.58)
print(f"Full Kelly: {f:.1%}") # 28.6%
print(f"Half Kelly: {f*0.5:.1%}") # 14.3%
print(f"Quarter Kelly: {f*0.25:.1%}") # 7.1%
In this example, full Kelly says bet 28.6% of your bankroll. That's insanely aggressive. One bad run of 3-4 losses and you've lost 70%+ of your capital. This is why nobody uses full Kelly in practice.
Why Full Kelly Will Blow You Up
Full Kelly maximizes the long-term geometric growth rate of your bankroll. Mathematically, it's optimal. Practically, it's suicidal.
Here's why:
Variance is brutal. Full Kelly assumes your probability estimate is exactly correct. It's not. If your model says 70% but reality is 63%, full Kelly has you over-betting by a factor of 2x. And over-betting by just 2x reduces your long-term growth rate to zero.
Drawdowns are stomach-churning. Under full Kelly, you should expect to lose 50% of your bankroll at some point — even if your edge is real. The median drawdown from peak is 50%. That's not a bug in the formula; it's the price of maximum growth.
You don't know your true edge. The Kelly formula takes your probability estimate as truth. But your model has error. Your calibration drifts. Your execution has slippage. Every source of uncertainty means your actual edge is smaller than your measured edge — and full Kelly on an overestimated edge is a guaranteed path to ruin.
The research confirms this. Academic studies of prediction market traders show the median losing position is 3-5x larger than optimal Kelly sizing would suggest. Over-betting is the default failure mode, not under-betting.
Quarter-Kelly: What Professionals Use
The fix is simple: take the Kelly fraction and multiply by 0.25. This is called quarter-Kelly and it's the industry standard for professional bettors and prediction market traders.
Why quarter-Kelly specifically?
It survives model error. If your probability estimate is off by 10 percentage points (which happens), quarter-Kelly still produces positive growth. Full Kelly would produce negative growth on the same error.
Drawdowns are manageable. Quarter-Kelly's maximum expected drawdown is roughly 12-15% of your bankroll, versus 50%+ for full Kelly. You can stomach that.
It gives up surprisingly little growth. Quarter-Kelly's long-term growth rate is 75% of full Kelly's. You're giving up 25% of theoretical growth to eliminate 90% of the ruin risk. That's an incredible trade.
It's the Goldilocks zone. Half-Kelly is too aggressive for most model-based traders (model error is rarely zero). Eighth-Kelly is too conservative (you need thousands of bets to compound meaningfully). Quarter-Kelly balances growth against the reality that your model is wrong sometimes.
Practical Sizing Example
Bankroll: $1,000. Model says 68% fair probability. Market asks 55 cents.
fair = 0.68
market = 0.55
full = kelly_fraction(fair, market) # 28.9%
quarter = full * 0.25 # 7.2%
bet_size = 1000 * quarter # $72.22
print(f"Full Kelly bet: ${1000 * full:.0f}") # $289
print(f"Quarter Kelly bet: ${bet_size:.0f}") # $72
print(f"Contract quantity: {bet_size / market:.0f}") # 131 contracts
Full Kelly says bet $289. Quarter-Kelly says bet $72. On a $1,000 bankroll, $72 feels right — one loss doesn't devastate you, but wins compound meaningfully.
Why Calibration Makes or Breaks Kelly
The Kelly formula takes your probability estimate as input. If that estimate is wrong, the output is wrong. Garbage in, garbage out.
This is why calibrated probabilities are essential — not just "nice to have." Here's what happens with miscalibrated inputs:
Overconfident model (says 75%, reality is 65%): - Kelly thinks your edge is 20 cents. Real edge is 10 cents. - Kelly recommends 2x the correct bet size. - Over-betting by 2x → geometric growth rate goes to zero. - You slowly bleed out even though you have a real edge.
Well-calibrated model (says 70%, reality is 70%): - Kelly correctly sizes your bet. - You compound at the optimal growth rate. - Drawdowns are predictable and manageable.
Under-confident model (says 65%, reality is 70%): - Kelly under-bets. You leave money on the table. - But you never blow up. Slow and steady.
The asymmetry is critical: over-betting kills you, under-betting just slows you down. This is another reason to use quarter-Kelly — it's a hedge against calibration error.
At ZenHodl, we measure calibration with Expected Calibration Error (ECE). Our NCAAMB model has 4.39% ECE on 5,345 games — meaning when we say 70%, teams win between 65.6% and 74.4% of the time. Quarter-Kelly on a 4.39% ECE model is safe. Full Kelly would be reckless.
Kelly for Multiple Simultaneous Bets
On a busy NBA game night, you might have 5-8 open positions simultaneously. The Kelly formula for a single bet doesn't account for correlated risk across positions.
The practical solution:
Cap total exposure. Never have more than 20-25% of your bankroll deployed across all open positions combined. Even if quarter-Kelly says bet 7% on each of 5 games, cap total exposure at 25% (5% per game, not 7%).
Reduce per-bet sizing when stacking. If you have N simultaneous positions, divide your Kelly fraction by sqrt(N) as a rough correlation adjustment. With 4 open bets, each bet is half the standalone Kelly size.
Treat sports as partially correlated. NBA games on the same night aren't independent — a bad model night affects all of them. If your Elo is systematically wrong (e.g., you're overrating a conference), you'll lose multiple bets simultaneously.
def adjusted_kelly(fair_prob, market_price, num_open_positions, max_total_exposure=0.25):
"""Kelly adjusted for multiple simultaneous positions."""
base = quarter_kelly(fair_prob, market_price)
# Reduce per-bet size when stacking
correlation_adj = base / (num_open_positions ** 0.5)
# Cap total exposure
per_bet_cap = max_total_exposure / max(num_open_positions, 1)
return min(correlation_adj, per_bet_cap)
When Kelly Says "Don't Bet"
Kelly returns zero (or negative) when your model's fair probability is at or below the market price. This means you have no edge and the correct action is to not trade.
This happens more often than you'd think: - When the market has already priced in the information your model sees - During the last 2-3 minutes of a blowout (market is already at 95 cents) - On toss-up games where your model says 50-52% and the market says 50%
Kelly returning zero is not a failure — it's the formula protecting you from negative-EV bets. Approximately 60-65% of the signals our models detect get filtered out because the edge, after fees and slippage, is too small for Kelly to recommend a position. This is the same 65% rejection rate we've documented elsewhere.
The Fee and Slippage Adjustment
Raw Kelly doesn't account for transaction costs. On Polymarket, the taker fee is approximately 2%. On Kalshi, fees are 0-2 cents per contract. Slippage adds another 2-5 cents depending on market depth.
Adjust by reducing your fair probability estimate by the cost:
def kelly_with_costs(fair_prob, market_price, fee_pct=0.02, slippage_c=0.03):
"""Kelly adjusted for fees and slippage."""
# Reduce fair prob by expected costs
effective_fair = fair_prob - fee_pct - slippage_c
return quarter_kelly(effective_fair, market_price)
# Model says 70%, market at 58c, after 2% fee + 3c slippage
bet = kelly_with_costs(0.70, 0.58)
# Effective fair = 65%, not 70%
# Kelly fraction drops significantly
This is why thin edges (under 8 cents) rarely produce positive Kelly fractions after costs. The ZenHodl API requires a minimum 8-cent edge before signaling, precisely because smaller edges get eaten by fees and slippage.
Kelly in Practice: Our Trading Results
We run 5 automated bots across 11 sports on Polymarket. Every bot uses a form of Kelly sizing. Here's what the data shows:
Position sizes range from $0.50 to $5.00 per trade on a working bankroll of approximately $200. That's 0.25-2.5% per position — consistent with quarter-Kelly on 8-15 cent detected edges.
Maximum simultaneous exposure rarely exceeds 15%. On a heavy game night (8+ live games across NBA, NHL, MLB), total deployed capital peaks around $30 across all open positions.
The bots say "no" to 60-65% of signals. Kelly returns zero or near-zero on these because the edge after costs is insufficient. This forced discipline is the single biggest contributor to our positive P&L.
Our live trading results are publicly auditable on PolygonScan and displayed on our results page.
The Bankroll Management Framework
Kelly tells you how much to bet. You still need rules for when to stop.
Starting bankroll. Only trade with money you can lose entirely. Prediction markets are high-variance even with an edge. We recommend starting with $100-500 and scaling up only after 100+ profitable trades prove your edge is real.
Daily loss limit. Stop trading for the day after losing 5% of your bankroll in a single session. Our bots enforce a $20 daily loss circuit breaker.
Streak detection. After 5 consecutive losses, pause and review. The model may be miscalibrated, the market structure may have changed, or you may be in a high-variance regime.
Bankroll rebuilding. After a drawdown, Kelly automatically reduces your bet sizes (because your bankroll is smaller). Don't override this by "betting big to recover." The formula already handles mean reversion — trust it.
Common Mistakes
Mistake 1: Using full Kelly. The most common error. Full Kelly has a 50% expected drawdown. Use quarter-Kelly.
Mistake 2: Ignoring fees and slippage. Raw edge of 12 cents becomes 7 cents after costs. Kelly on 12 cents over-bets by 70%.
Mistake 3: Uncalibrated probability inputs. If your model says 75% but reality is 65%, Kelly has you betting 2x the correct amount. Calibrate your model before using Kelly.
Mistake 4: Betting on every signal. Kelly returns zero on no-edge situations. Many traders override this and bet anyway "because the game is on." Don't.
Mistake 5: Ignoring correlation between simultaneous bets. Five NBA games on the same night are not independent. If your Elo ratings are systematically wrong, you lose all five.
Mistake 6: Chasing losses. After a drawdown, the temptation is to increase bet size to "catch up." Kelly does the opposite — it decreases bet size because your bankroll is smaller. The formula is smarter than your emotions.
The Bottom Line
Kelly Criterion is the bridge between "I have an edge" and "I'm compounding wealth." Without it, you're guessing on position size — and the default guess is almost always too large.
The formula is simple. The discipline to follow it is not.
Quarter-Kelly. Calibrated probabilities. Fees included. Correlation adjusted. Daily loss limits. That's the framework. Everything else is noise.
The ZenHodl API provides the calibrated probabilities that make Kelly sizing work. Every prediction includes a confidence band so you know how much to trust the number. 7-day free trial at zenhodl.net/billing/start/api_starter. Position sizing and bankroll management are covered in Module 4 (Backtesting) and Module 5 (Live Bot) of our free course.