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
Trigger

$25K+ BUY at price 0.20–0.30 (the cheap band that survived live narrowing in waves 29 + 31).

Math
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 resolution
Resolution

Held 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.

Backtest cohort (n=135K): cheap-band trades carried asymmetric expected value historically. Live verdict is still early — see /transparency for the running hit rate by sub-band.

Fresh Whale

ACTIVE
Trigger

Wallet created on Polygon within the last 7 days bets ≥ $25K at price 0.20–0.30, with fewer than 5 prior trades on Polymarket.

Hypothesis

Fresh wallet + sized bet in the cheap band = informed capital acting on a specific thesis. The wallet was likely created to place this trade.

Prediction

+4pp continuation within 12h. Most fresh-whale signals also qualify as cheap_conviction — they're complementary.

Whale Cluster

LOW ACTIVITY
Trigger

3+ 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.

Math
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.05
Prediction

5pp continuation within 6h.

Silent post-pivot. The 5% PnL/$ wallet-reputation requirement excludes most of the 10K+ wallets we track, so clusters where at least one member clears the bar are very rare. The gate needs loosening or replacing with a U-shape cohort filter — pending design work.

Arbitrage

ACTIVE
Trigger

Cross-venue spread between Polymarket and Kalshi exceeds fees + slippage on the same outcome.

Math
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 minutes
Edge is arithmetic. Real the moment prices disagree, no backtesting needed.

Volume Anomaly

LOW ACTIVITY
Trigger

5-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.

Hypothesis

Concentrated BUY-side activity at cheap prices is news being priced in. We follow the dominant side.

Silent post-pivot — the cheap-band price filter that aligned this with cheap_conviction also made the 5× volume burst threshold nearly impossible to clear. Sample size too small to grade.

Copy Trade

LOW ACTIVITY
Trigger

2+ of the platform's top-30 wallets (by realized PnL/$) hit the same market + outcome + side within 30 minutes.

Reputation criteria
Top wallets =
  pnl_per_dollar >= 0.10
  AND resolved_volume_usd >= $50K
  ORDER BY pnl_per_dollar DESC
  LIMIT 30

Refreshed every 30 minutes.
Hypothesis

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 DISABLED

Original 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 DISABLED

Triggered 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 DISABLED

Continuation 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:

Resolution-based (cheap_conviction)

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.

Horizon-based (others)

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.

Want the live numbers? See the track record, or the paper portfolio leaderboard.