Sports Dashboard

MI Bivariate Poisson + Dixon-Coles + Elo

← Back to Blog
|Process|DEPLOYED

Every Loss Is a Hypothesis: How We Turn Failures Into New Edge

Post-deployment monitoring that classifies every loss (variance, model error, stale input, regime shift, execution leak), detects when edges erode vs when you're just unlucky, and generates new alpha hypotheses from failure patterns. Kill switches, re-enable gates, and the virtuous cycle that makes the system smarter every time it loses.

Loss Categories
5
variance, model, input, regime, execution
Kill Switch
CLV < -2%
20-bet rolling, auto-disable
Re-enable Gate
20 bets + 14d
CLV ≥ 0% required
Feedback Loop
losses → alpha
every failure = hypothesis

Most betting systems tell you how to find an edge. Nobody tells you what to do when the edge stops working — or how to use your losses to find the next one.

We built a post-deployment monitoring process that answers three questions: Is this still working? If not, why? And what can we learn from the failures?


The Problem After Deployment

Deploying a signal is the easy part. The hard part starts the next morning when bets start settling. You need to know:

  1. Is this working? Not "did today's bets win?" — that's noise. Is the structural edge still there?
  2. When has the regime changed vs when are we just unlucky? The wrong answer costs money either way — disabling a working signal or keeping a broken one.
  3. What can we learn from losses? Every losing bet contains information. Most of it is noise. Some of it is the seed of your next signal.

Loss Classification: Not All Losses Are Equal

When a bet loses, there are exactly five things that could have gone wrong. The response is different for each:

CategoryWhat happenedHow to detectWhat to do
**Variance**CLV positive, model direction correct, just lost`executionCLV > 0`, match xG supported our readNothing. This is expected.
**Model Error**Model mispriced the match fundamentallyCLV positive but match dynamics contradicted model (tactical shift, red card, etc.)Track frequency. If >30% of losses, there's a blind spot.
**Stale Input**Bet placed on outdated information`oddsFlags` contains "stale" or "thin_market", injury data >48h oldFix the pipeline. This is a bug.
**Regime Shift**Market moved against us before close`executionCLV < 0`, line movement against us, CLV trending negative over 20+ betsThe edge is eroding. Reduce exposure.
**Execution Leak**Entered at bad odds, timing, or wrong bookLarge gap between entry odds and closing odds, `slippage` highOptimize entry timing and book selection.

The classification uses data we already record on every bet: execution CLV, odds flags, line movement, slippage, active signals. No new infrastructure needed — just a framework for reading what we already have.

Why This Matters

If you treat all losses as variance, you'll ride a broken signal into a drawdown. If you treat all losses as regime shifts, you'll disable everything and miss recoveries. The classification forces you to look at the evidence before reacting.


The Regime Change Decision Tree

This is the hardest call in live betting: is this a bad week or a structural shift?

Is rolling 30-bet CLV positive?
│
├─ YES → Losses are variance or execution.
│   │    The model still sees edge. Focus on execution gap.
│   │
│   └─ Is hit rate < 40%?
│       ├─ YES → Systematic execution leak. Check entry timing.
│       └─ NO  → Pure variance. Wait it out.
│
└─ NO → Model edge is eroding.
    │
    ├─ Is it one league?
    │   └─ League-specific regime. Check: HFA collapse, coaching
    │      carousel, transfer window, promoted teams settling.
    │
    ├─ Is it one signal?
    │   └─ Signal decay. Revalidate: /signal-test [signal-id]
    │
    └─ Is it system-wide?
        └─ Fundamental issue. Check solver convergence,
           data quality, market structure change.

The key insight: CLV is the leading indicator, not ROI. If CLV is positive and ROI is negative, the model is right and luck is against you. If CLV goes negative, the model is wrong — that's when you act.


Turning Losses Into Alpha

This is the part nobody does. Every non-variance loss contains a signal about where the model is wrong. If you can predict when the model will be wrong, you can either avoid those bets or bet the other way.

From Model Errors → Blind Spot Signals

When the model misprices a match fundamentally, ask: "What pattern do these losses share?"

  • Were they all derbies? (Motivation asymmetry the model can't see)
  • All teams in European competition? (Fixture congestion effects)
  • All matches after international breaks? (Squad disruption)
  • All low-block defensive teams? (Style suppresses goals without xG evidence)

Each pattern is a hypothesis. Register it: /signal-test [pattern] predicts model failure in [context]. If you can identify the context where the model fails, you've found either a filter (avoid those bets) or a reversal signal (bet the opposite).

Our best example: The congestion filter. We assumed congested teams underperform. The data showed the opposite — congested teams (elite teams in European competition) were our most profitable bets. The "model error" in those matches wasn't the model — it was our filter removing the model's best predictions.

From Regime Shifts → Adaptation Signals

When the market adapts to your pricing, ask: "What changed in the market structure?"

  • New bookmaker entering the market? (More efficient pricing)
  • Closing line moving earlier? (Sharper money arriving sooner)
  • Vig structure changing? (Market maker adjusting margins)
  • Specific team being repriced? (Market learned something we haven't)

Each shift is a regime indicator. Register it: /signal-test [regime indicator] predicts CLV erosion. If you can detect the shift before it costs you, you reduce stake in that regime.

From Execution Leaks → Timing Signals

When we enter at worse odds than closing, ask: "When do we get the best odds?"

  • Morning lines before sharp money arrives?
  • Friday vig compression in Championship?
  • Post-injury-news market overreaction windows?

Each timing pattern is testable. Our paper trade logger already collects odds at multiple timestamps (T08, T12, T19). The data exists — we just haven't mined it.


Automated Kill Switches

Three thresholds trigger automatic responses:

TriggerThresholdResponseRe-enable
**CLV collapse**Rolling 20-bet CLV < -2% per league/marketDisable that league/market combo20+ bets with CLV ≥ 0% AND 14-day cool-off
**Data staleness**Any data source >48h staleBlock new bets until pipeline catches upAutomatic when data refreshes
**Losing streak**5 consecutive losses on same signalFlag for manual review (not auto-disable)Manual review clears the flag

The key design choice: CLV collapse triggers automatic disable. Losing streaks trigger manual review. Why? Because 5 consecutive losses at +5% CLV each is just variance (probability ≈ 3%). But 20 bets with negative CLV is a structural problem (probability < 0.1% if the edge is real).


The Weekly Health Check

Every week, run the post-deployment audit:

/post-deployment full audit

This produces:

  1. System health: Overall CLV, ROI, hit rate, CUSUM status
  2. Loss classification: How many losses were variance vs model error vs stale input vs regime shift vs execution leak
  3. Regime change detection: Is rolling CLV positive? Any league-specific collapses?
  4. New hypotheses: Patterns in non-variance losses → registered as pending signals
  5. Recommended actions: What to disable, what to investigate, what to fix

The weekly cadence prevents both overreaction (daily noise) and underreaction (month-long drawdowns going unnoticed).


The Virtuous Cycle

The full system creates a feedback loop:

Deploy signal → Monitor live performance → Classify losses
    ↑                                           │
    │                                           ↓
    │                                   Extract patterns
    │                                           │
    │                                           ↓
    │                              Register new hypotheses
    │                                           │
    │                                           ↓
    └────────── /signal-test → approve gate ────┘

Losses feed discovery. Discovery feeds deployment. Deployment feeds monitoring. The edge doesn't just erode — it evolves, because every failure teaches you where to look next.

This is why we don't stop researching when something works. Edges erode. Markets adapt. The only sustainable advantage is the speed at which you discover new ones. The infrastructure — 26-league backtests in 33 minutes, parallel signal testing, automated approval gates — exists to make that discovery loop as fast as possible.


Current State

MetricValueStatus
Model CLV+11.1%Healthy (universal across 26 leagues)
IS ROI-1.4%Near breakeven (execution gap)
OOS ROI-3.6%Worse (odds quality in soft markets)
Strongest filterodds-cap-2.0 (+4.2pp)Deployed
Signal layer~neutralSearching for marginal contributors
Drift detectorCUSUM activeMonitoring CLV + ROI trends
Kill switchesManualAutomating (CLV threshold + data freshness)
Loss → alpha pipeline`/post-deployment` skillReady to use

The model works. The execution gap is the bottleneck. Losses are being classified and mined for new hypotheses. The infrastructure makes the discovery loop fast enough to stay ahead of market adaptation.