Position Sizing for Polymarket Bots: Kelly vs. Fixed Fractional
Most writeups on trading bots - including my own last piece - focus on getting the edge calculation right and executing before the price moves. Almost none of them cover what happens after: how much to actually bet once you’ve decided a trade is worth taking. Get this step wrong and a correctly identified edge can still lose you money over time. The naive approach: fixed sizing The simplest method is to size every position the same - a fixed dollar amount or a fixed percentage of your bankroll, regardless of how large the edge is. It’s easy to implement and easy to reason about. It’s also leaving money on the table on your best opportunities and overexposing you on your weakest ones, since a 2% edge and a 15% edge get treated identically. Kelly Criterion: sizing by edge and odds The Kelly Criterion sizes each bet as a function of your edge and the odds being offered, rather than treating every trade the same. The formula, adapted for a binary prediction market:
def kelly_fraction(my_prob, market_price): “”“ my_prob: your estimated probability of YES market_price: current market price (implied probability) Returns the fraction of bankroll to allocate “”“ b = (1 - market_price) / market_price # odds received q = 1 - my_prob f = my_prob - (q / b) return max(f, 0) # never bet negative
In theory, full Kelly maximizes long-term bankroll growth. In practice, on prediction markets specifically, full Kelly is dangerous for a reason that doesn't show up in the textbook version of the formula: your probability estimate has its own error bars, and Kelly sizing amplifies whatever confidence you feed it. If your model is even slightly overconfident, full Kelly will oversize positions and the variance will hurt more than the formula suggests.
What I actually run: fractional Kelly In production, I size at roughly 25-50% of full Kelly, not full Kelly. This trades some theoretical growth rate for meaningfully lower variance - which matters more in practice than the math suggests, because your edge estimate is a model output, not a certainty. A half-Kelly position sized against a slightly wrong probability estimate is recoverable. A full-Kelly position sized against the same error can wipe out a disproportionate chunk of your bankroll on a single bad estimate. def sized_position(my_prob, market_price, bankroll, kelly_multiplier=0.4): full_kelly = kelly_fraction(my_prob, market_price) fraction = full_kelly * kelly_multiplier return bankroll * fraction Where this connects to execution This ties directly into the execution validation from my last post: your sizing calculation happens at decision time, using the book state at that moment. If the book drifts before your order lands, the sizing you calculated may no longer match the liquidity actually available at that price level. Worth checking that your position size doesn't exceed what's actually resting at your target price after your drift-tolerance check passes - otherwise you're sized correctly for a book that no longer exists, which is the same underlying problem as the execution timing issue, just showing up in the sizing layer instead. The practical takeaway If you’re running a bot with a working edge calculation and proper execution validation but still seeing inconsistent results, sizing is the next place to look. Fixed sizing wastes your best opportunities. Full Kelly overexposes you to model error. Fractional Kelly, tuned conservatively, tends to be the more durable choice once you’re running real capital instead of backtests. I build execution and risk infrastructure for prediction market bots and provably fair systems for casino platforms. If you're working through sizing or risk logic on something similar, happy to compare notes.
Comments
Post a Comment