Diego Garcia

Back to briefs

> kairox storm

The Model That Predicts Best Returns the Least

Hyperion, an independent Poisson model for total goals, was evaluated across La Liga, Premier League, and Bundesliga over three validation seasons each. Bundesliga produced the best predictive accuracy of the three leagues. It also produced the only consistently negative ROI. The data shows why better calibration and market efficiency are not the same thing, and what happens when you try to fix the wrong constraint.

Jun 202614 min read

The standard assumption in sports prediction model development is that better probability estimates produce better betting returns. Improve your log-loss, improve your edge. This assumption is wrong, and the cross-league KairoX Storm evaluation produces the clearest possible evidence for why.

KairoX Storm is a bivariate independent Poisson model: for each match, home and away expected goals are computed from per-team attack and defence ratings estimated via maximum likelihood, and over/under probabilities for lines 0.5 through 4.5 are derived analytically from the resulting joint distribution. The model was evaluated identically across La Liga, Premier League, and Bundesliga using three-fold walk-forward cross-validation on five seasons of data. Nine validation fold results, same model, same protocol, three leagues.

Two additional prediction variants were tested alongside the analytical baseline: MC-pure (10,000 Monte Carlo samples from the same Poisson distributions, replacing the analytical convolution) and MC-Gamma (Gamma-sampled lambda before Poisson sampling, propagating uncertainty in the rate estimates). The comparison between all three variants produces the second major finding of this investigation.

The Inversion

Across nine validation fold results on the Over 2.5 line, there is no positive relationship between AUC and ROI. The Bundesliga fold with the highest AUC in the entire dataset (BU F0, AUC=0.638) returns -6.2% ROI. The La Liga fold with the second-highest AUC (LA F0, AUC=0.639, ROI=+6.0%) sits in the opposite corner. The three Bundesliga folds cluster together: high AUC, all negative ROI, the best predictive performance in the dataset and the worst returns.

Scatter plot of AUC vs ROI across 9 validation folds for three leagues
Figure 1: AUC vs flat-stake ROI on the Over 2.5 line across 9 validation folds (3 leagues, 3 folds each). No positive correlation. Bundesliga (green squares) occupies the high-AUC, negative-ROI region. Premier League fold 0 (amber diamond, bottom-left) is the exception in the opposite direction: low AUC, deeply negative ROI, driven by a season-level scoring shift the model could not anticipate.

The cross-league summary makes the inversion explicit:

LeagueOver 2.5 AUCOver 2.5 log-lossMean ROI (3 folds)
Bundesliga0.5870.661-8.4%
La Liga0.5990.681-1.5%
Premier League0.5590.686-2.1%

Cross-league summary on the Over 2.5 line. Bundesliga leads on every predictive metric and trails on every betting metric. Premier League has the worst predictive performance and the most encouraging ROI trajectory (fold-over-fold: -15%, +2%, +6%).

The mechanism is market efficiency. Bundesliga is a structurally high-scoring league: the Over 2.5 rate sits between 60% and 64% across all three validation seasons, well above La Liga (46-50%) and Premier League (55-65%). A consistently tilted market is an easier prediction problem. More predictable markets attract more sophisticated pricing. Bookmakers have fully incorporated the Bundesliga scoring environment into their Over 2.5 odds. The model finds the signal; the market already priced it.

La Liga sits closest to the 50% over rate, making its 2.5 line the hardest to predict and the most sensitive to small probability errors. It is also the market with the most variance in bookmaker pricing, which is where the model's occasional edges appear. Premier League fold 0 fails dramatically (-15% ROI, ECE=0.152) because the 23-24 season produced a 64.7% over-2.5 rate while the model was trained on two seasons with lower scoring. That is not model failure in the usual sense. It is a season-level distributional shift the model could not have anticipated from prior data.

What MC-Gamma Gets Wrong

The MC-Gamma variant was designed to address a real limitation: the analytical Poisson convolution treats lambda as a known quantity rather than an estimate with uncertainty. The Gamma distribution is the conjugate prior to the Poisson, so sampling lambda from Gamma(alpha, lambda/alpha) before sampling goals is a principled way to propagate parameter uncertainty. The resulting marginal distribution over goals is Negative Binomial, which has heavier tails than Poisson and is empirically a better fit for football goal counts.

The hypothesis was that this would improve tail-line probability estimates and reduce calibration error. On ECE for the 2.5 line in La Liga, it does: ECE drops from 0.053 (analytical) to 0.049 (MC-Gamma). Every other metric gets worse.

Bar chart comparing log-loss and ROI across analytical, MC-pure, and MC-Gamma approaches
Figure 2: Left: log-loss on the Over 2.5 line for all three approaches across leagues. MC-Gamma raises log-loss in every league, most severely in Premier League where it crosses the naive baseline. Right: mean ROI on the Over 0.5 line for analytical vs MC-Gamma. The Gamma prior roughly doubles the losses on a line where the analytical model was already losing.

The right panel of Figure 2 shows where MC-Gamma fails most visibly. On the Over 0.5 line, analytical mean ROI across the three leagues is -32.6%, -11.3%, and -12.4% for La Liga, Premier League, and Bundesliga respectively. MC-Gamma returns -40.6%, -34.0%, and -39.2%. The model with uncertainty propagation loses roughly three times as much on a line where the event occurs 93-97% of the time.

The mechanism is direct. Sampling lambda from a Gamma distribution includes low-lambda scenarios, draws where the model samples a rate estimate well below the point estimate. In a league where teams score approximately 2.5-3.0 goals per game, a low-lambda draw produces a meaningful probability on zero total goals. Poisson(0.8) assigns about 45% probability to a scoreless game. When these low-lambda samples are averaged into the MC-Gamma estimate, P(0 goals) inflates systematically. The model starts betting Under 0.5 in matches where the true probability of a scoreless game is 3-7%. Those bets lose consistently.

The deeper issue is that lambda uncertainty is not the binding constraint on KairoX Storm's performance. The MLE fit on 2-4 seasons of match data produces well-determined team ratings: the standard error on a team's attack parameter from 100-150 career matches is small relative to the inter-team variation. Propagating that uncertainty adds noise in the wrong direction because the estimates are already stable. What is not captured by the Poisson model is structural: the independence assumption between home and away goals, the inability to model within-match state dependence (scorelines affect subsequent play), and the absence of opponent-adjusted recent form. These are not fixable by widening the lambda distribution.

MC-pure adds nothing either

The pure Monte Carlo variant, which samples from the same Poisson distributions as the analytical convolution, produces results within 0.0002 log-loss of analytical in every league. This confirms that the analytical convolution is exact and that sampling noise at 10,000 iterations is negligible. MC-pure is computationally expensive with no benefit; the analytical path is correct.

Time Decay and What It Reveals About MLE

All three leagues independently select near-zero time decay as optimal. La Liga: xi=0.001. Premier League: xi=0.000. Bundesliga: xi=0.000, with a monotone increase in log-loss at every subsequent decay level tested.

Line chart of time decay parameter vs mean CV log-loss for three leagues
Figure 3: Time decay parameter (xi) vs mean CV log-loss on the Over 2.5 line. All three leagues reach their minimum at xi=0 or xi=0.001. Bundesliga's monotone slope is the clearest signal: every step toward recency-weighting actively discards information.

The expected result would be that some decay helps: teams change over time, players move, managers rotate, and last month's performance is more relevant than three seasons ago. The data disagrees, and the Bundesliga result is the most informative because its gradient is monotone rather than a shallow U-shape. It is not that decay provides marginal benefit at low levels; it is that any decay at all makes things worse.

The explanation is in how MLE works. The maximum likelihood estimator for each team's attack and defence parameters uses all historical matches simultaneously to find the parameter values that maximise the joint likelihood of the observed scorelines. This is equivalent to a weighted average of all matches, where the weight is determined by the information content of each match rather than its recency. A match from three seasons ago carries less leverage only if the team's true scoring rate has changed since then. If the structural quality hierarchy between teams is stable within the training window, older matches are informative and removing them by decay costs more than it gains.

Bundesliga illustrates this most clearly because its quality hierarchy is the most stable: Bayern Munich, Borussia Dortmund, and Bayer Leverkusen have consistently been the three strongest attacking teams in the dataset, and the structural bottom half of the league is largely occupied by the same clubs that struggle every season. The MLE estimate from four seasons of data is a better estimate of each team's scoring rate than one weighted toward recent games, because the signal is stable and every historical match contributes information that recency weighting would discard.

The implication for model design is that time decay is the wrong mechanism for incorporating recent form into a Poisson rating model. What would actually help is not downweighting older matches but adding a form residual: how much is a team currently scoring above or below their long-run MLE rate? That is a different signal and requires different architecture, not a decay parameter.

Where This Leaves the Model

The Poisson model beats the naive log-loss baseline on the 2.5 line in all three leagues. Its ECE is well-controlled (0.053 in La Liga, 0.054 in Bundesliga, 0.074 in Premier League on the primary line). Its AUC reaches 0.60 on the 2.5 line across all three leagues. These are not weak results for a model with no match-level features, no rolling form windows, and no xG.

The ceiling is visible. Three folds of La Liga data return +6.0%, -11.2%, +0.7% on the 2.5 line: one strong season, one season that breaks badly, one near-flat. Premier League shows an improving trajectory (-15%, +2%, +6%) that is consistent with a model whose reliability grows as its training window extends, but three folds is not enough to confirm a structural edge. Bundesliga is priced efficiently enough that the model has no market edge on the 2.5 line despite its best predictive performance.

The cross-league comparison maps the problem precisely. The binding constraints are: the Poisson independence assumption (within-match state dependence is unmodelled), the absence of form features (static ratings cannot track within-season team trajectories), and the season-level scoring drift problem (La Liga and Premier League show year-to-year variation in goal rates that a model trained on prior seasons systematically underestimates). None of these are addressable by MC-Gamma, time decay tuning, or more Monte Carlo samples. They require structural changes to the model: rolling form residuals, season-level intercepts, or a hybrid with ML features that capture what static ratings cannot.

On the PL fold 0 outlier

Premier League fold 0 (val 23-24) produced ECE=0.152 on the 2.5 line: the worst calibration in the entire experiment. The root cause is that the 23-24 PL season had a 64.7% Over 2.5 rate, while the model was trained on 21-22 and 22-23 data with lower scoring rates. The model systematically under-predicted goals in a season where Haaland-era scoring was at its peak. This is not a generalisation failure in the usual sense; it is a non-stationarity problem. Any model trained on historical data will face this when scoring environments shift between training and deployment. The season-level intercept experiment, which would explicitly model year-to-year goal rate drift, is the direct response to this finding.