---
name: League-level filtering buys little (win-rate gate, ROI gate, warmup-skip)
description: Tested adaptive per-league gating on the live Kalshi leg. Win-rate gates and pure warmups cut on noise; only a rolling-ROI gate with >=8-bet warmup helped, modestly and in-sample. Revisit at 40+ bets/league.
type: project
---

Tested 2026-06-02 on bet_history.json Kalshi leg (339 bets, 2026-04-21..05-31, flat 1-unit, point-in-time decisions, benched leagues allowed to re-enter). Baseline: 25.4% WR, +13.1% flat ROI, +44.34 net.

**Results:**
- **Raw win-rate gate (bench if rolling WR < 25%): no help.** ROI/bet rises to ~17% but total profit stays flat (best +0.82 net vs base, most negative). Reason: 25% is the strategy's NATURAL win rate (it bets longshots), so a "<25%" gate cuts on ordinary variance and discards long-odds winners. **Win rate is the wrong metric for this longshot strategy.**
- **Rolling-ROI gate (bench when league avg net < 0): modest help, but only with warmup >=8.** Best ~+8 net vs base (window 10, thresh>=0, warmup 8 -> +19.3% ROI, +52.71 net). Warmup 5 backfires (-6 to -13) — benches on 1-2 noisy results and misses recoveries.
- **Pure warmup-skip (skip first K per league, bet rest): actively hurts.** Monotonic profit loss; K=10 skips 204/339 bets (60%), net halves to +23 (-21 vs base). Early-league bets are NOT worse (WR flat ~25% at every K) — warmup only discards good bets. The warmup that helped the ROI gate was a NOISE GUARD on the filter, not evidence early bets are bad.

**Why the ceiling is low:** 8 hindsight net-negative leagues (E0 -14, G1 -8, USL -8, T1, N1, BSA, E1, B1) total -51.86; perfect-foresight removal would >2x profit, but adaptive gating only recovers ~16% (~+8) because by the time a league PROVES negative the damage is done. League gating is inherently reactive.

**Data is too thin:** 22 leagues averaging ~15 bets each (max 37); a 10-bet warmup leaves 6/22 leagues never tradeable.

**Compounded-Kelly follow-up (same session, correct binary Kelly f = (p-ask)/(1-ask); an earlier resim used a buggy numerator (p*odds-(1-p)) that 6x-overstaked and printed a bogus +368% — user caught it).** Re-sim baseline = $1,496.81 (+49.7%), in line with the live ~$1,368 tracker.
- **Rolling-ROI gate DOES lift the per-bet GROWTH rate** (count-independent): baseline +0.1194%/bet -> win10/warm8 +0.1427%/bet (~+20%). So benching leagues while their rolling net<0 genuinely improves bet QUALITY (unlike the warmup, which never moved growth).
- **But terminal wealth is a wash:** win10/warm8 = $1,473.64 (+47.4%) vs baseline $1,496.81 — slightly LOWER, because ~20% fewer bets cancels the ~20% higher per-bet growth. Freed-up "slots" aren't filled (bets don't compete for capital; Kelly sizes off full bankroll). Higher per-bet ROI on this longshot strategy lives in tiny-stake longshots that barely compound.
- **Warmup-as-BET vs warmup-as-SKIP** (the two warmup meanings):
  - as-BET (bet the first 8 to LEARN the league, then gate): 272 bet, WR 26.1%, avg flat ROI +19.7%, final $1,473.64 (+47.4%). Cost: pays ~8 bets of "tuition" per bad league before benching (e.g. E0 lost all 8 warmup bets, then benched from n=8 on).
  - as-SKIP (no bet until 8 signals exist, then gate): 168 SKIP / 104 BET / 66 BENCH, WR 27.9%, avg flat ROI +32.2% (95% CI -16%..+81% — meaningless precision at n=104), final only $1,132.79 (+13.3%). Cleaner conceptually, ~34pts worse in $ because the 168 skipped early bets were mostly profitable.
- Recurring one-liner: fewer bets -> higher AVERAGE ROI + wider error bars + LESS total money. The average-ROI lift is selection noise, not edge.
- Artifacts (E:\soccer): _research_fixed.py and the CSVs roi_gate_w10_warm8.csv (as-BET) and roi_gate_w10_warm8_skip.csv (as-SKIP); both emailed to user 2026-06-02.

**Statistically-honest pruning toolkit (2026-06-06, `E:\soccer\_league_honest.py`, n=399/22 leagues, no exclusions):** User asked for the honest way to drop unprofitable leagues. Built + ran 4 methods, all converge on "almost no filter":
- **A1 win-rate beta-binomial shrinkage:** every league collapses to 23-28% shrunk WR, all 90% CIs overlap & contain 25.6%. No league distinguishable on win rate (between-league dispersion ≈ binomial noise; prior strength ~142 pseudo-bets).
- **A2 ROI James-Stein shrinkage → P(true edge<0):** some real signal (between-league sd 0.50). E0 shrinks -71%→-32.5% (P(neg)=83%), MLS +74%→+56% (P(neg)=2%). USL/BSA shrink to only ~-6/-7% (P(neg)~57%) = coin-flips. Even worst league only 83% likely negative.
- **B BH-FDR (21 leagues, vs breakeven):** ONLY E0 survives (q=0.0195). All others q>0.13 incl G1/B1/USL/BSA. USL/BSA q≈0.80.
- **C min-n gate (≥40):** ONLY MLS has enough bets to judge.
- **D walk-forward (the punchline):** corr(TRAIN ROI, TEST ROI) = Pearson -0.05 / Spearman +0.05, both p>0.85 → ZERO persistence. League ROI does NOT carry forward; a threshold-drop rule CANNOT work. The tuned rule nudged TEST p 0.21→0.13 but that's the in-sample mirage (overfit, dropped 7 leagues incl near-breakeven ones).
- **Verdict:** the honest filter is essentially NO filter. (1) Don't prune by realized ROI (no persistence). (2) E0 is the sole statistical flag but FAILS min-n (n=23) & persistence & is the core liquid market → WATCHLIST, not drop. Honest trigger to actually cut: survives FDR AND ≥40 bets AND structural reason. (3) USL/BSA aren't statistically distinguishable from breakeven — their exclusion is justified ONLY structurally (liquidity/data quality), not by returns.

**How to apply:**
- The statistically-honest answer to "which leagues to drop" is: drop on MARKET-STRUCTURE grounds (liquidity/data-quality thresholds set independent of P&L), NOT on realized ROI. Realized league ROI has ~zero out-of-sample persistence at this n.
- Do NOT add a per-league win-rate gate or a standalone warmup-skip — both just destroy sample.
- The rolling-ROI gate is the ONLY filter that touched the real compounding rate (per-bet growth), so it's the one to revisit — but on current data it's a wash on terminal wealth and badly underpowered (CIs span the whole result). User's verdict 2026-06-02: "this is good, we just need more data."
- Re-run this study at 40+ bets/league before trusting/wiring any league filter. If pursued, SHADOW first (flag would-bench leagues in nightly email).
- Consistent with the ride-out-variance preference: rule-based, not panic-pausing — but evidence says don't wire it up yet.
