← Back to blog

Kelly Criterion for Prediction Markets: Formula and Limits

By ZenHodl. Dataset documentation, research and model evaluations are linked in the article. A separate filtered ledger of bot-attributed trades, including losses and its admission rules, is public at /results.

The Kelly criterion computes a stake fraction from a probability and a payoff. It does not tell you whether your probability is correct, whether an order will fill, or whether the strategy will make money.

For a binary contract that costs c and pays $1 when it wins, the simplified fraction is (p - c) / (1 - c), where p is the assumed win probability. The examples below are hypothetical arithmetic, not ZenHodl trading results or recommended allocations.

What the formula optimizes

Kelly's original paper concerns long-run logarithmic wealth growth. Applying its result requires a specified payoff distribution. For this one-contract illustration, assume a fixed probability, repeatable opportunities, a stake you can execute at the stated cost, and no omitted transaction costs.

With net win odds b and loss probability q = 1 - p:

f* = (p × b - q) / b
b = (1 - c) / c
f* = (p - c) / (1 - c)

The fraction is cash committed divided by bankroll, not the number of contracts divided by bankroll. If p <= c, this long-only version returns zero. That is a conclusion under the assumed input, not an independent finding that the market is fairly priced.

A checked Python example

def kelly_fraction(probability, cost_per_contract):
    if not 0 <= probability <= 1:
        raise ValueError("Probability must be between 0 and 1")
    if not 0 < cost_per_contract < 1:
        raise ValueError("Cost must be strictly between 0 and 1")
    return max(0.0, (probability - cost_per_contract) /
               (1 - cost_per_contract))

full = kelly_fraction(0.70, 0.58)
print(f"Full fraction: {full:.1%}")
print(f"Quarter fraction: {full * 0.25:.1%}")

# Hypothetical constant 3c acquisition cost, charged per contract.
with_cost = kelly_fraction(0.70, 0.58 + 0.03)
print(f"Full fraction with cost: {with_cost:.1%}")
print(f"Quarter fraction with cost: {with_cost * 0.25:.1%}")

Expected output:

Full fraction: 28.6%
Quarter fraction: 7.1%
Full fraction with cost: 23.1%
Quarter fraction with cost: 5.8%

The 3c cost is an explicit scenario, not a measured venue fee or slippage estimate. Real fees can depend on market, price, order type and when they are charged. Costs charged only on one outcome need that outcome's payoff modeled separately; they should not automatically be treated as a flat purchase surcharge.

Fractional Kelly changes exposure, not input quality

Half-Kelly and quarter-Kelly multiply the calculated fraction by 0.5 and 0.25. They reduce the amount exposed to the same payoff. They do not provide a universal drawdown ceiling or retain a fixed percentage of full-Kelly growth.

For the hypothetical 28.6% full fraction above, four consecutive losses leave approximately (1 - 0.285714) ** 4 = 26.0% of starting bankroll if the same fraction is recomputed each time. The corresponding 7.1% quarter fraction leaves approximately 74.3%. These are path calculations, not forecasts of how often either losing streak occurs.

If the true probability were 58% rather than the assumed 70%, this 58c contract would have no gross edge before fees. Multiplying a mistaken Kelly output by one quarter would not create one.

Calibration is not a safety certificate

A calibration curve asks whether stated probabilities match observed outcome frequencies. ECE summarizes bin-level discrepancies; it is not a confidence interval for each prediction and is not a bound such as “every 70% prediction is accurate within 4.39 points.”

Inspect the uncertainty and calibration of the population on which you would act, alongside price and cost assumptions. A calibrated model can simply agree with the market. See our calibration guide and published CLV correction for why a favorable metric alone does not establish a profitable strategy.

Multiple positions need a portfolio model

The single-contract formula does not model correlated contracts, shared game outcomes, simultaneous exposure, liquidity constraints or resolution timing. Dividing each position by the square root of the number open is a heuristic, not a general solution for correlated Kelly sizing.

Likewise, a fixed trade count does not prove an edge. Evaluate a predeclared strategy on separate data, with dependence, costs, fills, selection and drawdowns included. This article does not verify a current ZenHodl bot's sizing policy, account balance, gate thresholds or loss limits.

Use the calculator to inspect assumptions

The free Kelly calculator is useful for comparing arithmetic inputs. Keep the estimated probability, cost convention and contract payoff visible. The backtesting guide explains why quoted prices and simulated orders need separate treatment.

Correction, October 8, 2026: removed unsupported universal growth/drawdown percentages, claims that quarter-Kelly is safe at a given ECE, and unverified current bot/profit claims. The calculation here is a simplified hypothetical model, not a trading recommendation or a new live performance study.

Related reading

Get ZenHodl Weekly

Dataset releases, research notes, and public results, including corrections.

Research and dataset updates from ZenHodl.

Want the data behind this post?

Historical sports prediction-market datasets with measured coverage, documented schemas, and disclosed gaps.