Diego Garcia

Back to logs

> kairox tempo

Two Thirds of a Second-Tier Title Race Is a Prior

Fourteen leagues, 20,000 simulated 2026-27 seasons each. In the eleven top flights the answer belongs to the model. In the three second tiers, 55 to 70% of the title probability sits on teams the model has never seen, and moving that one assumption by a standard deviation takes Southampton from 21.8% to either 40.3% or 3.2%.

Aug 202610 min read

KairoX Tempo answers one match at a time: P(home), P(draw), P(away). A title is a property of a whole season. Getting from one to the other turns out to be free. A 1X2 triple carries two degrees of freedom, and a Dixon-Coles scoreline model at a fixed dependence parameter has exactly two free parameters, so inverting a calibrated triple into a lambda pair is a change of coordinates rather than a model fitted to another model. The worst residual across all 2,808 priced fixtures is 1.7e-16 nats of KL divergence, which is solver precision and not approximation error.

So the season simulation is Tempo's own answer, re-expressed as scorelines and played out 20,000 times per league under each league's real format, tiebreak chain included. That holds for every fixture between two teams Tempo knows. The interesting part is the fixtures it does not.

The 2026-27 Answer

Ordered by how settled the race is, measured as effective contenders: the inverse Herfindahl index of the title-probability vector, where 1.0 means a formality and the field size would mean every team level. The last column is the share of title probability held by teams with no 25-26 record in that league, and it is the column this log is about.

LeagueFavouriteP(title)Runner-upThirdEff. contendersNo 25-26 record
BundesligaBayern München88.3%Leverkusen 7.0%Dortmund 3.3%1.270.0%
EredivisiePSV Eindhoven75.7%Feyenoord 14.0%Ajax 4.0%1.680.1%
Ligue 1PSG71.4%Lens 12.1%Marseille 6.8%1.880.1%
Scottish PremiershipCeltic65.6%Rangers 29.4%Hearts 4.0%1.930.1%
LaLigaBarcelona56.1%Real Madrid 38.5%Atlético 3.0%2.150.1%
Liga PortugalSporting CP54.9%Benfica 32.5%Porto 12.4%2.360.0%
Premier LeagueManchester City51.7%Arsenal 35.0%Liverpool 7.8%2.520.5%
Danish SuperligaKøbenhavn56.8%Midtjylland 20.6%AGF 6.8%2.640.8%
Serie AInter57.4%Napoli 14.1%Juventus 10.4%2.710.2%
Austrian BundesligaSalzburg41.1%Sturm Graz 30.7%LASK 16.3%3.420.7%
Swiss Super LeagueServette38.6%Young Boys 29.8%St. Gallen 11.3%3.871.4%
2. BundesligaHeidenheim23.4%St. Pauli 21.7%Wolfsburg 18.8%6.5269.8%
EFL ChampionshipSouthampton21.8%Wolves 19.3%West Ham 16.9%6.7355.4%
Segunda DivisiónMallorca22.0%Girona 17.4%Oviedo 17.0%7.5364.2%

20,000 seasons per league, 280,000 in total. Monte Carlo standard error is at most 0.35pp on any figure in the table.

Two things in that table are worth a sentence before moving on. Arsenal won the 25-26 Premier League by seven points and are second here at 35.0%, because the projection regresses hard toward the mean: across all 202 returning teams the spread of projected points per game is 0.295 against last season's realised 0.362, a regression slope of 0.73. And the Austrian figure is load-bearing on a rule change. Austria halved points at the championship split every season from 2018-19 until this one; 26-27 is the first without it, and halving would compress the gap Salzburg and Sturm Graz build in the regular phase into something materially more open than 41.1% against 30.7%.

The Fixture the Model Cannot Price

Every Tempo feature is a rolling window over the league's own history: form over the last five, xG over the last ten, points gap, venue splits. A side promoted into the league has nothing to roll over.

scripts/predict.py
FootballFeatureBuilder("premier_league").build_single(
history, date="2026-05-25",
home="coventry_city", away="liverpool",
)
-> 63 of 94 features NaN
-> TempoModel.predict_proba
P(home) 0.394 P(draw) 0.219 P(away) 0.387
# the same call, two teams that played in 25-26:
-> 0 of 94 features NaN

Newly-promoted Coventry, at home to Liverpool, 39.4% to win. XGBoost routes NaN down a default branch at no cost, so nothing raises, nothing warns, and the number comes back with the same type, the same range and the same shape as a real one. The identical call for two teams Tempo does know returns zero NaN, which makes this a specifically new-to-the-league failure rather than general sparsity.

The direction of the error is the part that matters. A missing gap reads as no gap, so the failure is biased optimistic: the model does not return noise around the right answer, it returns a team that looks roughly average. Across the fourteen leagues, 42 of 244 teams did not play in their league in 25-26.

Why the definition is strict

A team counts as informative here only if it played in the league in 25-26. Some arrivals do have older history in the same league: Schalke were in the Bundesliga in 22-23, Troyes in Ligue 1 the same season. But Tempo's rolling windows have no notion of staleness, so they would happily describe Schalke by their form from four years ago. Treating every arrival the same way is both simpler and more honest, and it makes the newcomer set exactly derivable from the data rather than declared by hand.

Measure the Arrival Instead

The replacement is not a guess. Tempo's own Poisson component is fitted to each league-season on its own, decay off, attack and defence re-centred to mean zero, which is the gauge the parameterisation is invariant under. Teams absent the season before are the sample. That puts the prior and its destination on the same scale by construction, so there is no calibration step to argue about.

PoolnAttackDefenceScoresConcedes
promoted into a top flight101-0.216 ± 0.200-0.179 ± 0.182×0.81×1.20
promoted into a second tier39-0.066 ± 0.238-0.087 ± 0.121×0.94×1.09
relegated into a second tier32+0.116 ± 0.180+0.119 ± 0.275×1.12×0.89

172 real arrivals across 14 leagues and 4 seasons. Multipliers are relative to the average team in the league being entered.

172 real arrivals, measured on the model's own strength scale

Every team that appeared in one of the fourteen leagues without having played there the season before, 22-23 through 25-26. Attack and defence are fitted per league-season with the model's own Poisson component and re-centred to mean zero, so the origin is that season's league average.

-0.8×0.45-0.6×0.55-0.4×0.67-0.2×0.820.0×1.00+0.2×1.22+0.4×1.49-0.6×1.82-0.3×1.350.0×1.00+0.3×0.74+0.6×0.55+0.9×0.41+1.2×0.30attack: log multiplier on goals scored vs league averagedefence: higher means fewer concededscores more, concedes lessscores less, concedes moreBurnley, Championship 24-2516 conceded in 46 gamespromoted into a top flightn=101 · ×0.81 scored · ×1.20 concededpromoted into a second tiern=39 · ×0.94 scored · ×1.09 concededrelegated into a second tiern=32 · ×1.12 scored · ×0.89 conceded
Figure 2: The three pools separate along the diagonal, and only one of them sits in the positive quadrant. A side relegated into a second tier is not a weak arrival to be discounted; it is above the average of the league it lands in, which is why the prior alone puts three of them on every second-tier podium. Crosshairs are ±1 sd; the dashed line joins the pool means.

The ordering is football sense arrived at from data, which is the cheap part. The expensive part is the third row. A side relegated into a second tier is not a discounted arrival at all: it scores 12% more and concedes 11% less than the average team in the league it drops into. Second tiers are also compressed, which is why the middle pool sits so close to the origin, and the combination is what makes the second-tier tables what they are.

Two implementation details do real work. Attack and defence are drawn as whole pairs, bootstrapped from the sample, so the correlation between them survives at +0.22, +0.09 and +0.30 by pool: promoted sides are not independently bad at scoring and bad at defending. And the draw happens once per simulated season, not once per match. A promoted side that comes up flying is flying in all 34 of its games, and that persistence is what turns the prior into a strength-of-schedule effect for everyone else in the league.

One note on the spread, because it looks too wide. Fitting a single season measures realised performance, which mixes true strength with a season's luck. That is the right quantity: the simulation wants the predictive distribution of what a newcomer will actually do, not a noise-free estimate of what it is.

Where It Matters

Shift every newcomer's prior mean by a standard deviation in each direction and rerun, with common random numbers so the differences are not swamped by Monte Carlo noise. Then do the same for a completely different worry: that Tempo is more confident about who is better than whom than it should be. That knob pulls every fixture's log-lambda a fixed fraction of the way to its venue's mean, flattening team-to-team strength while holding home advantage and the league's goals-per-game fixed, so it isolates one assumption rather than degrading the model generally.

What actually moves each favourite's title probability

Fourteen leagues, ordered by how much of the title probability sits on teams with no 25-26 record. Both panels share the same x-axis: P(title) for that league's favourite.

A. Flatten team strength 25% toward the league meanwhat the model is unsure about0%25%50%75%100%B. Shift the newcomer prior by ±1 sdwhat the model cannot see at all0%25%50%75%100%BundesligaBayernLiga PortugalSportingLaLigaBarcelonaLigue 1PSGEredivisiePSVScottish Prem.CelticSerie AInterPremier LeagueMan CityAustrian Bund.SalzburgDanish SuperligaKøbenhavnSwiss Super Lg.ServetteEFL ChampionshipSouthampton37.1ppSegunda DivisiónMallorca24.6pp2. BundesligaHeidenheim23.9ppheadlinestrength flattened 25%newcomers 1 sd weakernewcomers 1 sd stronger
Figure 1: The eleven top flights collapse to a single dot in panel B and spread out in panel A. The three second tiers do the opposite. Note that the endpoints swap sides: weaker newcomers help Southampton, the only returning team near the top of the Championship, and hurt Mallorca and Heidenheim, who are newcomers themselves. 20,000 seasons per league per variant, common random numbers throughout.

In the eleven top flights the newcomer perturbation is a rounding error. The largest favourite move is 4.56pp, København, and the largest move for any team in any top flight is 8.82pp, Vaduz, which is itself a newcomer. Newcomers hold between 0.0% and 1.4% of all top-flight title probability, and the answers survive being substantially wrong about them.

In the three second tiers the same perturbation decides the league. Southampton goes from 21.8% to 40.3% when newcomers are a standard deviation weaker and to 3.2% when they are stronger, because the teams either side of it in the market are all relegated Premier League clubs priced entirely from the prior. In 2. Bundesliga and Segunda it is worse: the entire podium is.

League1st2nd3rd4th
EFL ChampionshipSouthampton 21.8%Wolves 19.3% (new)West Ham 16.9% (new)Burnley 15.0% (new)
2. BundesligaHeidenheim 23.4% (new)St. Pauli 21.7% (new)Wolfsburg 18.8% (new)Hannover 96 8.4%
Segunda DivisiónMallorca 22.0% (new)Girona 17.4% (new)Oviedo 17.0% (new)Almería 10.4%

Every team marked (new) is priced from the cohort prior, not from Tempo. Ten of the twelve teams in the top four of the three second tiers have no 25-26 record in the league they are being simulated in.

The Two Sensitivities Run Opposite Ways

Panel A of the figure is the honest bound on the headline numbers. At 25% shrinkage the top-flight favourites move a long way: PSV 75.7% to 60.4%, the largest single move in the entire sweep, Bayern 88.3% to 76.1%, Inter 57.4% to 44.3%. The reported spread integrates match outcomes and the newcomer prior; it does not contain Tempo's own parameter uncertainty, so it is a floor, and the most confident-looking figures are the ones with the most to lose.

The three second tiers barely register it. At most 3.9pp, because their strength spread is already flat and pulling a flat distribution toward its own mean does very little. So the ordering inverts: the leagues whose numbers are least sensitive to the model being overconfident are precisely the leagues whose numbers are most sensitive to an assumption the model never made.

This is the reason the finding is worth writing down rather than filing. Read the results table alone and the second tiers look like honest wide races: 6.5 to 7.5 effective contenders, no favourite above 24%, the sort of distribution that reads as appropriate humility about a competitive league. The width is real. But it is not the model expressing uncertainty about teams it has measured. It is a bootstrap over a 32-team cohort mean, wearing the model's output format.

How to quote these numbers

The eleven top-flight tables are robust to everything tested except overall strength confidence, and can be quoted as they stand with that caveat. The three second-tier tables should never appear without the newcomer share attached. They are 55 to 70% prior, and the prior is a cohort mean, not a read on those specific clubs.

The Obvious Next Test

The three leagues where the prior dominates are also the three where the newcomers arrive from above, and their records exist. Wolves, West Ham and Burnley each played 38 Premier League matches last season. The prior throws all of that away and prices them from a 32-team cohort mean measured across four seasons and fourteen leagues.

Whether the club's own record beats the cohort is not answerable from this run, and it is not obvious which way it goes. The cohort is a tight estimate of the wrong thing: what an average relegated club does. The club's own season is a noisy estimate of the right thing, from a sample of one, in a division a tier above, before a transfer window that this experiment cannot see at all. The comparison needs running rather than reasoning about, and until it is run, the Championship number stays what it currently is: a well-calibrated statement about a cohort, formatted as a statement about Southampton.