Most bettors who get their hands on machine-learning probabilities still lose money. The model is not the problem. The strategy on top of it is.
This post is the playbook we use to convert calibrated probabilities into trades on prediction markets. Nothing here is exotic. All of it is the result of pruning the strategies that did not work and ruthlessly keeping the ones that did. If you have a probability source you trust — yours or one of ours — and you want to know how to actually bet with it, this is the order of operations.
Step Zero: Trust the Probability Before You Bet On It
If your probability source is not calibrated, no strategy will save you. Calibration means that when the model says 62%, the team actually wins 62 out of 100 times. You verify this with Expected Calibration Error (ECE) — a single number that summarizes how much the predicted probabilities deviate from observed frequencies.
Our threshold is ECE under 0.05. Below that, the model is safe to size positions against. Above that, the probability is misleading and Kelly sizing will over-bet — which, as the Kelly Criterion post explains, is the single most common way to go broke even with a real edge.
If you are using a third-party API, ask the provider for their ECE per sport. If they do not publish it, assume it is not calibrated and treat the probabilities as point predictions only — useful for picking sides, useless for sizing.
Step One: Compute Edge Honestly
Edge is fair probability minus market price (in cents). If the model says 62% and the market is asking 54 cents, the edge is 8 cents per share.
That definition is correct in a vacuum. In practice you have to subtract costs:
effective_edge = fair_prob - market_price - taker_fee - expected_slippage
On Polymarket, the taker fee is around 2 cents on most markets and the typical slippage is 1-3 cents depending on market depth. So an 8-cent raw edge becomes a 3-5 cent effective edge after costs. Anything under 5 cents raw is rarely worth trading.
This is why our bots all have a min_edge_c floor between 5 and 12 cents depending on sport. Below the floor, the costs eat the edge faster than the edge accrues.
Step Two: Filter With an Edge Band, Not Just a Floor
A 30-cent detected edge sounds great. It is usually a model error.
We learned this the painful way. Our tennis bot was happily entering high-edge trades for months — only to discover that ATP edges between 20 and 25 cents were running 31% win rate at -$10 P&L over 13 trades, while edges between 15 and 20 cents were running 59% WR at +$24. The high-edge bucket was full of stale model outputs from the moments when the live scoreboard had not yet caught up to a swing.
The fix was a max_edge_c ceiling. Below the floor: not enough margin. Above the ceiling: probably the model being wrong. The middle band is where real edge lives.
Every sport gets its own band. These are the floors and ceilings our bots actually run with today, read from the live config:
| Sport | Min edge | Max edge |
|---|---|---|
| NBA | 5c | 35c |
| NCAAMB | 10c | 35c |
| NCAAWB | 5c | 35c |
| NHL | 15c | 35c |
| MLB | 13c | 35c |
| NFL / CFB | 10c | 35c |
| WNBA | 5c | 35c |
| ATP / WTA tennis | 15c | 25c |
Corrected 2026-08-06. This section previously listed per-sport bands with profit figures attached — "NBA: 5-15c band, +6.2c per trade", "NHL: 15-20c band, 79% WR", an MLB "5-10c band" and a tennis band "capped at 20c". Those numbers were stale or wrong in the flattering direction. NBA's live record is −$33.90 over 43 resolved trades, with fills at −10.9c CLV and the signal population at −7.2c, both confidence intervals excluding zero — it is disabled and force-shadowed, not a +6.2c earner. The MLB floor is 13c, so a "5-10c band" is below the level at which the bot will trade at all. The tennis ceiling is 25c, not 20c. And a win rate is not an edge measurement: a 51% WR cohort in our own ledger lost $34.91. We have replaced the claims with the configuration, which is checkable.
The shape we look for is consistent — positive CLV in the middle of the band, negative on both wings — but "this band is profitable" is a hypothesis the per-sport records above do not currently support for most sports.
Step Three: Size With Quarter-Kelly, Not Full Kelly
Kelly Criterion gives you the bet size that maximizes long-term geometric growth. Full Kelly is mathematically optimal and practically suicidal — it assumes your probability is exactly correct, which it never is.
Quarter-Kelly (multiply the Kelly fraction by 0.25) is the professional standard. You give up 25% of theoretical growth to eliminate roughly 90% of the ruin risk. The full math is in the Kelly post; the short version is:
def quarter_kelly_fraction(fair_prob, market_price):
edge = fair_prob - market_price
if edge <= 0:
return 0.0
profit_per_dollar = 1.0 - market_price
return 0.25 * edge / profit_per_dollar
bankroll = 1000
fraction = quarter_kelly_fraction(0.62, 0.54) # 0.037
bet_size = bankroll * fraction # $37
If your gut says bet $200, quarter-Kelly probably says $40. Trust the math.
Step Four: Pick a Strategy Archetype
Once you have an edge and a size, you still have to pick how to be in the market. Four archetypes work on prediction markets:
Pre-game value betting. Take the model's pre-game probability, compare it to the line a few hours before tipoff, fire if the edge clears your threshold, and hold to settlement. Lowest-touch strategy. Works best for sports where the model has a stable pre-game edge — NCAAMB and NHL in our data.
In-play moneyline. Poll live game state every 5-30 seconds. The model updates its win probability as the score and time evolve. When the market overreacts to a momentum swing — a long run, a goal, a turnover — the gap between fair probability and market price widens. Buy the side the market is leaving behind. Hold to settlement. Most of our 11 production bots run this archetype.
Hold-to-settlement. Once you enter, do not exit until the contract resolves to 0 or 100. Eliminates exit-side adverse selection (you are not trying to sell on Polymarket's thin late-game books) and sidesteps the temptation to cut winners early. This is our default. We have tested mean-reversion exits and they consistently lose to hold-to-settlement on the same entries.
Two-sided sync (hedge accumulator). Buy BOTH sides of a contract when both have dipped from a trailing high within a short window. The arithmetic underneath is sound: one YES plus one NO of the same binary contract pays exactly $1 at resolution, so a pair acquired for less than $1 locks the difference whichever way the game goes. What that arithmetic does not cover is execution, and execution is where this strategy actually lives or dies. Specialty strategy, and for us a research one. See the correction below before you build it.
Correction — 6 August 2026
This section previously claimed that a pair cost under 100 cents means "you are guaranteed profit at resolution regardless of outcome", and that our hedge accumulator bot "earns $7-13 per session this way on NCAAMB". Both claims were wrong and are retracted here rather than quietly deleted.
The $7-13 figure was never a live result. It was lifted from a docstring in the bot's own source file, where it is labelled as a 28-day backtest ("backtested: 100% WR, $7-13/day on NCAAMB"), and then published as if the bot were earning it. A backtest number presented as live earnings is the worst version of the mistake this whole post warns about.
Here is what the bot's own session logs record, across 98 logged sessions in February 2026 on Polymarket, mostly NCAAMB and NBA. A caveat we have to state plainly: these sessions are a mix of live and simulated execution, and the logs do not let us separate them cleanly. The runner defaults to shadow mode, execution mode was only recorded incidentally, and by that record just 7 sessions are provably live, 1 provably shadow, and 90 carry no mode at all — with at least one of those 90 provably shadow from the events it emits. Read the counts below as "what the strategy does", not as money that changed hands:
count synchronised dips detected 1,326 pairs actually executed 132 attempts that failed 1,252 Those two columns do not come from the same code path, so the ratio between them flatters the strategy: detections are counted only on the sync path, while executions are also counted from the shadow simulator and a separate resting-order path (which is why the last two rows sum to more than the first). Comparing like with like on the sync path alone, 72 completed pairs against 1,329 detections is a 5.4% completion rate — about half the figure the raw columns suggest. The logged failure modes: 1,098 events where the pair cost recovered back above $1.00 before both legs could fill (the window is usually seconds), 32 aborted as stale, and 150 single-leg fills where one side bought and the other was rejected. A single-leg fill is not a hedge. It is a naked directional position, and unwinding it is its own problem: 138 flatten attempts logged errors of their own.
Total gross locked margin across every one of those sessions was $156.79. 72 of the 98 sessions produced no completed pair at all. The median session that did complete one locked $3.25 gross.
"Gross" is load-bearing there. It is the pair-cost arithmetic before the losses from unwinding one-legged fills, which the logs do not let us net out cleanly. We do not have an honest net figure for this strategy, so we are not going to publish one. These sessions were logged by a separate research process and are not part of our main trade ledger, which stands at -$217.75 over 2,214 resolved live trades. Neither NCAAMB nor NBA trades live money for us today; both are force-shadowed.
Fees are the other half of the story. At a taker fee of roughly 2 cents per leg, as described in Step One above, a thin pair is eaten before it settles, which is why the bot refuses to fire below 6 cents of locked margin in the first place.
The honest version of the claim: the pair-sum trade is real arithmetic, it completes about 5% of the time it triggers, and "guaranteed" is a word that belongs to the maths rather than to the fill.
Pick one. Master it. Then add a second.
Step Five: Risk Controls That Compound
Edge filters and position sizing are not enough. You also need controls that limit how bad a bad day can get.
Drawdown-aware sizing. When session P&L is negative, scale position sizes down. Recovery rate stays the same; the size of the hole you can dig stays bounded. We use a piecewise scaler — full size above $0, 0.75x below -$10, 0.5x below -$25.
Circuit breaker. When rolling 30-day ROI for a sport drops below -5%, automatically disable the sport. Re-enable when it recovers above 0%. Self-healing. The effect is visible in our public results.
Daily kill-switch. Hard cutoff if a single session loses more than a defined amount. Pairs with the circuit breaker — one is intra-session, the other is multi-day.
CLV monitoring. Closing Line Value is the leading indicator that win rate confirms in retrospect. If your 7-day CLV drops below your 30-day CLV by more than 2 cents, your model is degrading. Retrain or recalibrate before P&L confirms it.
Step Six: Stop Manual Where Bots Can Run
Once a strategy works, automate it. Manual execution introduces three failure modes:
You miss signals. Markets move in milliseconds; humans react in seconds. By the time you click, the price is gone or worse.
You override. The single biggest source of bot underperformance among our trial users is humans flipping the wrong switch — closing winners early, doubling down on losers, skipping signals because they "have a bad feeling." The strategy is the strategy. The whole point of writing it down was to remove the discretion.
You burn out. Watching markets for hours per day is unsustainable. The bots that run 24/7 do not get tired, do not eat dinner, do not need to sleep.
We sell a $49 bot course that walks through this exact pipeline if you want to build your own.
What Does Not Work
We have killed more strategies than we run. The graveyard:
Mean-reversion taker bots. Buy dips, sell spikes. Negative EV on prediction markets because the moves are usually information-driven, not noise.
Compression sniping. Wait for the spread to compress, fade the breakout. Adverse selection. The traders compressing the spread know more than you do.
Double-down on losers. Martingale variants are catastrophe machines. Always.
SPREAD/TOTAL taker. Mean-reversion exits do not work on SPREAD/TOTAL because the underlying score is permanent — a 10-point swing is not noise. Fix: hold-to-settlement on SPREAD only (excluded TOTAL after backtest showed -5.2c per trade on NBA).
Trading without published ECE. If you do not know your model's calibration, you are gambling with extra steps.
The Bottom Line
A calibrated probability is necessary but not sufficient. The strategy on top of it has to respect costs, cap edge bands at both ends, size with quarter-Kelly, hold to settlement, and survive bad days through circuit breakers and drawdown scalers. The strategies that survive are usually boring. The exciting ones lose money.
If you have a probability source you trust, work this checklist top to bottom. The compounding starts when the entire stack is in place — not when any single piece is perfect.
Live calibrated probabilities for 8 public API sports at zenhodl.net/v1/try. Real-time CLV monitoring at zenhodl.net/clv. Full bot course included with every API plan at zenhodl.net/pricing.