The model makes Bayern München the title favourite, first in 76.0% of 20,000 simulated seasons, ahead of Borussia Dortmund on 21.1% and Bayer Leverkusen on 1.8%. On expected points that is Bayern München 79.9, Borussia Dortmund 72.3, Bayer Leverkusen 60.5. Three clubs finish in the top four more often than not: Bayern München 99.8%, Borussia Dortmund 96.5%, Bayer Leverkusen 65.5%.
At the other end, Borussia Mönchengladbach carries the highest relegation risk at 59.4%, then SC Paderborn 07 on 55.3% and Union Berlin on 49.1%. The bottom club averages 31.7 points to Bayern München's 79.9.
Here's the deal with this simulation: it's a distribution of outcomes, not a single answer. It's useful for seeing how wide a club's range of possible finishes is. It's not a crystal ball. It doesn't know about upcoming fixtures, injuries, or suspensions. It's just a way to see the spread of possibilities based on the data we've got. Think of it as a reality check. It shows you what could happen, not what will happen. It's worth paying attention to, especially if you're building an acca or a bet builder. It helps you understand the risk and the range. But don't mistake it for a tip or a prediction. Use it to inform your selections, not to make them for you.
What has changed since August
The pre-season projection was run before a ball was kicked. 36 matches later, these are the clubs the model has most changed its mind about. Movement is in expected finishing position, which is measured against the rest of the division, so it reflects a changed view rather than simply games being played.
Rising
- SC Freiburg up 3.5 places, expected points 44.5 to 53.3. 10 points from 4 games. Relegation risk down from 9.3% to 0.7%.
- FC Augsburg up 2.4 places, expected points 40.4 to 46.1. 7 points from 4 games. Relegation risk down from 19.2% to 5.4%.
- SV Elversberg up 2.2 places, expected points 35.4 to 41.2. 7 points from 4 games. Relegation risk down from 39.4% to 15.7%.
- Werder Bremen up 2.0 places, expected points 37.8 to 43.0. 7 points from 4 games. Relegation risk down from 28.4% to 11.1%.
- FC Schalke 04 up 1.0 places, expected points 36.0 to 38.7. 5 points from 4 games. Relegation risk down from 37.0% to 24.6%.
Falling
- Borussia Mönchengladbach down 3.1 places, expected points 39.2 to 31.7. 0 points from 4 games. Relegation risk up from 23.0% to 59.4%.
- Union Berlin down 2.9 places, expected points 40.5 to 33.8. 1 points from 4 games. Relegation risk up from 19.2% to 49.1%.
- 1899 Hoffenheim down 2.6 places, expected points 51.6 to 45.2. 3 points from 4 games. Relegation risk up from 1.8% to 6.8%.
- Hamburger SV down 2.1 places, expected points 40.1 to 35.6. 3 points from 4 games. Relegation risk up from 20.0% to 39.9%.
- VfB Stuttgart down 1.4 places, expected points 59.5 to 54.4. 3 points from 4 games. Title chance down from 2.5% to 0.3%. Relegation risk up from 0.2% to 0.7%.
Compare with the full pre-season table, exactly as the model had it in August.
Every club, every finishing position
| Club | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | xPts |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Bayern München | 76.00 | 20.41 | 2.81 | 0.60 | 0.14 | 0.04 | 0.01 | 0.01 | 79.9 | ||||||||||
| Borussia Dortmund | 21.15 | 55.33 | 14.84 | 5.22 | 2.04 | 0.80 | 0.29 | 0.17 | 0.09 | 0.03 | 0.02 | 0.02 | 72.3 | ||||||
| Bayer Leverkusen | 1.77 | 12.11 | 31.65 | 19.91 | 12.85 | 8.24 | 5.08 | 3.09 | 1.96 | 1.35 | 0.87 | 0.49 | 0.29 | 0.16 | 0.08 | 0.05 | 0.03 | 0.01 | 60.5 |
| RB Leipzig | 0.39 | 4.28 | 14.42 | 18.30 | 16.41 | 12.72 | 9.60 | 7.14 | 5.27 | 3.88 | 2.78 | 1.86 | 1.24 | 0.83 | 0.43 | 0.34 | 0.08 | 0.04 | 55.1 |
| VfB Stuttgart | 0.28 | 3.38 | 14.04 | 17.20 | 15.30 | 12.88 | 9.60 | 7.60 | 5.73 | 4.27 | 3.35 | 2.37 | 1.59 | 1.08 | 0.66 | 0.44 | 0.19 | 0.04 | 54.4 |
| SC Freiburg | 0.28 | 2.78 | 11.06 | 14.31 | 14.97 | 13.36 | 11.38 | 8.75 | 6.88 | 4.95 | 3.84 | 2.76 | 1.98 | 1.33 | 0.70 | 0.36 | 0.24 | 0.06 | 53.3 |
| FSV Mainz 05 | 0.06 | 0.43 | 2.50 | 5.05 | 7.49 | 9.67 | 10.75 | 10.62 | 10.27 | 9.53 | 8.48 | 6.96 | 5.95 | 4.66 | 3.47 | 2.23 | 1.35 | 0.53 | 46.7 |
| FC Augsburg | 0.03 | 0.37 | 2.41 | 4.56 | 7.02 | 8.62 | 9.98 | 10.37 | 10.48 | 9.26 | 8.53 | 7.96 | 6.14 | 4.88 | 4.00 | 2.88 | 1.75 | 0.76 | 46.1 |
| 1899 Hoffenheim | 0.01 | 0.31 | 2.03 | 4.31 | 6.36 | 7.57 | 8.90 | 9.64 | 10.07 | 9.42 | 8.44 | 8.20 | 7.12 | 5.95 | 4.83 | 3.30 | 2.29 | 1.25 | 45.2 |
| Eintracht Frankfurt | 0.01 | 0.30 | 1.84 | 4.06 | 5.39 | 7.36 | 8.44 | 9.68 | 9.25 | 9.54 | 8.59 | 8.08 | 7.56 | 6.46 | 5.15 | 3.95 | 2.86 | 1.46 | 44.8 |
| Werder Bremen | 0.01 | 0.14 | 0.83 | 2.16 | 4.06 | 5.54 | 7.15 | 8.48 | 8.89 | 9.35 | 9.56 | 9.36 | 8.67 | 8.17 | 6.53 | 5.29 | 3.86 | 1.93 | 43.0 |
| SV Elversberg | 0.08 | 0.53 | 1.59 | 2.68 | 4.30 | 5.48 | 6.24 | 7.87 | 8.56 | 9.53 | 9.42 | 10.09 | 9.64 | 8.31 | 7.19 | 5.27 | 3.22 | 41.2 | |
| 1. FC Köln | 0.01 | 0.04 | 0.51 | 1.39 | 2.32 | 3.67 | 4.93 | 6.39 | 7.40 | 8.20 | 9.28 | 9.58 | 9.48 | 9.54 | 8.73 | 7.81 | 6.54 | 4.18 | 40.5 |
| FC Schalke 04 | 0.01 | 0.03 | 0.34 | 0.69 | 1.46 | 2.34 | 3.70 | 4.44 | 5.95 | 7.64 | 8.52 | 9.20 | 10.11 | 10.46 | 10.60 | 10.04 | 8.49 | 6.01 | 38.7 |
| Hamburger SV | 0.01 | 0.08 | 0.27 | 0.65 | 1.15 | 1.87 | 2.84 | 3.58 | 4.61 | 6.13 | 7.80 | 9.12 | 9.98 | 12.04 | 13.44 | 13.84 | 12.58 | 35.6 | |
| Union Berlin | 0.05 | 0.19 | 0.43 | 0.84 | 1.30 | 2.07 | 2.66 | 3.70 | 4.71 | 5.93 | 7.60 | 9.34 | 12.10 | 13.90 | 16.23 | 18.95 | 33.8 | ||
| SC Paderborn 07 | 0.03 | 0.11 | 0.22 | 0.48 | 0.80 | 1.18 | 1.94 | 2.96 | 4.16 | 5.17 | 6.98 | 9.06 | 11.54 | 14.70 | 18.29 | 22.35 | 32.5 | ||
| Borussia Mönchengladbach | 0.03 | 0.07 | 0.20 | 0.40 | 0.73 | 1.29 | 1.73 | 2.75 | 3.20 | 4.85 | 6.08 | 8.47 | 10.82 | 14.08 | 18.67 | 26.63 | 31.7 |
Each cell is the percentage of 20,000 simulated seasons in which that club finished in that position, so every row adds up to 100%. A blank cell is under 0.005%, not impossible. The xPts column is the club's average points total across those seasons.
View the same grid as a shaded heatmap, which is easier to scan than the table above.
How it's built
The table above is where the division actually stands after 36 matches, finished off 20,000 times over. Points already won are treated as certain, and only the 270 fixtures left to play are simulated, from each club's attacking and defending strength: a blend of shots-adjusted Elo, last season's goal rates and how the club has actually played this season, the last of those counting for more the longer the season runs. Scorelines are drawn from the same negative-binomial and Dixon-Coles model the live BetSignals signals use. It knows nothing about upcoming fixture difficulty, injuries or suspensions.
_Generated from the BetSignals season simulation, 20,000 runs._