Contas da Bola EN · Read this page in English

How it works

What we do, what the numbers mean and how good they really are. The short version comes first; the full detail is further down for anyone who wants it.

The idea in one minute

We forecast every match

A statistical model estimates the chance of each result, of more than 2.5 goals and of both teams scoring, using only what was known 24 h before kick-off.

We lock it before the match

Each forecast goes into a record that can only grow: it is never edited, and a correction is a new line. We publish a fingerprint of each line, so nobody can rewrite the past, including us.

We play out the season

The matches left are simulated thousands of times. That gives each club its chance of the title, Europe or relegation, and it is what the simulator uses when you pick results.

We check ourselves against the market

The closing odds of the bookmakers are the hardest yardstick there is, so that is what we measure against, and we show the result whatever it says. This is a personal project, and nothing here is betting advice.

What the numbers mean

41 in 100
If this match could be played 100 times, that is how many times it would end this way. It is a chance, not a promise.
Favourite
The result we think most likely, even at 40 in 100. Being the favourite does not mean being more likely than not.
Right and Wrong
Whether our favourite result happened. It is a simple reading: a favourite at 40 in 100 that loses is not necessarily a bad forecast.
Test forecast
Made after the match was played, to test the model. It proves nothing and does not count towards our record.
Simulated seasons
The rest of the season played out by computer, result by result. The simulator keeps only the simulations with the results you pick, so with many picks few are left and the numbers get rough; it tells you when that happens.
Closing odds
The last prices of the bookmakers before kick-off, with their margin removed. We use them to measure ourselves, not as a tip.
RPS
A score for a home, draw or away forecast: the closer to what happened, the lower. A small difference in RPS can be a big difference in quality.
Calibration
Whether the numbers mean what they say: of all the times we say 70 in 100, about 7 in 10 should happen.
Holdout
Seasons kept aside and tested only once, at the end, with the model already fixed, so the test cannot be tuned to look good.
Ledger
The record of forecasts. Lines are only ever added, and only those written before their match count.

So how good is it?

We measure ourselves two ways: a closed test, run only once, and the live record, which grows every round. Beating the closing odds is very hard, and a model built on public data is not expected to.

Status as of 2026-11-11 (UTC).

In the closed test · 2024/25 and 2025/26

Two seasons kept aside and opened only once, with phase4-v1, the model fixed before they were opened.

The model is not distinguishable from the closing market.

Over 612 matches of 2024/25 and 2025/26, opened once with the model fixed in a commit, the RPS of phase4-v1 minus the market's is +0.0041 [-0.0002; +0.0088] (95% interval). Below zero would mean beating the market.

walk-forward24 h point-in-timeholdout used oncereport f8648fb

1X2 · RPS difference to the no-vig closing market

marketmodel bettermarket betterRPS of phase4-v1 minus closing RPS: +0.0041 [-0.0002; +0.0088]

Both teams to score is shown for completeness: it has not beaten the base rates, neither in development nor on the holdout.

Live · since 2026-10-25

The site shows phase4-v2, chosen after the test and on development seasons only: its 1X2 uses the bookmakers' no-vig odds collected before the forecast time, and ratings fitted to the odds where there are none. The closed test cannot judge it without being used again, so this is its evidence.

18
matches scored with a forecast frozen in time (the evidence)
+0.0031
live Δ RPS of phase4-v2 vs the market, 18 matches, too early to call
0
open matches, frozen and waiting
495
ledger lines, last 2026-11-07

The full detail

For anyone who wants to check our work: every table and chart behind the site.

Method

Method

Every external datum carries the moment it became available, and a forecast only uses what existed 24 h before kick-off; an automated test fails if a feature breaks this. Models are trained walk-forward on earlier matches only. The ledger is append-only JSONL in git: a correction is a new line, never an edit. The scores below are derived from the ledger, the results and the closing odds; nothing is written back.

RPS (ranked probability score) is the primary 1X2 metric because it respects the order home, draw, away; log loss and Brier are secondary. The closing market has its margin removed with the power method for 1X2 and proportionally for over/under.

Open data

The numbers on this page are also published as JSON, free to reuse under CC BY 4.0 with a credit to this site: one forecast per match, with results once played, and the season table with every final position and the head to head. index.json describes the files. Bookmaker odds are not included: their sources do not allow redistribution.

Every ledger line also has its SHA-256 in ledger-hashes.json. The ledger stays private because it holds odds, but this site's public git history dates each hash: anyone later shown a line can hash it and check that it was published, unchanged, before the match.

What we said and what happened

What we said and what happened

If the probabilities on this page are right, adding them up says how often each thing should happen, and chance alone still moves the real count around that number. The shaded band is where the count lands 9 times out of 10 when the probabilities are right: a result outside it is a warning sign, one inside it is not proof. These are the phase4-v2 forecasts the site shows, one per match; the comparison with every model and the baselines is in the live record.

Prospective · 18 played match(es)

Prospective: frozen before kick-off, with data up to 24 h before it.

Counts against their 90% band

90% band if the probabilities are rightwhat we said (expected)what happened (filled when outside the band)
0%20%40%60%80%100%Home wins: we said 7.4 of 18, 90% band 5 to 10, happened 9Home winsDraws: we said 4.0 of 18, 90% band 1 to 7, happened 2DrawsAway wins: we said 6.6 of 18, 90% band 4 to 10, happened 7Away winsOver 2.5 goals: we said 9.4 of 18, 90% band 6 to 13, happened 8Over 2.5 goalsBoth teams scored: we said 8.8 of 18, 90% band 5 to 12, happened 7Both teams scoredFavourite won: we said 10.7 of 18, 90% band 7 to 14, happened 13Favourite wonFavourite below 50%: we said 2.0 of 5, 90% band 0 to 4, happened 1Favourite below 50%Favourite at 50% to 65%: we said 3.9 of 7, 90% band 2 to 6, happened 6Favourite at 50% to 65%Favourite at 65% or more: we said 4.8 of 6, 90% band 3 to 6, happened 6Favourite at 65% or moreshare of the matches
Counts over the played matches. The closing market's expected count is on the same matches, where every one has odds; the data has no odds for both teams to score.
EventMatchesWe said90% bandHappenedMarket said
Home wins187.45 to 1097.4
Draws184.01 to 723.9
Away wins186.64 to 1076.7
Over 2.5 goals189.46 to 1389.7
Both teams scored188.85 to 127—
Favourite won1810.77 to 141310.7
Favourite below 50%52.00 to 412.0
Favourite at 50% to 65%73.92 to 663.9
Favourite at 65% or more64.83 to 664.9

Reliability diagrams

Forecasts grouped in five bins of 20 points. A point on the dashed diagonal means things with that probability happened exactly that often; the shaded bar is the 90% band chance allows in that bin, so a point outside its bar is the warning sign. The three 1X2 outcomes of a match are pooled, which makes the band a little too narrow.

phase4-v2closing market90% bandperfect calibration

1X2, every outcome

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v2: forecast 12%, observed 0%, 90% band 0% to 25%, 16 probabilitiesphase4-v2: forecast 29%, observed 22%, 90% band 13% to 43%, 23 probabilitiesphase4-v2: forecast 51%, observed 75%, 90% band 25% to 75%, 8 probabilitiesphase4-v2: forecast 73%, observed 100%, 90% band 25% to 100%, 4 probabilitiesphase4-v2: forecast 84%, observed 100%, 90% band 33% to 100%, 3 probabilitiesclosing market: forecast 11%, observed 0%, 90% band 0% to 25%, 16 probabilitiesclosing market: forecast 30%, observed 24%, 90% band 16% to 44%, 25 probabilitiesclosing market: forecast 52%, observed 80%, 90% band 20% to 80%, 5 probabilitiesclosing market: forecast 69%, observed 100%, 90% band 25% to 100%, 4 probabilitiesclosing market: forecast 86%, observed 100%, 90% band 50% to 100%, 4 probabilities

Over 2.5 goals

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v2: forecast 38%, observed 50%, 90% band 0% to 100%, 2 probabilitiesphase4-v2: forecast 49%, observed 50%, 90% band 25% to 75%, 12 probabilitiesphase4-v2: forecast 68%, observed 25%, 90% band 25% to 100%, 4 probabilitiesclosing market: forecast 48%, observed 46%, 90% band 23% to 69%, 13 probabilitiesclosing market: forecast 68%, observed 40%, 90% band 40% to 100%, 5 probabilities

Both teams score

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v2: forecast 40%, observed 100%, 90% band 0% to 100%, 1 probabilitiesphase4-v2: forecast 49%, observed 35%, 90% band 29% to 71%, 17 probabilities

Model against the market, round by round (1X2)

Mean RPS of phase4-v2 minus that of the no-vig closing market in each round (a Tuesday-to-Monday week). Below zero the model was closer to what happened. The model was better in 0 of 3 rounds; one round is a handful of matches, so the overall verdict is the live record's, not this count.

model bettermarket better
0+0.002+0.004week of 2026-10-20: 1 matches, model 0.0461, market 0.0457, difference +0.000420 Octweek of 2026-10-27: 9 matches, model 0.1220, market 0.1167, difference +0.005227 Octweek of 2026-11-03: 8 matches, model 0.1507, market 0.1497, difference +0.00103 Novmean RPS minus closing RPS, by round (below zero: model better)
Rounds as a table
Week ofMatchesModel RPSMarket RPSΔ
2026-11-0380.15070.1497+0.0010
2026-10-2790.12200.1167+0.0052
2026-10-2010.04610.0457+0.0004
Retrospective sample (80 matches): pipeline check, not evidence

Retrospective · 80 played match(es)

Retrospective: frozen after the match with the same 24 h cut-off. Useful to check the pipeline, never evidence.

Counts against their 90% band

90% band if the probabilities are rightwhat we said (expected)what happened (filled when outside the band)
0%20%40%60%80%100%Home wins: we said 34.5 of 80, 90% band 28 to 41, happened 30Home winsDraws: we said 18.7 of 80, 90% band 13 to 25, happened 18DrawsAway wins: we said 26.7 of 80, 90% band 21 to 33, happened 32Away winsOver 2.5 goals: we said 40.5 of 80, 90% band 33 to 48, happened 44Over 2.5 goalsBoth teams scored: we said 39.4 of 80, 90% band 32 to 47, happened 39Both teams scoredFavourite won: we said 45.3 of 80, 90% band 38 to 52, happened 41Favourite wonFavourite below 50%: we said 14.7 of 35, 90% band 10 to 20, happened 15Favourite below 50%Favourite at 50% to 65%: we said 12.3 of 22, 90% band 8 to 16, happened 7Favourite at 50% to 65%Favourite at 65% or more: we said 18.2 of 23, 90% band 15 to 21, happened 19Favourite at 65% or moreshare of the matches
Counts over the played matches. The closing market's expected count is on the same matches, where every one has odds; the data has no odds for both teams to score.
EventMatchesWe said90% bandHappenedMarket said
Home wins8034.528 to 413034.9
Draws8018.713 to 251818.6
Away wins8026.721 to 333226.6
Over 2.5 goals8040.533 to 484440.3
Both teams scored8039.432 to 4739—
Favourite won8045.338 to 524145.8
Favourite below 50%3514.710 to 201515.1
Favourite at 50% to 65%2212.38 to 167 ▼12.2
Favourite at 65% or more2318.215 to 211918.4

Reliability diagrams

Forecasts grouped in five bins of 20 points. A point on the dashed diagonal means things with that probability happened exactly that often; the shaded bar is the 90% band chance allows in that bin, so a point outside its bar is the warning sign. The three 1X2 outcomes of a match are pooled, which makes the band a little too narrow.

phase4-v2closing market90% bandperfect calibration

1X2, every outcome

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v2: forecast 11%, observed 12%, 90% band 5% to 18%, 56 probabilitiesphase4-v2: forecast 28%, observed 32%, 90% band 21% to 35%, 117 probabilitiesphase4-v2: forecast 49%, observed 44%, 90% band 36% to 62%, 39 probabilitiesphase4-v2: forecast 69%, observed 46%, 90% band 46% to 92%, 13 probabilitiesphase4-v2: forecast 83%, observed 87%, 90% band 67% to 100%, 15 probabilitiesclosing market: forecast 11%, observed 15%, 90% band 5% to 18%, 60 probabilitiesclosing market: forecast 29%, observed 30%, 90% band 22% to 36%, 114 probabilitiesclosing market: forecast 49%, observed 46%, 90% band 34% to 63%, 35 probabilitiesclosing market: forecast 69%, observed 56%, 90% band 50% to 83%, 18 probabilitiesclosing market: forecast 85%, observed 85%, 90% band 69% to 100%, 13 probabilities

Over 2.5 goals

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v2: forecast 37%, observed 33%, 90% band 11% to 67%, 9 probabilitiesphase4-v2: forecast 49%, observed 52%, 90% band 38% to 61%, 56 probabilitiesphase4-v2: forecast 66%, observed 80%, 90% band 47% to 87%, 15 probabilitiesclosing market: forecast 38%, observed 14%, 90% band 14% to 71%, 7 probabilitiesclosing market: forecast 48%, observed 53%, 90% band 38% to 58%, 60 probabilitiesclosing market: forecast 67%, observed 85%, 90% band 46% to 85%, 13 probabilities

Both teams score

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v2: forecast 49%, observed 49%, 90% band 40% to 59%, 80 probabilities

Model against the market, round by round (1X2)

Mean RPS of phase4-v2 minus that of the no-vig closing market in each round (a Tuesday-to-Monday week). Below zero the model was closer to what happened. The model was better in 6 of 10 rounds; one round is a handful of matches, so the overall verdict is the live record's, not this count.

model bettermarket better
0+0.05week of 2026-08-04: 9 matches, model 0.2323, market 0.2150, difference +0.01724 Augweek of 2026-08-11: 8 matches, model 0.1769, market 0.1805, difference -0.003711 Augweek of 2026-08-18: 7 matches, model 0.1537, market 0.1554, difference -0.001818 Augweek of 2026-08-25: 9 matches, model 0.1467, market 0.1423, difference +0.004425 Augweek of 2026-09-01: 9 matches, model 0.1355, market 0.1241, difference +0.01141 Sepweek of 2026-09-08: 11 matches, model 0.1912, market 0.1993, difference -0.00828 Sepweek of 2026-09-15: 9 matches, model 0.2506, market 0.2519, difference -0.001215 Sepweek of 2026-10-06: 9 matches, model 0.1839, market 0.1867, difference -0.00286 Octweek of 2026-10-13: 1 matches, model 0.5455, market 0.4782, difference +0.067413 Octweek of 2026-10-20: 8 matches, model 0.3556, market 0.3569, difference -0.001320 Octmean RPS minus closing RPS, by round (below zero: model better)
Rounds as a table
Week ofMatchesModel RPSMarket RPSΔ
2026-10-2080.35560.3569-0.0013
2026-10-1310.54550.4782+0.0674
2026-10-0690.18390.1867-0.0028
2026-09-1590.25060.2519-0.0012
2026-09-08110.19120.1993-0.0082
2026-09-0190.13550.1241+0.0114
2026-08-2590.14670.1423+0.0044
2026-08-1870.15370.1554-0.0018
2026-08-1180.17690.1805-0.0037
2026-08-0490.23230.2150+0.0172
Ledger against the closing market

Ledger against the closing market

The match lists show one model per match; here every model in the ledger stands next to the baselines (base rates and the no-vig closing market), scored once the matches are played. Differences are paired on the matches both have; lower is better; filled dots mark intervals that exclude zero. The 95% intervals resample whole weeks, so they only appear once a sample spans 10 weeks: with fewer, there are too few weeks to resample and the interval comes out too narrow.

The models in the ledger

phase4-v2
What the site shows. In 1X2, the bookmakers' no-vig odds collected before the forecast time; without them, ratings fitted to the odds of earlier matches; as a last resort, Elo. In the goal markets, phase4-v1's numbers.
phase4-v1
The model of the closed test. Elo in 1X2, the market as a starting point in over/under and a partial pooling model in both teams to score.
phase2-v1
The baselines. Base rates, Elo and Dixon-Coles, the first models, kept for comparison.
e7-xg
Experiment. phase4-v2 with over/under adjusted by the season's expected goals (xG). Decided once, at the end of 2026/27.
e10-dynamic
Experiment. phase4-v2 with team strengths that change from match to match, filtered from the odds. Decided once, at the end of 2026/27.

Prospective · 82 scored forecast(s) over 19 match(es), 2026-10-25 to 2026-11-08

Prospective: frozen before kick-off, with data up to 24 h before it.

1X2 · RPS

0+0.05+0.10e10-dynamic · e10_dynamic: -0.0016 (10 matches)e10-dynamic · e10_dynamice7-xg · e7_xg: +0.0032 (17 matches)e7-xg · e7_xgphase2-v1 · base rates: +0.0944 (19 matches)phase2-v1 · base ratesphase2-v1 · Dixon-Coles: +0.0000 (19 matches)phase2-v1 · Dixon-Colesphase2-v1 · Elo: -0.0059 (19 matches)phase2-v1 · Elophase4-v1 · model: -0.0142 (18 matches)phase4-v1 · modelphase4-v2 · model: +0.0031 (18 matches)phase4-v2 · modelRPS minus Closing market, no-vig (lower is better)
RPS with its 95% interval; Δ against Closing market, no-vig.
ForecasterMatchesRPSΔlog lossBrier
Closing market, no-vig190.1588—0.74650.4157
e10-dynamic · e10_dynamic100.1317-0.00160.72130.4081
e7-xg · e7_xg170.1355+0.00320.68520.3799
phase2-v1 · base rates190.2532+0.09441.03200.6240
phase2-v1 · Dixon-Coles190.1588+0.00000.74710.4142
phase2-v1 · Elo190.1530-0.00590.75860.4026
phase4-v1 · model180.1133-0.01420.60850.3284
phase4-v2 · model180.1305+0.00310.66600.3659

Over/under 2.5 · log loss

-0.020+0.02+0.04e10-dynamic · e10_dynamic: -0.0255 (10 matches)e10-dynamic · e10_dynamice7-xg · e7_xg: +0.0235 (17 matches)e7-xg · e7_xgphase2-v1 · base rates: -0.0115 (19 matches)phase2-v1 · base ratesphase2-v1 · Dixon-Coles: +0.0399 (19 matches)phase2-v1 · Dixon-Colesphase4-v1 · model: +0.0078 (18 matches)phase4-v1 · modelphase4-v2 · model: +0.0078 (18 matches)phase4-v2 · modellog loss minus Closing market, no-vig (lower is better)
log loss with its 95% interval; Δ against Closing market, no-vig.
ForecasterMatcheslog lossΔBrier
Closing market, no-vig190.7090—0.2561
e10-dynamic · e10_dynamic100.7486-0.02550.2750
e7-xg · e7_xg170.7612+0.02350.2805
phase2-v1 · base rates190.6975-0.01150.2522
phase2-v1 · Dixon-Coles190.7490+0.03990.2754
phase4-v1 · model180.7342+0.00780.2687
phase4-v2 · model180.7342+0.00780.2687

Both teams score · log loss

0+0.01+0.02e10-dynamic · e10_dynamic: +0.0245 (10 matches)e10-dynamic · e10_dynamice7-xg · e7_xg: +0.0062 (17 matches)e7-xg · e7_xgphase2-v1 · Dixon-Coles: +0.0160 (19 matches)phase2-v1 · Dixon-Colesphase4-v1 · model: +0.0074 (18 matches)phase4-v1 · modelphase4-v2 · model: +0.0074 (18 matches)phase4-v2 · modellog loss minus phase2-v1 · base rates (lower is better)
log loss with its 95% interval; Δ against phase2-v1 · base rates.
ForecasterMatcheslog lossΔBrier
e10-dynamic · e10_dynamic100.7181+0.02450.2623
e7-xg · e7_xg170.7000+0.00620.2533
phase2-v1 · base rates190.6935—0.2502
phase2-v1 · Dixon-Coles190.7095+0.01600.2576
phase4-v1 · model180.7010+0.00740.2538
phase4-v2 · model180.7010+0.00740.2538

Running gap to the market (1X2)

Mean of RPS minus closing RPS over the matches scored so far. Below zero is better than the market.

e10-dynamice7-xgphase2-v1phase4-v1phase4-v2closing market (zero)
0+0.1051015matches scorede10-dynamic: +0.0024 after 2 matches (to 2026-11-02)e10-dynamic: -0.0341 after 3 matches (to 2026-11-06)e10-dynamic: -0.0176 after 5 matches (to 2026-11-07)e10-dynamic: -0.0016 after 10 matches (to 2026-11-08)e7-xg: -0.0096 after 1 matches (to 2026-10-30)e7-xg: +0.0004 after 3 matches (to 2026-10-31)e7-xg: +0.0061 after 7 matches (to 2026-11-01)e7-xg: +0.0052 after 9 matches (to 2026-11-02)e7-xg: -0.0046 after 10 matches (to 2026-11-06)e7-xg: -0.0027 after 12 matches (to 2026-11-07)e7-xg: +0.0032 after 17 matches (to 2026-11-08)phase2-v1: +0.1431 after 1 matches (to 2026-10-25)phase2-v1: +0.0633 after 2 matches (to 2026-10-26)phase2-v1: +0.0378 after 3 matches (to 2026-10-30)phase2-v1: -0.0058 after 5 matches (to 2026-10-31)phase2-v1: +0.0108 after 9 matches (to 2026-11-01)phase2-v1: +0.0078 after 11 matches (to 2026-11-02)phase2-v1: +0.0018 after 12 matches (to 2026-11-06)phase2-v1: -0.0010 after 14 matches (to 2026-11-07)phase2-v1: -0.0059 after 19 matches (to 2026-11-08)phase4-v1: -0.0166 after 1 matches (to 2026-10-26)phase4-v1: -0.0149 after 2 matches (to 2026-10-30)phase4-v1: -0.0430 after 4 matches (to 2026-10-31)phase4-v1: -0.0057 after 8 matches (to 2026-11-01)phase4-v1: -0.0057 after 10 matches (to 2026-11-02)phase4-v1: -0.0111 after 11 matches (to 2026-11-06)phase4-v1: -0.0121 after 13 matches (to 2026-11-07)phase4-v1: -0.0142 after 18 matches (to 2026-11-08)phase4-v2: +0.0004 after 1 matches (to 2026-10-26)phase4-v2: -0.0046 after 2 matches (to 2026-10-30)phase4-v2: +0.0004 after 4 matches (to 2026-10-31)phase4-v2: +0.0054 after 8 matches (to 2026-11-01)phase4-v2: +0.0048 after 10 matches (to 2026-11-02)phase4-v2: -0.0042 after 11 matches (to 2026-11-06)phase4-v2: -0.0025 after 13 matches (to 2026-11-07)phase4-v2: +0.0031 after 18 matches (to 2026-11-08)

Calibration by model version (1X2, every outcome)

Five bins; few matches per bin, so read the shape, not the points.

e10-dynamice7-xgphase2-v1phase4-v1phase4-v2closing marketperfect calibration
0%0%25%25%50%50%75%75%100%100%forecastobservede10-dynamic: forecast 11%, observed 0%, 9 probabilitiese10-dynamic: forecast 29%, observed 31%, 13 probabilitiese10-dynamic: forecast 53%, observed 50%, 4 probabilitiese10-dynamic: forecast 71%, observed 100%, 2 probabilitiese10-dynamic: forecast 85%, observed 100%, 2 probabilitiese7-xg: forecast 12%, observed 0%, 14 probabilitiese7-xg: forecast 29%, observed 22%, 23 probabilitiese7-xg: forecast 51%, observed 75%, 8 probabilitiese7-xg: forecast 73%, observed 100%, 3 probabilitiese7-xg: forecast 84%, observed 100%, 3 probabilitiesphase2-v1: forecast 9%, observed 6%, 17 probabilitiesphase2-v1: forecast 30%, observed 20%, 25 probabilitiesphase2-v1: forecast 46%, observed 80%, 5 probabilitiesphase2-v1: forecast 70%, observed 100%, 5 probabilitiesphase2-v1: forecast 87%, observed 80%, 5 probabilitiesphase4-v1: forecast 9%, observed 0%, 15 probabilitiesphase4-v1: forecast 30%, observed 20%, 25 probabilitiesphase4-v1: forecast 46%, observed 80%, 5 probabilitiesphase4-v1: forecast 70%, observed 100%, 5 probabilitiesphase4-v1: forecast 86%, observed 100%, 4 probabilitiesphase4-v2: forecast 12%, observed 0%, 16 probabilitiesphase4-v2: forecast 29%, observed 22%, 23 probabilitiesphase4-v2: forecast 51%, observed 75%, 8 probabilitiesphase4-v2: forecast 73%, observed 100%, 4 probabilitiesphase4-v2: forecast 84%, observed 100%, 3 probabilitiesclosing market: forecast 11%, observed 6%, 18 probabilitiesclosing market: forecast 30%, observed 24%, 25 probabilitiesclosing market: forecast 52%, observed 80%, 5 probabilitiesclosing market: forecast 71%, observed 80%, 5 probabilitiesclosing market: forecast 86%, observed 100%, 4 probabilities
Retrospective sample (408 scored): pipeline check, not evidence

Retrospective · 408 scored forecast(s) over 88 match(es), 2026-08-07 to 2026-11-01

Retrospective: frozen after the match with the same 24 h cut-off. Useful to check the pipeline, never evidence.

1X2 · RPS

0+0.02+0.04+0.06+0.08e10-dynamic · e10_dynamic: +0.0042 [-0.0002; +0.0093] (88 matches)e10-dynamic · e10_dynamice7-xg · e7_xg: +0.0023 [-0.0024; +0.0080] (81 matches)e7-xg · e7_xgphase2-v1 · base rates: +0.0433 [+0.0090; +0.0757] (79 matches)phase2-v1 · base ratesphase2-v1 · Dixon-Coles: +0.0029 [-0.0059; +0.0114] (79 matches)phase2-v1 · Dixon-Colesphase2-v1 · Elo: +0.0054 [-0.0051; +0.0161] (79 matches)phase2-v1 · Elophase4-v1 · model: +0.0071 [-0.0008; +0.0166] (80 matches)phase4-v1 · modelphase4-v2 · model: +0.0023 [-0.0025; +0.0081] (80 matches)phase4-v2 · modelRPS minus Closing market, no-vig (lower is better)
RPS with its 95% interval; Δ against Closing market, no-vig.
ForecasterMatchesRPSΔlog lossBrier
Closing market, no-vig880.1966[0.1636; 0.2359]—0.93780.5565
e10-dynamic · e10_dynamic880.2008[0.1674; 0.2407]+0.0042[-0.0002; +0.0093]0.95340.5649
e7-xg · e7_xg810.2046[0.1715; 0.2457]+0.0023[-0.0024; +0.0080]0.97640.5814
phase2-v1 · base rates790.2410[0.2218; 0.2604]+0.0433[+0.0090; +0.0757]1.08480.6588
phase2-v1 · Dixon-Coles790.2005[0.1764; 0.2279]+0.0029[-0.0059; +0.0114]0.96770.5762
phase2-v1 · Elo790.2031[0.1707; 0.2376]+0.0054[-0.0051; +0.0161]0.97720.5830
phase4-v1 · model800.2113[0.1731; 0.2575]+0.0071[-0.0008; +0.0166]1.00820.5975
phase4-v2 · model800.2066[0.1715; 0.2521]+0.0023[-0.0025; +0.0081]0.98440.5871

Over/under 2.5 · log loss

-0.020+0.02+0.04e10-dynamic · e10_dynamic: +0.0195 [-0.0006; +0.0365] (88 matches)e10-dynamic · e10_dynamice7-xg · e7_xg: +0.0139 [-0.0089; +0.0344] (81 matches)e7-xg · e7_xgphase2-v1 · base rates: +0.0192 [-0.0166; +0.0540] (79 matches)phase2-v1 · base ratesphase2-v1 · Dixon-Coles: +0.0279 [+0.0010; +0.0537] (79 matches)phase2-v1 · Dixon-Colesphase4-v1 · model: +0.0164 [-0.0052; +0.0357] (80 matches)phase4-v1 · modelphase4-v2 · model: +0.0164 [-0.0052; +0.0357] (80 matches)phase4-v2 · modellog loss minus Closing market, no-vig (lower is better)
log loss with its 95% interval; Δ against Closing market, no-vig.
ForecasterMatcheslog lossΔBrier
Closing market, no-vig880.6671[0.6378; 0.6937]—0.2375
e10-dynamic · e10_dynamic880.6867[0.6506; 0.7169]+0.0195[-0.0006; +0.0365]0.2469
e7-xg · e7_xg810.6794[0.6451; 0.7105]+0.0139[-0.0089; +0.0344]0.2435
phase2-v1 · base rates790.6898[0.6789; 0.7001]+0.0192[-0.0166; +0.0540]0.2483
phase2-v1 · Dixon-Coles790.6985[0.6553; 0.7423]+0.0279[+0.0010; +0.0537]0.2526
phase4-v1 · model800.6835[0.6466; 0.7168]+0.0164[-0.0052; +0.0357]0.2455
phase4-v2 · model800.6835[0.6466; 0.7168]+0.0164[-0.0052; +0.0357]0.2455

Both teams score · log loss

0+0.02+0.04e10-dynamic · e10_dynamic: +0.0019 [-0.0113; +0.0152] (79 matches)e10-dynamic · e10_dynamice7-xg · e7_xg: +0.0019 [-0.0113; +0.0152] (79 matches)e7-xg · e7_xgphase2-v1 · Dixon-Coles: +0.0212 [-0.0034; +0.0458] (79 matches)phase2-v1 · Dixon-Colesphase4-v1 · model: +0.0019 [-0.0113; +0.0152] (79 matches)phase4-v1 · modelphase4-v2 · model: +0.0019 [-0.0113; +0.0152] (79 matches)phase4-v2 · modellog loss minus phase2-v1 · base rates (lower is better)
log loss with its 95% interval; Δ against phase2-v1 · base rates.
ForecasterMatcheslog lossΔBrier
e10-dynamic · e10_dynamic880.6929[0.6815; 0.7050]+0.0019[-0.0113; +0.0152]0.2499
e7-xg · e7_xg810.6945[0.6817; 0.7079]+0.0019[-0.0113; +0.0152]0.2507
phase2-v1 · base rates790.6932[0.6927; 0.6938]—0.2500
phase2-v1 · Dixon-Coles790.7144[0.6902; 0.7387]+0.0212[-0.0034; +0.0458]0.2602
phase4-v1 · model800.6942[0.6809; 0.7078]+0.0019[-0.0113; +0.0152]0.2505
phase4-v2 · model800.6942[0.6809; 0.7078]+0.0019[-0.0113; +0.0152]0.2505

Running gap to the market (1X2)

Mean of RPS minus closing RPS over the matches scored so far. Below zero is better than the market.

e10-dynamice7-xgphase2-v1phase4-v1phase4-v2closing market (zero)
0+0.05020406080matches scorede10-dynamic: +0.0050 after 1 matches (to 2026-08-07)e10-dynamic: +0.0571 after 4 matches (to 2026-08-08)e10-dynamic: +0.0209 after 8 matches (to 2026-08-09)e10-dynamic: +0.0193 after 9 matches (to 2026-08-10)e10-dynamic: +0.0139 after 10 matches (to 2026-08-14)e10-dynamic: +0.0112 after 13 matches (to 2026-08-15)e10-dynamic: +0.0085 after 16 matches (to 2026-08-16)e10-dynamic: +0.0084 after 17 matches (to 2026-08-17)e10-dynamic: +0.0090 after 20 matches (to 2026-08-22)e10-dynamic: +0.0072 after 23 matches (to 2026-08-23)e10-dynamic: +0.0065 after 24 matches (to 2026-08-24)e10-dynamic: +0.0065 after 25 matches (to 2026-08-28)e10-dynamic: +0.0067 after 28 matches (to 2026-08-29)e10-dynamic: +0.0066 after 31 matches (to 2026-08-30)e10-dynamic: +0.0061 after 33 matches (to 2026-08-31)e10-dynamic: +0.0061 after 34 matches (to 2026-09-04)e10-dynamic: +0.0070 after 38 matches (to 2026-09-05)e10-dynamic: +0.0077 after 41 matches (to 2026-09-06)e10-dynamic: +0.0076 after 42 matches (to 2026-09-07)e10-dynamic: +0.0076 after 43 matches (to 2026-09-09)e10-dynamic: +0.0056 after 44 matches (to 2026-09-10)e10-dynamic: +0.0064 after 47 matches (to 2026-09-12)e10-dynamic: +0.0058 after 50 matches (to 2026-09-13)e10-dynamic: +0.0049 after 53 matches (to 2026-09-14)e10-dynamic: +0.0050 after 57 matches (to 2026-09-19)e10-dynamic: +0.0042 after 62 matches (to 2026-09-20)e10-dynamic: +0.0036 after 64 matches (to 2026-10-09)e10-dynamic: +0.0033 after 67 matches (to 2026-10-10)e10-dynamic: +0.0035 after 70 matches (to 2026-10-11)e10-dynamic: +0.0037 after 71 matches (to 2026-10-12)e10-dynamic: +0.0046 after 72 matches (to 2026-10-19)e10-dynamic: +0.0046 after 73 matches (to 2026-10-23)e10-dynamic: +0.0051 after 76 matches (to 2026-10-24)e10-dynamic: +0.0044 after 80 matches (to 2026-10-25)e10-dynamic: +0.0043 after 81 matches (to 2026-10-26)e10-dynamic: +0.0042 after 82 matches (to 2026-10-30)e10-dynamic: +0.0039 after 84 matches (to 2026-10-31)e10-dynamic: +0.0042 after 88 matches (to 2026-11-01)e7-xg: +0.0110 after 1 matches (to 2026-08-07)e7-xg: +0.0525 after 4 matches (to 2026-08-08)e7-xg: +0.0186 after 8 matches (to 2026-08-09)e7-xg: +0.0172 after 9 matches (to 2026-08-10)e7-xg: +0.0126 after 10 matches (to 2026-08-14)e7-xg: +0.0099 after 13 matches (to 2026-08-15)e7-xg: +0.0075 after 16 matches (to 2026-08-16)e7-xg: +0.0074 after 17 matches (to 2026-08-17)e7-xg: +0.0069 after 20 matches (to 2026-08-22)e7-xg: +0.0054 after 23 matches (to 2026-08-23)e7-xg: +0.0047 after 24 matches (to 2026-08-24)e7-xg: +0.0048 after 25 matches (to 2026-08-28)e7-xg: +0.0050 after 28 matches (to 2026-08-29)e7-xg: +0.0050 after 31 matches (to 2026-08-30)e7-xg: +0.0046 after 33 matches (to 2026-08-31)e7-xg: +0.0047 after 34 matches (to 2026-09-04)e7-xg: +0.0053 after 38 matches (to 2026-09-05)e7-xg: +0.0062 after 41 matches (to 2026-09-06)e7-xg: +0.0061 after 42 matches (to 2026-09-07)e7-xg: +0.0061 after 43 matches (to 2026-09-09)e7-xg: +0.0041 after 44 matches (to 2026-09-10)e7-xg: +0.0044 after 47 matches (to 2026-09-12)e7-xg: +0.0039 after 50 matches (to 2026-09-13)e7-xg: +0.0031 after 53 matches (to 2026-09-14)e7-xg: +0.0032 after 57 matches (to 2026-09-19)e7-xg: +0.0025 after 62 matches (to 2026-09-20)e7-xg: +0.0017 after 64 matches (to 2026-10-09)e7-xg: +0.0013 after 67 matches (to 2026-10-10)e7-xg: +0.0016 after 70 matches (to 2026-10-11)e7-xg: +0.0018 after 71 matches (to 2026-10-12)e7-xg: +0.0027 after 72 matches (to 2026-10-19)e7-xg: +0.0030 after 73 matches (to 2026-10-23)e7-xg: +0.0029 after 76 matches (to 2026-10-24)e7-xg: +0.0023 after 80 matches (to 2026-10-25)e7-xg: +0.0023 after 81 matches (to 2026-10-26)phase2-v1: -0.0127 after 1 matches (to 2026-08-07)phase2-v1: +0.0457 after 4 matches (to 2026-08-08)phase2-v1: +0.0169 after 8 matches (to 2026-08-09)phase2-v1: +0.0131 after 9 matches (to 2026-08-10)phase2-v1: +0.0094 after 10 matches (to 2026-08-14)phase2-v1: +0.0056 after 13 matches (to 2026-08-15)phase2-v1: +0.0078 after 16 matches (to 2026-08-16)phase2-v1: +0.0080 after 17 matches (to 2026-08-17)phase2-v1: +0.0037 after 20 matches (to 2026-08-22)phase2-v1: +0.0032 after 23 matches (to 2026-08-23)phase2-v1: +0.0047 after 24 matches (to 2026-08-24)phase2-v1: +0.0041 after 25 matches (to 2026-08-28)phase2-v1: +0.0012 after 28 matches (to 2026-08-29)phase2-v1: +0.0020 after 31 matches (to 2026-08-30)phase2-v1: +0.0006 after 33 matches (to 2026-08-31)phase2-v1: +0.0007 after 34 matches (to 2026-09-04)phase2-v1: -0.0005 after 38 matches (to 2026-09-05)phase2-v1: +0.0029 after 41 matches (to 2026-09-06)phase2-v1: +0.0025 after 42 matches (to 2026-09-07)phase2-v1: +0.0030 after 43 matches (to 2026-09-09)phase2-v1: +0.0037 after 44 matches (to 2026-09-10)phase2-v1: +0.0060 after 47 matches (to 2026-09-12)phase2-v1: +0.0080 after 50 matches (to 2026-09-13)phase2-v1: +0.0048 after 53 matches (to 2026-09-14)phase2-v1: +0.0076 after 57 matches (to 2026-09-19)phase2-v1: +0.0043 after 62 matches (to 2026-09-20)phase2-v1: +0.0051 after 64 matches (to 2026-10-09)phase2-v1: +0.0073 after 67 matches (to 2026-10-10)phase2-v1: +0.0065 after 70 matches (to 2026-10-11)phase2-v1: +0.0070 after 71 matches (to 2026-10-12)phase2-v1: +0.0092 after 72 matches (to 2026-10-19)phase2-v1: +0.0090 after 73 matches (to 2026-10-23)phase2-v1: +0.0060 after 76 matches (to 2026-10-24)phase2-v1: +0.0054 after 79 matches (to 2026-10-25)phase4-v1: -0.0127 after 1 matches (to 2026-08-07)phase4-v1: +0.0457 after 4 matches (to 2026-08-08)phase4-v1: +0.0169 after 8 matches (to 2026-08-09)phase4-v1: +0.0131 after 9 matches (to 2026-08-10)phase4-v1: +0.0094 after 10 matches (to 2026-08-14)phase4-v1: +0.0056 after 13 matches (to 2026-08-15)phase4-v1: +0.0078 after 16 matches (to 2026-08-16)phase4-v1: +0.0080 after 17 matches (to 2026-08-17)phase4-v1: +0.0037 after 20 matches (to 2026-08-22)phase4-v1: +0.0032 after 23 matches (to 2026-08-23)phase4-v1: +0.0047 after 24 matches (to 2026-08-24)phase4-v1: +0.0041 after 25 matches (to 2026-08-28)phase4-v1: +0.0012 after 28 matches (to 2026-08-29)phase4-v1: +0.0020 after 31 matches (to 2026-08-30)phase4-v1: +0.0006 after 33 matches (to 2026-08-31)phase4-v1: +0.0007 after 34 matches (to 2026-09-04)phase4-v1: -0.0005 after 38 matches (to 2026-09-05)phase4-v1: +0.0029 after 41 matches (to 2026-09-06)phase4-v1: +0.0025 after 42 matches (to 2026-09-07)phase4-v1: +0.0030 after 43 matches (to 2026-09-09)phase4-v1: +0.0037 after 44 matches (to 2026-09-10)phase4-v1: +0.0060 after 47 matches (to 2026-09-12)phase4-v1: +0.0080 after 50 matches (to 2026-09-13)phase4-v1: +0.0048 after 53 matches (to 2026-09-14)phase4-v1: +0.0076 after 57 matches (to 2026-09-19)phase4-v1: +0.0043 after 62 matches (to 2026-09-20)phase4-v1: +0.0051 after 64 matches (to 2026-10-09)phase4-v1: +0.0073 after 67 matches (to 2026-10-10)phase4-v1: +0.0065 after 70 matches (to 2026-10-11)phase4-v1: +0.0070 after 71 matches (to 2026-10-12)phase4-v1: +0.0092 after 72 matches (to 2026-10-19)phase4-v1: +0.0090 after 73 matches (to 2026-10-23)phase4-v1: +0.0060 after 76 matches (to 2026-10-24)phase4-v1: +0.0071 after 80 matches (to 2026-10-25)phase4-v2: +0.0110 after 1 matches (to 2026-08-07)phase4-v2: +0.0525 after 4 matches (to 2026-08-08)phase4-v2: +0.0186 after 8 matches (to 2026-08-09)phase4-v2: +0.0172 after 9 matches (to 2026-08-10)phase4-v2: +0.0126 after 10 matches (to 2026-08-14)phase4-v2: +0.0099 after 13 matches (to 2026-08-15)phase4-v2: +0.0075 after 16 matches (to 2026-08-16)phase4-v2: +0.0074 after 17 matches (to 2026-08-17)phase4-v2: +0.0069 after 20 matches (to 2026-08-22)phase4-v2: +0.0054 after 23 matches (to 2026-08-23)phase4-v2: +0.0047 after 24 matches (to 2026-08-24)phase4-v2: +0.0048 after 25 matches (to 2026-08-28)phase4-v2: +0.0050 after 28 matches (to 2026-08-29)phase4-v2: +0.0050 after 31 matches (to 2026-08-30)phase4-v2: +0.0046 after 33 matches (to 2026-08-31)phase4-v2: +0.0047 after 34 matches (to 2026-09-04)phase4-v2: +0.0053 after 38 matches (to 2026-09-05)phase4-v2: +0.0062 after 41 matches (to 2026-09-06)phase4-v2: +0.0061 after 42 matches (to 2026-09-07)phase4-v2: +0.0061 after 43 matches (to 2026-09-09)phase4-v2: +0.0041 after 44 matches (to 2026-09-10)phase4-v2: +0.0044 after 47 matches (to 2026-09-12)phase4-v2: +0.0039 after 50 matches (to 2026-09-13)phase4-v2: +0.0031 after 53 matches (to 2026-09-14)phase4-v2: +0.0032 after 57 matches (to 2026-09-19)phase4-v2: +0.0025 after 62 matches (to 2026-09-20)phase4-v2: +0.0017 after 64 matches (to 2026-10-09)phase4-v2: +0.0013 after 67 matches (to 2026-10-10)phase4-v2: +0.0016 after 70 matches (to 2026-10-11)phase4-v2: +0.0018 after 71 matches (to 2026-10-12)phase4-v2: +0.0027 after 72 matches (to 2026-10-19)phase4-v2: +0.0030 after 73 matches (to 2026-10-23)phase4-v2: +0.0029 after 76 matches (to 2026-10-24)phase4-v2: +0.0023 after 80 matches (to 2026-10-25)

Calibration by model version (1X2, every outcome)

Five bins; few matches per bin, so read the shape, not the points.

e10-dynamice7-xgphase2-v1phase4-v1phase4-v2closing marketperfect calibration
0%0%25%25%50%50%75%75%100%100%forecastobservede10-dynamic: forecast 12%, observed 14%, 65 probabilitiese10-dynamic: forecast 28%, observed 29%, 124 probabilitiese10-dynamic: forecast 49%, observed 48%, 44 probabilitiese10-dynamic: forecast 70%, observed 59%, 17 probabilitiese10-dynamic: forecast 83%, observed 86%, 14 probabilitiese7-xg: forecast 12%, observed 12%, 58 probabilitiese7-xg: forecast 28%, observed 32%, 117 probabilitiese7-xg: forecast 49%, observed 44%, 39 probabilitiese7-xg: forecast 69%, observed 50%, 14 probabilitiese7-xg: forecast 83%, observed 87%, 15 probabilitiesphase2-v1: forecast 11%, observed 18%, 61 probabilitiesphase2-v1: forecast 30%, observed 31%, 116 probabilitiesphase2-v1: forecast 48%, observed 32%, 31 probabilitiesphase2-v1: forecast 72%, observed 75%, 16 probabilitiesphase2-v1: forecast 85%, observed 77%, 13 probabilitiesphase4-v1: forecast 11%, observed 19%, 63 probabilitiesphase4-v1: forecast 30%, observed 31%, 116 probabilitiesphase4-v1: forecast 48%, observed 32%, 31 probabilitiesphase4-v1: forecast 72%, observed 75%, 16 probabilitiesphase4-v1: forecast 85%, observed 71%, 14 probabilitiesphase4-v2: forecast 11%, observed 12%, 56 probabilitiesphase4-v2: forecast 28%, observed 32%, 117 probabilitiesphase4-v2: forecast 49%, observed 44%, 39 probabilitiesphase4-v2: forecast 69%, observed 46%, 13 probabilitiesphase4-v2: forecast 83%, observed 87%, 15 probabilitiesclosing market: forecast 12%, observed 13%, 68 probabilitiesclosing market: forecast 29%, observed 28%, 123 probabilitiesclosing market: forecast 49%, observed 51%, 39 probabilitiesclosing market: forecast 69%, observed 60%, 20 probabilitiesclosing market: forecast 86%, observed 86%, 14 probabilities
Holdout · 2024/25 and 2025/26

Holdout · 2024/25 and 2025/26

The two most recent seasons were kept closed while every model choice was made, then opened once with the model fixed in a commit. Walk-forward: each forecast uses only data available 24 h before kick-off. 95% intervals from a weekly block bootstrap. Differences are model minus the closing market; negative is better.

The claim, by season (1X2 Δ RPS)

0+0.005+0.0102024/25 (306 matches): +0.0056 [-0.0002; +0.0118]2024/25 (306 matches)2025/26 (306 matches): +0.0027 [-0.0037; +0.0097]2025/26 (306 matches)Both (612 matches): +0.0041 [-0.0002; +0.0089]Both (612 matches)RPS of phase4-v1 minus closing RPS (lower is better)

1X2 · all models against the closing market

0+0.02+0.04+0.06Base rates: +0.0542 [+0.0420; +0.0659]Base ratesElo (phase2-v1 = phase4-v1): +0.0041 [-0.0002; +0.0088]Elo (phase2-v1 = phase4-v1)Dixon-Coles: +0.0061 [+0.0023; +0.0098]Dixon-ColesPre-closing odds, no-vig (Elo where late): +0.0036 [+0.0003; +0.0065]Pre-closing odds, no-vig (Elo where late)RPS minus closing RPS (lower is better)
612 matches; Δ against the closing market.
ModelRPSΔ RPSLog lossΔ log lossBrierΔ Brier
Base rates0.2300[0.2241; 0.2358]+0.0542[+0.0420; +0.0659]1.0830[1.0633; 1.1042]+0.1706[+0.1349; +0.2057]0.6558[0.6430; 0.6697]+0.1156[+0.0906; +0.1402]
Elo (phase2-v1 = phase4-v1)0.1800[0.1689; 0.1906]+0.0041[-0.0002; +0.0088]0.9256[0.8806; 0.9721]+0.0132[-0.0018; +0.0296]0.5477[0.5158; 0.5792]+0.0076[-0.0024; +0.0182]
Dixon-Coles0.1819[0.1711; 0.1923]+0.0061[+0.0023; +0.0098]0.9379[0.8926; 0.9833]+0.0255[+0.0132; +0.0376]0.5546[0.5230; 0.5860]+0.0144[+0.0061; +0.0225]
Pre-closing odds, no-vig (Elo where late)0.1794[0.1687; 0.1900]+0.0036[+0.0003; +0.0065]0.9227[0.8790; 0.9665]+0.0103[-0.0010; +0.0206]0.5474[0.5169; 0.5776]+0.0072[-0.0003; +0.0143]
Closing market, no-vig (AvgC)0.1758[0.1655; 0.1864]—0.9124[0.8675; 0.9573]—0.5401[0.5087; 0.5717]—

Over/under 2.5 · secondary

Binary log loss; Δ against the closing market.
ModelLog lossΔECE
Base rates0.6928[0.6919; 0.6938]+0.0289[+0.0128; +0.0434]0.0082
Dixon-Coles (phase2-v1)0.6772[0.6561; 0.7006]+0.0133[+0.0013; +0.0266]0.0406
Market as prior (phase4-v1)0.6719[0.6554; 0.6912]+0.0079[-0.0010; +0.0172]0.0361
Pre-closing odds, no-vig (Dixon-Coles where late)0.6721[0.6559; 0.6913]+0.0081[-0.0008; +0.0175]0.0352
Closing market, no-vig (AvgC)0.6640[0.6493; 0.6800]—0.0439

Both teams score · secondary

Binary log loss; Δ against base rates (no odds).
ModelLog lossΔECE
Base rates0.6928[0.6913; 0.6943]—0.0082
Dixon-Coles (phase2-v1)0.6965[0.6838; 0.7100]+0.0037[-0.0086; +0.0170]0.0534
Partial pooling (phase4-v1)0.6933[0.6848; 0.7018]+0.0005[-0.0080; +0.0089]0.0235

Calibration of phase4-v1

Mean forecast against observed frequency in 10-point bins; the dashed diagonal is perfect calibration. Hover a point for its numbers.

Home win

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v1: 0% to 10%: forecast 7%, observed 10%, 76 matchesphase4-v1: 10% to 20%: forecast 14%, observed 14%, 35 matchesphase4-v1: 20% to 30%: forecast 26%, observed 32%, 34 matchesphase4-v1: 30% to 40%: forecast 37%, observed 35%, 130 matchesphase4-v1: 40% to 50%: forecast 44%, observed 40%, 176 matchesphase4-v1: 50% to 60%: forecast 55%, observed 57%, 35 matchesphase4-v1: 60% to 70%: forecast 63%, observed 58%, 19 matchesphase4-v1: 70% to 80%: forecast 75%, observed 68%, 28 matchesphase4-v1: 80% to 90%: forecast 86%, observed 88%, 74 matchesphase4-v1: 90% to 100%: forecast 91%, observed 80%, 5 matches

Draw

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v1: 0% to 10%: forecast 9%, observed 13%, 54 matchesphase4-v1: 10% to 20%: forecast 14%, observed 15%, 134 matchesphase4-v1: 20% to 30%: forecast 28%, observed 32%, 248 matchesphase4-v1: 30% to 40%: forecast 30%, observed 32%, 176 matches

Away win

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v1: 0% to 10%: forecast 5%, observed 4%, 106 matchesphase4-v1: 10% to 20%: forecast 16%, observed 11%, 44 matchesphase4-v1: 20% to 30%: forecast 26%, observed 25%, 191 matchesphase4-v1: 30% to 40%: forecast 33%, observed 36%, 126 matchesphase4-v1: 40% to 50%: forecast 45%, observed 29%, 34 matchesphase4-v1: 50% to 60%: forecast 58%, observed 56%, 9 matchesphase4-v1: 60% to 70%: forecast 64%, observed 70%, 23 matchesphase4-v1: 70% to 80%: forecast 76%, observed 80%, 56 matchesphase4-v1: 80% to 90%: forecast 82%, observed 65%, 23 matches

Over 2.5

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v1: 20% to 30%: forecast 27%, observed 62%, 8 matchesphase4-v1: 30% to 40%: forecast 37%, observed 36%, 126 matchesphase4-v1: 40% to 50%: forecast 45%, observed 45%, 249 matchesphase4-v1: 50% to 60%: forecast 54%, observed 64%, 144 matchesphase4-v1: 60% to 70%: forecast 64%, observed 68%, 68 matchesphase4-v1: 70% to 80%: forecast 73%, observed 80%, 15 matchesphase4-v1: 80% to 90%: forecast 83%, observed 50%, 2 matches

Both teams score

0%0%25%25%50%50%75%75%100%100%forecastobservedphase4-v1: 30% to 40%: forecast 38%, observed 72%, 25 matchesphase4-v1: 40% to 50%: forecast 46%, observed 46%, 411 matchesphase4-v1: 50% to 60%: forecast 53%, observed 51%, 174 matchesphase4-v1: 60% to 70%: forecast 62%, observed 100%, 2 matches
Expected calibration error by 1X2 outcome (lower is better).
ForecasterHome winDrawAway win
phase4-v10.03400.02580.0371
Closing market, no-vig (AvgC)0.04580.03510.0498

Favourites

Mean probability given to the closing market's favourite, by the market's band.
Market bandMatchesMarketEloDixon-ColesWon
0% to 40%11137%36%38%37%
40% to 50%17245%41%44%50%
50% to 60%10855%50%53%44%
60% to 70%7365%67%62%73%
70% to 80%6775%78%72%72%
80% to 100%8185%85%82%90%

Closing-line value proxy · secondary

Where the model gave an outcome more probability than the pre-closing odds: how far the market moved towards it by kick-off (positive is towards the model).

MarketMatchesOutcomesMean move
1X2369569-0.0011[-0.0034; +0.0013]
Over/under 2.5369369+0.0039[+0.0014; +0.0066]
Every match against the market

Played matches

The next matches and those waiting for a result are on the Matches page. The phase4-v2 1X2 forecast next to the no-vig closing market; the actual outcome is highlighted. RPS per match: lower is better. Status: valid if frozen in time before kick-off, retrospective if frozen after the match (a pipeline check); any other status flags a timing problem.

Kick-offMatchScoreStatusModelClosing marketRPS
1X21X2modelmarket
Sun 2026-11-08 20:30Rio Ave – Sporting de Braga0–1valid 15%21%63%14%21%65% 0.0790.072
Sun 2026-11-08 20:30Estrela da Amadora – Benfica2–3valid 8%14%79%6%11%83% 0.0260.016
Sun 2026-11-08 18:00Vitória SC – Porto1–2valid 18%23%59%14%21%65% 0.1010.073
Sun 2026-11-08 15:30Santa Clara – Gil Vicente1–2valid 43%30%27%39%31%30% 0.3570.322
Sat 2026-11-07 15:30Nacional – Académico de Viseu1–0valid 32%29%39%32%30%38% 0.3120.303
Sat 2026-11-07 20:30Sporting – Moreirense1–0valid 85%10%5%87%9%4% 0.0130.009
Sat 2026-11-07 18:00Alverca – Casa Pia1–1valid 55%25%19%53%26%21% 0.1720.163
Fri 2026-11-06 20:45Famalicão – Arouca1–0valid 51%27%22%38%30%31% 0.1460.239
Mon 2026-11-02 20:15Gil Vicente – Vitória SC0–0valid 33%29%38%32%29%39% 0.1260.126
Mon 2026-11-02 20:15Benfica – Alverca1–0valid 84%10%5%88%8%4% 0.0140.008
Sun 2026-11-01 20:30Sporting de Braga – Famalicão3–0valid 54%27%19%56%25%19% 0.1250.117
Sun 2026-11-01 18:00Marítimo – Santa Clara0–2valid 28%30%42%30%30%40% 0.2080.222
Sun 2026-11-01 18:00Académico de Viseu – Rio Ave2–1valid 50%26%24%52%26%23% 0.1530.143
Sun 2026-11-01 15:30Arouca – Nacional1–0valid 53%25%22%60%23%17% 0.1330.095
Sat 2026-10-31 20:30Porto – Estoril Praia4–0valid 82%13%5%87%9%4% 0.0170.009
Sat 2026-10-31 15:30Moreirense – Estrela da Amadora2–1valid 34%28%39%34%28%38% 0.2950.293
Fri 2026-10-30 20:15Casa Pia – Sporting0–2valid 8%14%78%9%16%75% 0.0270.036
Mon 2026-10-26 18:45Santa Clara – Benfica1–2valid 10%19%71%11%18%72% 0.0460.046
Sun 2026-10-25 20:30Sporting – Académico de Viseu1–2retrospective 79%14%7%78%14%8% 0.7440.724
Sun 2026-10-25 18:00Rio Ave – Famalicão0–4retrospective 25%28%47%26%27%46% 0.1730.178
78 older row(s)
Kick-offMatchScoreStatusModelClosing marketRPS
1X21X2modelmarket
Sun 2026-10-25 18:00Nacional – Sporting de Braga1–0retrospective 16%23%62%14%21%64% 0.5460.574
Sun 2026-10-25 15:30Estoril Praia – Moreirense1–3retrospective 49%26%24%51%26%22% 0.4070.433
Sat 2026-10-24 20:30Gil Vicente – Porto0–1retrospective 12%20%68%12%21%67% 0.0600.061
Sat 2026-10-24 18:00Alverca – Arouca0–1retrospective 43%29%28%43%28%29% 0.3540.345
Sat 2026-10-24 15:30Estrela da Amadora – Casa Pia0–2retrospective 53%26%21%53%25%21% 0.4540.454
Fri 2026-10-23 20:45Vitória SC – Marítimo5–0retrospective 57%25%18%61%23%16% 0.1070.088
Mon 2026-10-19 20:15Sporting de Braga – Gil Vicente1–2retrospective 61%23%15%55%26%19% 0.5460.478
Mon 2026-10-12 20:15Famalicão – Alverca1–4retrospective 52%27%21%50%28%22% 0.4500.431
Sun 2026-10-11 20:30Arouca – Estrela da Amadora1–0retrospective 45%27%28%45%27%28% 0.1890.191
Sun 2026-10-11 18:00Benfica – Vitória SC2–0retrospective 81%13%6%81%12%7% 0.0210.021
Sun 2026-10-11 15:30Rio Ave – Nacional3–2retrospective 42%28%30%45%28%27% 0.2130.185
Sat 2026-10-10 20:30Casa Pia – Santa Clara0–1retrospective 21%28%52%25%29%46% 0.1390.179
Sat 2026-10-10 20:30Académico de Viseu – Estoril Praia2–1retrospective 42%27%31%44%27%28% 0.2150.195
Sat 2026-10-10 18:00Marítimo – Porto1–2retrospective 9%16%76%8%17%75% 0.0340.035
Fri 2026-10-09 20:15Sporting de Braga – Sporting1–3retrospective 24%28%49%32%30%39% 0.1600.238
Fri 2026-10-09 18:45Moreirense – Gil Vicente0–1retrospective 31%30%39%28%30%42% 0.2350.204
Sun 2026-09-20 20:30Porto – Benfica3–1retrospective 36%27%37%34%28%38% 0.2760.289
Sun 2026-09-20 18:00Santa Clara – Sporting de Braga0–0retrospective 25%29%46%27%29%44% 0.1360.132
Sun 2026-09-20 18:00Estoril Praia – Casa Pia1–2retrospective 55%25%20%57%24%19% 0.4660.486
Sun 2026-09-20 15:30Vitória SC – Moreirense1–1retrospective 64%22%14%65%21%13% 0.2140.222
Sun 2026-09-20 15:30Estrela da Amadora – Académico de Viseu0–2retrospective 45%28%27%44%28%28% 0.3640.355
Sat 2026-09-19 20:30Sporting – Arouca2–2retrospective 81%12%6%85%10%5% 0.3340.364
Sat 2026-09-19 18:00Alverca – Rio Ave1–0retrospective 49%28%23%54%25%20% 0.1540.125
Sat 2026-09-19 15:30Nacional – Famalicão0–4retrospective 26%29%45%23%28%50% 0.1820.151
Sat 2026-09-19 15:30Gil Vicente – Marítimo1–1retrospective 42%29%29%48%28%23% 0.1290.144
Mon 2026-09-14 20:45Sporting de Braga – Estoril Praia1–0retrospective 67%20%13%70%19%11% 0.0630.050
Mon 2026-09-14 20:15Moreirense – Marítimo3–1retrospective 39%29%32%34%30%36% 0.2380.281
Mon 2026-09-14 18:45Rio Ave – Estrela da Amadora3–3retrospective 34%28%37%33%29%38% 0.1280.128
Sun 2026-09-13 20:30Famalicão – Sporting1–1retrospective 16%21%63%15%22%63% 0.2120.212
Sun 2026-09-13 18:00Benfica – Gil Vicente3–1retrospective 87%10%4%88%9%4% 0.0090.008
Sun 2026-09-13 18:00Arouca – Santa Clara1–2retrospective 36%30%34%37%30%33% 0.2840.296
Sat 2026-09-12 20:30Académico de Viseu – Vitória SC2–1retrospective 25%27%47%25%28%46% 0.3890.387
Sat 2026-09-12 18:00Casa Pia – Porto1–4retrospective 7%13%80%5%12%84% 0.0220.015
Sat 2026-09-12 15:30Nacional – Alverca1–3retrospective 34%30%36%34%28%38% 0.2640.248
Thu 2026-09-10 20:15Estrela da Amadora – Sporting de Braga2–1retrospective 19%25%56%15%23%62% 0.4800.559
Wed 2026-09-09 20:45Moreirense – Benfica0–4retrospective 5%11%84%4%9%88% 0.0130.008
Mon 2026-09-07 20:15Estoril Praia – Arouca0–0retrospective 42%27%31%39%27%34% 0.1360.134
Sun 2026-09-06 20:30Gil Vicente – Académico de Viseu0–1retrospective 51%27%23%39%31%29% 0.4260.328
Sun 2026-09-06 18:00Vitória SC – Casa Pia0–0retrospective 64%22%13%67%21%12% 0.2150.229
Sun 2026-09-06 15:30Santa Clara – Rio Ave4–0retrospective 55%26%19%49%29%22% 0.1220.154
Sat 2026-09-05 20:30Sporting – Nacional2–0retrospective 81%12%6%89%8%3% 0.0190.007
Sat 2026-09-05 18:00Marítimo – Benfica0–3retrospective 6%13%81%5%11%84% 0.0200.015
Sat 2026-09-05 18:00Alverca – Sporting de Braga1–2retrospective 21%27%53%19%26%55% 0.1340.117
Sat 2026-09-05 15:30Estrela da Amadora – Famalicão2–2retrospective 27%29%44%32%29%39% 0.1340.126
Fri 2026-09-04 20:15Porto – Moreirense2–1retrospective 84%11%5%88%9%3% 0.0140.007
Mon 2026-08-31 20:15Sporting de Braga – Vitória SC1–0retrospective 56%25%19%53%27%20% 0.1170.130
Mon 2026-08-31 20:15Benfica – Estoril Praia2–1retrospective 84%11%5%90%7%3% 0.0140.005
Sun 2026-08-30 20:30Famalicão – Gil Vicente0–0retrospective 44%29%27%52%28%20% 0.1340.155
Sun 2026-08-30 18:00Casa Pia – Moreirense0–1retrospective 40%30%30%36%30%33% 0.3240.289
Sun 2026-08-30 15:30Nacional – Estrela da Amadora2–3retrospective 41%28%31%40%29%31% 0.3240.320
Sat 2026-08-29 18:00Académico de Viseu – Porto0–3retrospective 10%17%73%8%17%74% 0.0410.037
Sat 2026-08-29 15:30Arouca – Marítimo2–1retrospective 44%29%27%46%28%26% 0.1960.179
Sat 2026-08-29 15:30Alverca – Santa Clara1–1retrospective 35%30%35%40%30%30% 0.1230.126
Fri 2026-08-28 20:15Rio Ave – Sporting0–4retrospective 11%18%71%10%16%74% 0.0470.039
Mon 2026-08-24 20:15Gil Vicente – Casa Pia2–0retrospective 57%26%17%55%27%18% 0.1080.119
Sun 2026-08-23 20:30Porto – Arouca2–0retrospective 81%14%6%77%16%8% 0.0210.031
Sun 2026-08-23 18:00Santa Clara – Famalicão1–0retrospective 36%31%33%33%31%35% 0.2630.285
Sun 2026-08-23 15:30Vitória SC – Nacional1–0retrospective 57%24%19%61%23%16% 0.1100.091
Sat 2026-08-22 20:30Sporting – Alverca3–1retrospective 81%12%6%80%13%7% 0.0200.022
Sat 2026-08-22 18:00Estoril Praia – Rio Ave0–2retrospective 51%27%22%49%26%25% 0.4300.400
Sat 2026-08-22 15:30Marítimo – Académico de Viseu2–2retrospective 42%31%27%47%29%24% 0.1250.141
Mon 2026-08-17 20:15Casa Pia – Benfica0–7retrospective 6%13%81%5%11%84% 0.0210.015
Sun 2026-08-16 20:30Famalicão – Marítimo1–2retrospective 54%26%20%56%26%18% 0.4600.490
Sun 2026-08-16 18:00Arouca – Moreirense4–0retrospective 46%28%26%54%26%20% 0.1820.128
Sun 2026-08-16 15:30Nacional – Estoril Praia2–0retrospective 36%28%37%32%28%40% 0.2740.307
Sat 2026-08-15 20:30Rio Ave – Porto0–2retrospective 11%19%69%10%18%72% 0.0540.043
Sat 2026-08-15 18:00Académico de Viseu – Santa Clara0–1retrospective 34%32%34%35%31%35% 0.2770.273
Sat 2026-08-15 15:30Alverca – Estrela da Amadora2–2retrospective 39%30%31%45%28%26% 0.1250.137
Fri 2026-08-14 20:15Sporting – Vitória SC3–2retrospective 80%13%7%70%18%12% 0.0220.051
Mon 2026-08-10 20:15Santa Clara – Nacional2–2retrospective 51%27%21%51%29%20% 0.1550.149
Sun 2026-08-09 20:30Moreirense – Sporting de Braga2–2retrospective 19%25%56%14%23%63% 0.1770.208
Sun 2026-08-09 20:30Gil Vicente – Rio Ave1–0retrospective 49%27%24%45%28%26% 0.1580.184
Sun 2026-08-09 20:30Benfica – Académico de Viseu2–2retrospective 89%8%3%89%8%3% 0.3990.400
Sun 2026-08-09 18:00Porto – Alverca2–0retrospective 83%12%5%82%13%5% 0.0150.018
Sat 2026-08-08 20:30Estrela da Amadora – Sporting2–2retrospective 7%13%80%9%17%74% 0.3220.276
Sat 2026-08-08 18:00Vitória SC – Arouca0–1retrospective 55%25%20%50%26%24% 0.4660.415
Sat 2026-08-08 15:30Marítimo – Casa Pia1–0retrospective 36%32%32%49%29%23% 0.2590.157
Fri 2026-08-07 20:15Estoril Praia – Famalicão1–1retrospective 27%28%46%32%29%39% 0.1400.129
The season, in detail

Season 2026/27: how the table may finish

The table after 98 results, with the 208 matches left simulated 50,000 times (data to 2026-11-09, UTC). Each club's strength comes from the market's odds on its recent matches and may drift until May; scores follow the Dixon-Coles grid, and ties the league's rules. Frozen in the season ledger as season-s2-v1 after every new result.

Ordered by expected final points. Each place once, as the league allocates it, without the cup: the champion and 2nd go to the Champions, 3rd to its qualifying rounds, 4th to the Europa League and 5th to the Conference League; 16th plays the relegation play-off and 17th and 18th go down. Each row adds up to 100, and an empty cell means less than 1 in 100. The bar is the central 80% interval of the final points and the mark its mean. Each club's name opens its page, with every final position and the head to head with each rival.
#ClubPoints nowPtsChampionTitleRunner-up
2nd
Champions qualifying
3rd
Europa
4th
Conference
5th
Mid-table
6th–15th
Relegation play-off16thRelegationDownFinal points (80%)
1 Porto 33 59%38%4% 86.3 (80–93)
2 Benfica 28 40%55%5% 84.9 (79–91)
3 Sporting 24 1%7%87%4% 72.3 (65–79)
4 Sporting de Braga 17 3%55%21%21% 57.5 (50–65)
5 Santa Clara 21 13%22%64% 51.0 (43–59)
6 Arouca 20 9%16%74% 49.5 (42–57)
7 Gil Vicente 18 8%15%77% 48.7 (41–57)
8 Académico de Viseu 20 5%11%84% 47.3 (40–55)
9 Vitória SC 9 3%7%88%1% 45.4 (37–53)
10 Famalicão 13 2%5%92%1%1% 43.7 (36–51)
11 Alverca 12 1%2%93%3%2% 40.3 (33–48)
12 Moreirense 14 84%8%8% 35.9 (29–43)
13 Estrela da Amadora 10 81%9%10% 35.5 (28–43)
14 Marítimo 8 74%11%14% 34.4 (27–42)
15 Nacional 10 48%17%35% 30.1 (23–37)
16 Casa Pia 8 46%17%37% 29.8 (23–37)
17 Rio Ave 7 39%17%43% 28.8 (22–36)
18 Estoril Praia 2 34%15%50% 28.1 (20–36)

What the next matches put at stake

For each match of the next week, the season chances that move most with its result. They are counted again in the simulations that drew each result, so several matches stay consistent with each other; the percentages under the teams are how often the simulations drew each result.

2026-11-09
Estoril PraiavsMarítimo
now1X2
Estoril Praia · Relegation50%41%53%60%
Marítimo · Relegation14%19%14%8%
2026-11-27
MarítimovsNacional
now1X2
Nacional · Relegation35%41%34%23%
Marítimo · Relegation14%10%17%22%
2026-11-28
Académico de ViseuvsAlverca
now1X2
Académico de Viseu · Europe (1st–5th)16%22%14%11%
2026-11-28
AroucavsRio Ave
now1X2
Rio Ave · Relegation43%48%42%31%
Arouca · Europe (1st–5th)26%31%22%18%
Estoril Praia · Relegation50%49%50%54%
2026-11-28
Vitória SCvsEstrela da Amadora
now1X2
Vitória SC · Europe (1st–5th)11%13%8%6%
Estrela da Amadora · Relegation10%12%9%5%
2026-11-28
MoreirensevsSanta Clara
now1X2
Santa Clara · Europe (1st–5th)36%27%32%43%
Moreirense · Relegation8%4%7%10%
Arouca · Europe (1st–5th)26%28%27%24%
2026-11-29
Gil VicentevsEstoril Praia
now1X2
Estoril Praia · Relegation50%56%50%38%
Gil Vicente · Europe (1st–5th)23%29%19%16%
Rio Ave · Relegation43%42%44%46%
2026-11-29
PortovsSporting
now1X2
Porto · Title59%66%54%49%
Benfica · Title40%34%45%48%
Sporting · Champions (1st–2nd)9%5%9%15%
2026-11-30
BenficavsFamalicão
now1X2
Benfica · Title40%42%30%27%
Porto · Title59%57%68%72%
Famalicão · Europe (1st–5th)6%6%8%13%
2026-11-30
Casa PiavsSporting de Braga
now1X2
Casa Pia · Relegation37%23%35%40%
Sporting de Braga · Europe (1st–5th)79%69%74%83%
Rio Ave · Relegation43%47%44%42%

Title chances, result by result

PortoBenficaSporting
0%25%50%75%100%859095results in the tablePorto: 51% after 81 results (to 2026-10-29)Porto: 56% after 88 results (to 2026-11-02)Porto: 53% after 90 results (to 2026-11-03)Porto: 59% after 98 results (to 2026-11-09)Benfica: 46% after 81 results (to 2026-10-29)Benfica: 42% after 88 results (to 2026-11-02)Benfica: 45% after 90 results (to 2026-11-03)Benfica: 40% after 98 results (to 2026-11-09)Sporting: 3% after 81 results (to 2026-10-29)Sporting: 2% after 88 results (to 2026-11-02)Sporting: 2% after 90 results (to 2026-11-03)Sporting: 1% after 98 results (to 2026-11-09)

Relegation chances, result by result

Estoril PraiaRio AveCasa PiaNacionalMarítimo
0%25%50%75%100%859095results in the tableEstoril Praia: 48% after 81 results (to 2026-10-29)Estoril Praia: 50% after 88 results (to 2026-11-02)Estoril Praia: 50% after 90 results (to 2026-11-03)Estoril Praia: 50% after 98 results (to 2026-11-09)Rio Ave: 27% after 81 results (to 2026-10-29)Rio Ave: 31% after 88 results (to 2026-11-02)Rio Ave: 32% after 90 results (to 2026-11-03)Rio Ave: 43% after 98 results (to 2026-11-09)Casa Pia: 47% after 81 results (to 2026-10-29)Casa Pia: 38% after 88 results (to 2026-11-02)Casa Pia: 38% after 90 results (to 2026-11-03)Casa Pia: 37% after 98 results (to 2026-11-09)Nacional: 39% after 81 results (to 2026-10-29)Nacional: 48% after 88 results (to 2026-11-02)Nacional: 49% after 90 results (to 2026-11-03)Nacional: 35% after 98 results (to 2026-11-09)Marítimo: 13% after 81 results (to 2026-10-29)Marítimo: 14% after 88 results (to 2026-11-02)Marítimo: 14% after 90 results (to 2026-11-03)Marítimo: 14% after 98 results (to 2026-11-09)

Can these numbers be trusted?

Before anything was published, the same simulator was tested on 2017/18 to 2023/24 at six moments of each season, with the holdout untouched. The final points fell inside the 80% interval 84% of the time and inside the 90% one 91%.

Clubs leading by 3 points or more were given 85% on average to win the league; 88% of them did (16 cases).

Final-position RPS 0.0712, against 0.0736 for the same simulation driven by Elo (lower is better; the difference is within the noise of seven seasons). A chance is not a promise: a club at 50% misses half the time.

Test forecasts (80)

Made after these matches were played, to test the model before the real record began. They prove nothing and do not count towards our record.