Methodology
How every signal works on ohh.bet. A 135K-trade resolution backtest motivated the cheap-band thesis; the per-detector math below is what fires the live signals, and the live data is what we narrow the band against. Three detectors that didn't survive calibration are kept here for honesty.
The thesis (two claims, kept separate)
Structural (1−P)/P math vs. informed-capital edge — different evidence bars.
We make two distinct claims about the cheap band. Conflating them is the failure mode of every "follow the whales" product we've audited, so we keep them apart here.
Claim 1: cheap-band BUYs have a structural (1−P)/P advantage
This is arithmetic. A 34% hit rate on BUYs at avg price 0.30 yields:
EV = 0.34 × (1 − 0.30)/0.30 − 0.66 × 1 = 0.34 × 2.333 − 0.66 = +13.3% per trade
That positive expectancy is true regardless of who clicks Buy. It falls out of payoff structure: cheap entries pay 3–5× when right, full loss when wrong, and the cheap band has historically resolved in the buyer's favor often enough to clear the threshold. The mirror claim — buys at price >0.60 being net-negative even at 70%+ hit rates — is the same math in reverse. This is the part of the thesis we have receipts for.
Claim 2: wallet reputation — tested and failed
The wave-34 cheap_conviction gate ( resolved_trades ≥ 10 AND pnl_per_dollar ≥ 0.05) was our operationalization of the "informed capital" claim: only fire (and only auto-trade) on cheap-band BUYs from wallets with proven historical PnL.
The wave-57 audit tested it properly — point-in-time rep, no survivorship — on every historical cheap-band BUY $25K+ in 0.20–0.30. The result, surfaced on /transparency:
A_proven (passes gate) n=11 hit_pct=9.1% net_roi=-68% B_unproven (rep, below threshold) n=26 hit_pct=53.9% net_roi=+99% C_no_rep (no prior resolved) n=11 hit_pct=45.5% net_roi=+76%
The gate was filtering AGAINST alpha. Proven wallets — most of whom built their PnL on different bet types (favorites at 0.7+ or knowledge-specific markets) — bring no edge to cheap-band BUYs and often bring negative edge when they bet outside their domain. The cheap-band positive expectancy comes from the structural (1−P)/P math regardless of who clicks Buy.
Wave 61 dropped the gate. The cheap_conviction detector now fires on every $25K+ BUY in [0.20, 0.30] regardless of wallet rep. Paper portfolios A and B no longer filter by allowed_gate_reasons. Wallet rep is captured in detector_context as descriptive metadata for display only. Full receipt at the rep-alpha audit.
The wave-62 follow-up: the U-shape
Re-running the audit with six rep tiers (instead of binary A/B/C) exposed structure the headline was hiding. Cheap-band hit rate is non-monotonic in prior PnL/$:
Rep tier (prior PnL/$) | n | hit % | 95% CI no_rep | 11 | 45.5% | [21.3, 72.0] known_loser (<0%) | 18 | 44.4% | [24.6, 66.3] mild_winner (0-5%) | 4 | 75.0% | [30.1, 95.4] ← sweet spot good (5-20%) [wave-34 gate band] | 4 | 25.0% | [4.6, 69.9] high (20-50%) | 2 | 0.0% | [0, 65.8] elite (>=50%) | 8 | 37.5% | [13.7, 69.4] Wave-67b tightened these numbers: backfilled markets_cache.resolved_at from signal_outcomes (1,195 markets) replacing end_date + 24h heuristic on the rows the audit reads. U-shape persists; mild_winner shifted 86% -> 75% as some wallets re-classified into lower tiers.
The wave-34 threshold landed on the worst slice — wallets with a comfortable winning record entering a band they don't usually trade. Wave 63 added a forward-test paper portfolio (D) that auto- trades only the mild_winner tier. Wave 64.3 backfilledgateReason on historical fires so live cohort attribution on /transparency is comparable across tiers — and the U-shape is replicating in paper PnL with each new closed position. The audit's mild_winner prediction was 75% on n=4 (Wilson CI [30%, 95%]); see the transparency tables for the live forward-confirmed win rate, realized PnL, and current sample size.
Live fire badges on /cheap-conviction tag every signal with its trigger cohort so users can mentally filter at the moment of decision.
Live narrowing of the band
Live data narrowed the band twice. Wave 29 killed 0.30–0.40 after it hit 17.6% / −16pp on n=20. Wave 31 killed 0.05–0.20 after it hit 0% / −17pp on n=2 with the longshot sample trending the same direction. Current live band is 0.20–0.30.
Every detector below either targets that cheap-band directly or has been disabled because calibration showed it doesn't have edge. Every fire is graded against actual market resolution where applicable.
Active signal types
Cheap Conviction
FLAGSHIP$25K+ BUY at price 0.20–0.30 (the cheap band that survived live narrowing in waves 29 + 31).
MIN_SIZE_USD = 25_000
MIN_PRICE = 0.20 // wave 31: 0.05-0.20 had 0/2 hit / -17pp avg
MAX_PRICE = 0.30 // wave 29: 0.30-0.40 had 17.6% hit / -16pp avg
Fire when side = BUY AND sizeUsd >= MIN_SIZE_USD
AND MIN_PRICE <= price <= MAX_PRICE
predicted_move_pp = round((1 − price) × 100)
// = the asymmetric payoff if right
// e.g. buy at 0.25 → predicted +75pp
horizon = until market resolutionHeld to actual market resolution (yes_price → 0.99 or 0.01). Realized PnL per $: (1−P)/P if right, −1 if wrong. Fees deducted at entry. Markets that stall >7 days past their end_date without converging get a directional fallback grade against the current price.
Fresh Whale
ACTIVEWallet created on Polygon within the last 7 days bets ≥ $25K at price 0.20–0.30, with fewer than 5 prior trades on Polymarket.
Fresh wallet + sized bet in the cheap band = informed capital acting on a specific thesis. The wallet was likely created to place this trade.
+4pp continuation within 12h. Most fresh-whale signals also qualify as cheap_conviction — they're complementary.
Whale Cluster
LOW ACTIVITY3+ distinct wallets buy the same market + outcome + side within 5 minutes, aggregating ≥ $100K, all in the 0.20–0.30 cheap band. At least one must have positive realized PnL/$ on prior resolved markets.
Buffer: ZSET[(market, outcome, side)] keyed by wallet
score = trade timestamp
Window: 5 min rolling (ZREMRANGEBYSCORE)
Fire when |distinct wallets| ≥ 3
AND Σ usd >= $100K
AND any wallet has pnl_per_dollar ≥ 0.055pp continuation within 6h.
Arbitrage
ACTIVECross-venue spread between Polymarket and Kalshi exceeds fees + slippage on the same outcome.
net_edge_pp = |poly_price − kalshi_price| × 100
− 4 (fees, both venues)
− 1 (slippage estimate)
Fire when net_edge_pp ≥ 0.5
predicted_move_pp = 0 (instant edge, not directional)
horizon = 30 minutesVolume Anomaly
LOW ACTIVITY5-min whale volume on a market hits 5×+ its 24h baseline, with one (outcome, BUY) bucket holding ≥70% of the burst, in the 0.20–0.30 price band.
Concentrated BUY-side activity at cheap prices is news being priced in. We follow the dominant side.
Copy Trade
LOW ACTIVITY2+ of the platform's top-30 wallets (by realized PnL/$) hit the same market + outcome + side within 30 minutes.
Top wallets = pnl_per_dollar >= 0.10 AND resolved_volume_usd >= $50K ORDER BY pnl_per_dollar DESC LIMIT 30 Refreshed every 30 minutes.
Multiple proven traders converging in real time = an informational moment worth following.
Retired signals
Calibration showed they don't have edge — kept on this page for honesty. All three were removed from the worker pipeline in wave 64.
Smart Money
PUBLISHING DISABLEDOriginal thesis: when money-weighted holder consensus disagrees with headcount consensus by ≥10pp, follow the money. Calibration cohort of 5,420 signals showed every divergence band yields negative or near-zero expected move — the "follow the money" thesis is empirically wrong on Polymarket.
Divergence | n | avg move | hit % 10–15 | 2019 | −2.80pp | 24.5% 15–20 | 1209 | −0.21pp | 28.1% 20–30 | 1234 | −1.39pp | 23.4% 30+ | 984 | +0.21pp | 7.0%
Publishing was disabled in wave 23. The worker continued computing consensus snapshots until wave 64, when the entire detector was removed — its only downstream consumers (the dead reversal + momentum detectors) were retired in the same wave. smart_money_consensus is still readable via the admin endpoint if anyone needs it.
Reversal
PUBLISHING DISABLEDTriggered when 6h price momentum and holder momentum disagreed in direction with combined magnitude ≥12pp. Calibration showed avg actual move ≈ +2.13pp on the active band — directionally correct but well below the 1.5pp predicted threshold. Publishing disabled wave 23, detector removed in wave 64 along with smart_money.
Momentum
PUBLISHING DISABLEDContinuation signal — fired when 6h price + holder momentum agreed in sign, both ≥4pp. Sample size never accumulated enough resolutions to calibrate cleanly. Publishing disabled wave 23, detector removed in wave 64.
Resolution & grading
How a fired signal becomes a hit or a miss
Two grading paths depending on signal type:
The resolver picks up the signal once the underlying market has converged (yes_price ≥ 0.99 or ≤ 0.01) and writes the realized outcome. Grade: actualMovePp ≥ predictedMovePp becomes hit if the market resolved in the side we bet on.
After fired_at + horizon_hours elapses, the resolver fetches the price near that timestamp from CLOB/prices-history, falling back to the currentmarkets_cache price for resolved markets. Same hit-test against predicted_move_pp.
Trade sizing (Kelly)
Quarter-Kelly with caps so a single losing trade doesn't crater the bankroll
kelly_fraction = min(0.25, edge / (edge + 0.5))
position_size = min(kelly_fraction × bankroll,
bankroll × max_position_pct)Each portfolio sets its own max_position_pct (5–10%) and overall risk caps (max open notional, max single-market exposure, max drawdown auto-pause, per-position stop-loss). See the public strategies leaderboard for the live numbers.
Fees
200 bps, round-trip
Polymarket charges roughly 2% on exits. Every PnL number on this site subtracts 200 bps for fees before showing the net. If you hold to resolution and win, the fee doesn't apply, but we treat every trade as a round-trip to stay conservative — the transparency page replays every signal at 200 bps to keep us honest.