risk management

Kelly Criterion for Prediction Markets: Fee-Aware Position Sizing on Polymarket

How to size Polymarket bets with the Kelly criterion: the binary-contract formula, adjusting for Polymarket's taker fee, why fractional Kelly wins in practice (with a simulation), correlated markets, caps and a Python function.

Most traders lose money on prediction markets by betting the wrong amount rather than by picking the wrong side: too big after a win, too big on a "sure thing", and far too big on markets that turn out to be correlated. The Kelly criterion is the classic answer to "how much should I bet?", and it fits prediction markets unusually well, because every contract pays exactly $1 or $0.

This guide derives Kelly for Polymarket-style binary contracts, adds the part most guides skip (the taker fee), shows with a simulation why professionals bet a fraction of Kelly, and ends with a short Python function. It complements our Polymarket fees guide and the trading bot guide.

Kelly in one paragraph

The Kelly criterion picks the fraction of your bankroll to stake that maximises the long-run growth rate of your bankroll, assuming your probability estimate is right. Bet less than Kelly and you grow more slowly. Bet more and you grow more slowly and take bigger drawdowns. At about twice Kelly, expected long-run growth falls to zero. Overbetting is worse than underbetting.

The formula for a binary contract

On Polymarket a YES share costs c (say 40¢) and pays $1 if YES happens. If you believe the true probability is p:

  • Net odds per $1 staked: b = (1 − c) / c
  • Kelly fraction: f* = (b·p − (1 − p)) / b

For a $1-payout contract this simplifies neatly to:

f* = (p − c) / (1 − c)

In words: your edge divided by the most you can win per share. If p ≤ c, Kelly says don't buy. Consider the other side instead: buying NO at price 1 − c with probability 1 − p uses the same formula.

Example. You think a market priced at 40¢ has a 50% chance. f* = (0.50 − 0.40) / 0.60 = 16.7% of bankroll. That's a lot for one bet, which is why the next two sections matter.

Adjusting for Polymarket's fee

Polymarket charges takers feeRate × p × (1 − p) per share, at the price you trade. The rate is 0.04 to 0.07 depending on category, geopolitics is free, and makers pay nothing (Polymarket fees). If you take liquidity, each share effectively costs:

c_eff = c + feeRate × c × (1 − c)

Plug c_eff into the Kelly formula in place of c. If you pay a third-party bot's per-trade fee, add that too. The effect is larger than people expect:

Market Price c Your p Fee rate Kelly ignoring fee Kelly with fee Quarter-Kelly with fee
Crypto up/down 50¢ 60% 0.07 20.0% 17.1% 4.3%
Sports 50¢ 55% 0.05 10.0% 7.7% 1.9%
Politics 30¢ 35% 0.04 7.1% 6.0% 1.5%
Crypto longshot 10¢ 15% 0.07 5.6% 4.9% 1.2%
Geopolitics (free) 30¢ 35% 0 7.1% 7.1% 1.8%

(Our calculations from the formulas above. Fractions are of total bankroll, including the fee.) In these examples the fee cuts the "correct" bet by roughly 10–25%, and on a thinner edge it turns a bet into a pass. Resting limit orders avoid the Polymarket fee, so for patient strategies, plain c is the right input.

Slippage works the same way. Use the price you'll actually get (from estimate_market_price in the Python SDK), not the midpoint.

Why everyone uses fractional Kelly

Full Kelly assumes you know p exactly. You don't. Your 55% might really be 52%. Kelly is also brutally volatile even when your estimate is right. A standard approximation (for small edges, the growth rate is roughly quadratic in bet size) says that betting a fraction k of Kelly earns about k × (2 − k) of the maximum growth rate:

Fraction of Kelly Share of maximum growth rate (approx.)
2× about 0%
1× (full) 100%
½ about 75%
¼ about 44%

Half-Kelly gives up roughly a quarter of the growth for much smoother results. The real argument for going smaller is estimation error, so we simulated it.

A simulation: what happens when your edge is smaller than you think

Setup (hypothetical, illustrative only): 300 sequential independent sports bets at 50¢ with a 0.05 taker fee. The trader believes p = 55% and sizes from that, so full Kelly with the fee is 7.7% of bankroll. We ran 20,000 paths for each sizing rule, once with the true probability really 55% and once with it actually 52%.

Sizing True p = 55%: median ending bankroll Chance of a 50% drawdown at some point True p = 52%: median ending bankroll Chance of a 50% drawdown
2× Kelly 0.98× about 100% n/a n/a
Full Kelly 2.33× 92% 0.60× 98%
½ Kelly 1.89× 25% 0.96× 55%
¼ Kelly 1.45× 0.5% 1.03× 5%

(Our Monte Carlo, seed fixed. This illustrates a sizing rule, not a forecast or the results of any product.)

Three lessons:

  1. Even when you're right, full Kelly almost always takes you through a 50% drawdown. Few people can watch that happen and keep following the rule.
  2. When you're slightly wrong, full Kelly loses money while quarter-Kelly still grows, even though the real edge was still positive.
  3. 2× Kelly goes nowhere, with certain heavy drawdowns along the way.

That's why systematic traders, and most bots including Ghost Trader, size with fractional Kelly plus hard caps, not raw Kelly.

Correlated markets: size the cluster, not the bet

Kelly as written assumes one bet at a time. Real portfolios hold many positions at once, and on Polymarket they're often correlated: five markets on the same election, a "BTC up" in the 5-, 15- and 60-minute windows, three sports props on one game. Treating them as independent overbets the shared outcome.

Practical rules:

  • Group positions by underlying driver (same event, same asset, same time window) and apply your Kelly fraction to the group.
  • Cap exposure per event and per category, regardless of what the formula says.
  • Cap total open positions. A simple max-open-positions limit, as in Ghost Trader's risk settings, bounds correlated blow-ups.
  • Use one bankroll number. Size from cash plus the current value of open positions (equity), not from cash alone. Otherwise each new bet thinks the bankroll is smaller, or bigger, than it is.

Where does p come from?

Kelly is only as good as your probability. Common sources:

  • Your own model or research: calibrate it on past markets before trusting it.
  • A price signal: for example, the gap between a crypto exchange price and a short-term up/down market (see crypto up/down markets).
  • A copied wallet's record: estimate the leader's historical edge in that category, after costs, then shrink it toward zero, because past results overstate future ones (see copy trading).

Whatever the source, shrink your estimate toward the market price before sizing. Markets are usually close to right, and your edge is usually smaller than it looks.

Hard limits that sit on top of Kelly

Kelly tells you a fraction. A robust system also enforces:

  1. Minimum trade size: every Polymarket market has a minimum order size, and smaller orders are rejected (market details). Below it, skip.
  2. Maximum trade size: protects against model errors and thin books.
  3. Liquidity cap: never take more than a set share of visible depth at your price.
  4. Daily-loss kill switch: stop trading for the day after a set loss.
  5. Max drawdown stop: stop entirely after a set drop from peak equity and review.

These are the controls Ghost Trader exposes: min and max trade size, an open-position cap, fractional Kelly, a daily-loss kill switch and drawdown alerts.

A fee-aware Kelly function in Python

def kelly_fraction(p: float, price: float, fee_rate: float = 0.0,
                   taker: bool = True, extra_cost: float = 0.0,
                   fraction: float = 0.25, cap: float = 0.05) -> float:
    """Bankroll fraction to spend buying one outcome at `price`.

    p          your probability that the outcome wins (0-1)
    price      the price you will actually pay per share (0-1)
    fee_rate   Polymarket category rate (e.g. 0.07 crypto, 0.05 sports, 0.04 politics)
    taker      True if the order crosses the spread (makers pay no Polymarket fee)
    extra_cost per-share slippage or third-party fee, in dollars
    fraction   fractional Kelly multiplier (0.25 = quarter Kelly)
    cap        hard maximum fraction of bankroll per trade
    """
    c = price + (fee_rate * price * (1 - price) if taker else 0.0) + extra_cost
    if not 0 < c < 1 or p <= c:
        return 0.0
    full = (p - c) / (1 - c)
    return min(full * fraction, cap)


# Example: crypto up/down at 50c, you estimate 60%
print(kelly_fraction(0.60, 0.50, fee_rate=0.07))   # about 0.043, i.e. 4.3% of bankroll

FAQ

Is Kelly too aggressive for prediction markets? Full Kelly usually is, because probability estimates are noisy. Quarter- to half-Kelly with hard caps is the common practical choice.

Should I use Kelly when copy trading? Yes, but base p on a conservative estimate of the leader's after-cost edge, not their headline win rate, and cap per-market exposure.

What if the Kelly fraction is below the minimum order size? Skip the trade. Rounding up to the minimum on every small edge is a form of overbetting.

Does Kelly protect me from losses? No. It manages the rate of growth and the risk of ruin under assumptions that are never fully true. Losses, sometimes large ones, are still part of it.


Ghost Trader sizes every trade with fractional Kelly on the post-fee edge, then enforces min and max trade size, an open-position cap, a daily-loss kill switch and drawdown alerts, all from your own wallet on your own machine. $199/month, paper mode included. See pricing.

Not financial advice. Simulations are illustrative and don't predict real results. Trading can lose money. Ghost Trader isn't available where Polymarket restricts trading, including the US, and is not affiliated with Polymarket.

  • risk management
  • strategy
  • guides

This article is general information, not financial advice. Prediction markets are risky, and Polymarket isn’t available everywhere.

$199/mocancel anytime
Request access