Edge-1 dossier — Favorite–Longshot bias (take the favorite / short the longshot)
Verdict: FALSIFIED (out-of-sample, net of costs, vs the favorite null). Ticket: T-0015 (powered re-run of T-0009). Script: research/02_favorite_longshot.py. Date: 2026-07-24.
> History: provisional FALSIFIED on the Apr 18–29 window (~485k bets, > TEST ≈ 1 day; T-0009) → powered FALSIFIED on the FULL 53-day window > (29.6M bets, real 15-day June OOS; T-0015). The powered run confirms and > strengthens the falsification: the sign no longer flips across cuts, and the > provisional "adversarial longshot" mirage is gone.
> Honest > profitable. The gross calibration signal is real but ~2–4× too small > to survive Polymarket taker costs; net of costs it loses in every price band, > out of sample, and it does not beat simply buying every favorite.
---
Hypothesis
From the iter-002 calibration diagnostic: Polymarket over-prices mid-priced longshots in sports — tokens in a mid price band win *less* often than their price implies. If the longshot is overpriced, its complementary favorite is under-priced, so systematically taking the favorite side (mechanically: buying the favorite outcome, which is the same position as shorting the longshot) should carry a positive edge OOS, net of costs.
Method (powered — T-0015)
- Universe:
build_resolved_bets_full(use_cache=True)→ 29,651,775 resolved sports bets across 83,019 markets, span 2026-04-18 → 06-11 (53 days). One row per real fill on a resolved sports market, gross realized PnL. - Split:
calendar_split(cut on calendar date, boundary-safe, leak-free) — TRAIN = Apr18→May26 (17.3M selected fills), TEST = May27→Jun11, a genuine 15-day June OOS era (8.8M selected fills). Not the ~1-day tail a row-fraction cut produced provisionally. - Position transform: every fill re-expressed as our BUY of the favorite outcome (side priced ≥ 0.5) at
q = max(p, 1−p). This is the mechanically-real "short the longshot," and it bounds every bet's return to ≈[−1, +1] — the tail-cap the ticket asks for, for free. - Band derived FROM TRAIN ONLY: bucket favorite price
qin 0.05 steps on TRAIN; band = contiguous span of buckets whose TRAIN gross favorite-buy return is > 0. TEST never read during derivation. Derived band: q ∈ [0.50, 0.95). - Costs:
polymarket_costs, sports defaultsfee_rate=0.05,spread=0.02. - Null (standard control): the FAVORITE null — buy *every* favorite. On this favorite-only frame the favorite null coincides exactly with the uniform null, so "beats naive" == "band-selection beats buying every favorite." Verdict = TEST
edge_vs_naive> 0 and TESTmean_net > 0(honest profitability). - vbt.pro
2026.4.7simulates the TEST book (hourly equal-weight) for Sharpe + total return + cost-adjusted equity (gate L1.2).
TRAIN calibration scan (favorite-price buckets, powered)
The signal is real but *small and cost-swamped*: gross edge is ~+1% in the mid band, but taker cost at those prices is ~3%, so mean_net is negative in every bucket:
| favorite price | N | win_rate | mean_gross | mean_net |
|---|---|---|---|---|
| 0.50–0.55 | 3,101,799 | 0.530 | +0.0143 | −0.0287 |
| 0.55–0.60 | 2,655,286 | 0.577 | +0.0112 | −0.0278 |
| 0.60–0.65 | 2,543,768 | 0.608 | −0.0214 | −0.0565 |
| 0.65–0.70 | 2,067,306 | 0.673 | +0.0030 | −0.0284 |
| 0.70–0.75 | 1,711,005 | 0.729 | +0.0132 | −0.0147 |
| 0.75–0.80 | 1,571,871 | 0.778 | +0.0092 | −0.0152 |
| 0.80–0.85 | 1,335,907 | 0.800 | −0.0257 | −0.0468 |
| 0.85–0.90 | 1,154,256 | 0.882 | +0.0123 | −0.0056 |
| 0.90–0.95 | 1,129,432 | 0.925 | +0.0055 | −0.0094 |
| 0.95–1.00 | 2,425,620 | 0.987 | −0.0007 | −0.0115 |
TRAIN vs TEST — the verdict table
Edge-1: take the favorite in band [0.50, 0.95) vs buy-every-favorite (favorite null)
| split | N | gross | net | sharpe | naive_net | edge_vs_naive |
|---|---|---|---|---|---|---|
| TRAIN | 17,270,630 | +0.0028 | −0.0286 | −0.0394 | −0.0265 | −0.0021 |
| TEST | 8,844,141 | −0.0114 | −0.0431 | −0.0588 | −0.0399 | −0.0032 |
TRAIN edge is already negative (−0.0021) and TEST stays negative (−0.0032); TEST net return is deeply negative (−0.043). Band-selection does not beat buying every favorite, and the strategy is not profitable after costs → FALSIFIED. Unlike the provisional run, there is no TRAIN→TEST sign reversal — the falsification is stable across the real OOS era.
Supporting / adversarial runs (context, not the verdict)
- Adversarial — buy the longshot in the same band: TEST
edge_vs_naive−0.0075 (vs uniform null). The provisional run's apparent "+0.28 longshot edge" was a single-day regime artifact; on the powered window it is gone — buying the longshot does not work either. - Robustness — one position per market (de-clustered fills): TRAIN
edge_vs_naive−0.0146, TEST −0.0095 (net −0.0386, N=14,853). Same negative sign as the all-fills run on both splits — the provisional sign-instability between fill-weighting and market-weighting has resolved.
Tail-variance honesty
| unit | TEST N | median_net | mean_net | min | max | top-1% |PnL| share |
|---|---|---|---|---|---|---|
| all-fills | 8,844,141 | +0.2275 | −0.0431 | −1.045 | +0.955 | 0.016 |
| per-market | 14,853 | +0.2275 | −0.0386 | −1.045 | +0.955 | 0.016 |
- Median (+0.23) vs mean (−0.04) is the whole story of favorites: they win *often* but pay *little*, and the occasional −100% loss plus costs dominate the mean. Net expectation is negative.
- Returns are bounded to ≈[−1, +1] by the favorite-buy construction; the top-1% of bets carry only 1.6% of absolute PnL — no handful of bets fabricates (or could hide) the result. Sizing = equal-notional per bet.
vbt.pro simulation (gate L1.2)
vbt.pro 2026.4.7, hourly equal-weight book over the TEST window (376 bars across the ~15-day June era, cost-adjusted): total_return −100.0%, Sharpe(1h-ann) −32.2, max_drawdown −100.0%. Unambiguously negative and consistent with the harness verdict (the compounding book is driven to zero by a persistent ~−4%/bar mean net). Pandas equity curve emitted alongside as fallback.
Verdict
FALSIFIED (powered). "Take the favorite / short the mid-priced longshot" does not beat buying every favorite out of sample and is not profitable net of costs. The gross favorite-longshot mispricing exists (~+1% for mid favorites) but is smaller than Polymarket taker costs (~3%). On the powered 15-day OOS the result is now robust: negative on TRAIN and TEST, negative under both fill-weighting and market-weighting, and the provisional longshot mirage does not reproduce.
Caveats
- Cost sensitivity is the whole story. The gross edge is real but ~2–4× smaller than the ~3% taker cost. A materially cheaper execution path (maker rebates, tighter spreads) is the only thing that could revive this — a cost sensitivity sweep is the natural follow-up before fully closing the book.
- Fill-clustering: all-fills weights high-volume markets heavily; the de-clustered per-market run now agrees in sign (both negative), removing the provisional concern.
by="market"split remains the strictest unit. - Return convention: the favorite-buy transform uses the standard BUY payoff (
payoff/q − 1). Both strategy and null pay the identical cost model, soedge_vs_naiveis apples-to-apples. - Single 53-day macro window. Apr–Jun 2026 is still one macro regime; a multi-quarter replication would harden the verdict further, but the 15-day OOS era already gives real (not ~1-day) power.
Reproduce
uv run --extra backtest python research/02_favorite_longshot.py
uv run pytest -q → green.