Kelly Criterion for Prediction Markets
The single most common way small accounts blow up isn't a bad strategy โ it's correct strategy with catastrophically wrong position sizing. The Kelly Criterion is the mathematical solution to this. Here's how to apply it specifically to Polymarket arb.
What Kelly Actually Is
The Kelly Criterion is a formula that tells you what fraction of your bankroll to risk on any given trade to maximize the long-run geometric growth rate of your capital. It was developed by John L. Kelly Jr. at Bell Labs in 1956, originally for signal transmission, and later applied to gambling and investing.
The general form:
f* = (b ร p - q) / b Where: f* = fraction of bankroll to bet b = net odds received (profit per $1 risked) p = probability of winning q = probability of losing (1 - p)
For merge arbitrage โ where the outcome is guaranteed if you hold both sides โ the formula simplifies significantly.
Kelly for Merge Arb
In merge arb, there is no probability of losing (assuming you hold both YES and NO before merging). The only "risk" is execution risk โ the orders not filling, or filling at worse prices than expected. Modeled simply:
# Merge arb Kelly formula edge = profit_per_share / total_cost # Full Kelly f_full = edge / (1 + edge) # Example: YES=$0.47, NO=$0.51 # profit = $0.02, cost = $0.98 # edge = 0.02 / 0.98 = 2.04% # f_full = 0.0204 / 1.0204 = 2.0%
Full Kelly says risk 2% of your bankroll on a 2% edge trade. Sounds right. So why don't we use full Kelly?
Why Quarter-Kelly
Full Kelly maximizes the expected log of wealth โ the mathematically optimal strategy for long-run growth. But it has two serious problems in practice:
- Estimation error โ your edge estimate is never perfect. If your real edge is 1.5% but you calculate 2%, full Kelly over-bets by 33%.
- Drawdowns โ full Kelly produces gut-wrenching drawdowns. 50% drawdowns are mathematically expected. Most traders abandon a strategy during a drawdown.
Quarter-Kelly (25% of full Kelly) solves both:
f_quarter = (edge / (1 + edge)) ร 0.25 # Same example: # f_quarter = 2.0% ร 0.25 = 0.5% of bankroll per trade
The tradeoff is worth it:
| Sizing | Long-run Growth | Max Expected Drawdown |
|---|---|---|
| Full Kelly | 100% (maximum) | ~50% |
| Half Kelly | ~75% | ~25% |
| Quarter Kelly | ~87% | ~12% |
| Tenth Kelly | ~55% | ~5% |
Quarter-Kelly captures 87% of full Kelly's growth rate with a 12% max expected drawdown. For a small account where survival matters, this is the correct choice.
Position Size Limits
Two hard caps apply on top of Kelly sizing:
MAX_POSITION_FRACTION = 0.30 # Never more than 30% of capital per trade MIN_PROFIT_DOLLARS = 0.10 # Skip trades where expected $ profit < $0.10 CAPITAL_RESERVE = 0.20 # Keep 20% in reserve for gas + emergencies # Final position size: kelly_size = capital ร f_quarter max_size = capital ร 0.30 position = min(kelly_size, max_size)
Always keep 20% of capital in reserve. Gas fees on Polygon are tiny (~$0.005/merge) but during network congestion they can spike. Running out of MATIC for gas means you can't execute merges โ your USDC is trapped holding positions. Reserve prevents this.
Worked Examples
| Capital | YES Price | NO Price | Edge | Quarter-Kelly % | Position Size | Expected Profit |
|---|---|---|---|---|---|---|
| $300 | $0.47 | $0.51 | 2.04% | 0.50% | $1.50 | $0.03 |
| $300 | $0.43 | $0.54 | 3.09% | 0.75% | $2.25 | $0.07 |
| $300 | $0.38 | $0.57 | 5.26% | 1.25% | $3.75 | $0.19 |
| $3,000 | $0.47 | $0.51 | 2.04% | 0.50% | $15.00 | $0.31 |
| $30,000 | $0.47 | $0.51 | 2.04% | 0.50% | $150.00 | $3.06 |
The compounding effect is what makes this viable. At $300 you're making $0.03-$0.20 per trade โ but those profits reinvest immediately, grow the capital base, and increase subsequent position sizes. This is why capital velocity (how fast USDC recycles through trades) matters more than per-trade profit at small account sizes.
The Enhanced Kelly for Execution Uncertainty
Pythia's bot uses an enhanced version that accounts for execution probability โ the chance that limit orders actually get filled at the target price:
# Enhanced Kelly with execution uncertainty
def kelly_enhanced(profit, cost, p_execution=0.85):
edge = profit / cost
base_kelly = (edge / (1 + edge)) * 0.25
# Scale down by sqrt of execution probability
return base_kelly * (p_execution ** 0.5)
# At 85% estimated fill probability:
# kelly_enhanced(0.02, 0.98) = 0.50% ร โ0.85 = 0.46%
The square root scaling is conservative โ it prevents over-betting in illiquid markets where fills are uncertain. In liquid politics markets with narrow spreads, execution probability approaches 95%+ and the adjustment is minimal.
Scaling Capital
Position sizes scale with capital automatically via Kelly. The more capital you have, the larger each trade โ but the percentage stays constant. This is the key insight: you don't change the strategy as you scale. You just run the same formula on a larger number.
| Capital Level | Trades/Day (automated) | Expected Daily Profit | Monthly (est.) |
|---|---|---|---|
| $300 | 5-10 (manual) | $0.50โ$2.00 | $15โ$60 |
| $3,000 | 50-100 (semi-auto) | $5โ$20 | $150โ$600 |
| $30,000 | 500+ (fully automated) | $50โ$200 | $1,500โ$6,000 |
| $300,000 | 5,000+ (HFT-level) | $500โ$2,000 | $15,000โ$60,000 |
These are conservative estimates based on historical opportunity frequency. The top arbers are running 333 trades per minute โ the scale is achievable with a properly built bot and meaningful capital.
The Full Playbook โ Including All The Code
Scanner, executor, Kelly sizing implementation, and the complete $300 โ $300K roadmap. 8 chapters. $9.
GET THE PLAYBOOK โ