Oto część dotycząca symulacji Monte Carlo. To jest pięciokrokowy cykl:
- Wycenij każdy zespół na podstawie wyników, xG i innych dostępnych danych.
- Wycenij każde pozostałe spotkanie za pomocą modelu meczowego przedstawionego wyżej.
- Zagraj każde losowe spotkanie tylko raz, losując wynik z tych prawdopodobieństw i dodając punkty do tabeli. Mecze już rozegrane zostają dokładnie takie, jakie były.
- Powtórz cały sezon tysiące razy. 10 000 symulacji to popularny wybór, a każda z nich to jedna możliwa wersja sezonu 2026/27.
- Zliczaj. Szansa na tytuł to procent symulacji, w których dany zespół zakończył na pierwszym miejscu. Szansa na spadek to procent symulacji, w których zakończył na 18., 19. lub 20. miejscu.
Te słynne procenty to po prostu wyniki zliczania. Wygranie ligi w 4 300 z 10 000 symulowanych sezonów oznacza 43%. Przy 50 rozegranych z 380 meczów do 20 września model Premier League odtwarza około 330 spotkań w każdej symulacji.
Poniżej znajduje się działająca wersja dla wyimaginowanej ligi cztero-zespołowej, grającej u siebie i na wyjeździe. Zajmuje minutę na przeczytanie:
import random, math
random.seed(7)
teams = {"Reds": (1,9, 0,9), "Blues": (1,7, 1,0), "Whites": (1,4, 1,2), "Greens": (1,2, 1,3)} # (atak, obrona)
AVG, HOME = 1,35, 1,15
def poisson(lam):
L, k, p = math.exp(-lam), 0, 1,0
while True:
p *= random.random()
if p <= L:
return k
k += 1
def play(h, a):
lam_h = AVG * (teams[h][0] / AVG) * (teams[a][1] / AVG) * HOME
lam_a = AVG * (teams[a][0] / AVG) * (teams[h][1] / AVG) / HOME
return poisson(lam_h), poisson(lam_a)
fixtures = [(h, a) for h in teams for a in teams if h != a]
N, titles = 10_000, dict.fromkeys(teams, 0)
for _ in range(N):
pts, gd = dict.fromkeys(teams, 0), dict.fromkeys(teams, 0)
for h, a in fixtures:
x, y = play(h, a)
gd[h] += x - y; gd[a] += y - x
if x > y: pts[h] += 3
elif x < y: pts[a] += 3
else: pts[h] += 1; pts[a] += 1
champion = max(teams, key=lambda t: (pts[t], gd[t], random.random()))
titles[champion] += 1
print({t: titles[t] / N for t in teams})
Uruchom to i Reds, zdecydowanie najlepsza drużyna na papierze, wygra tytuł w zaledwie około 53% sezonów. Blues zdobiją około 31%, Whites około 11%, a Greens około 4-5%. Reds pokonują Greens u siebie w 70% przypadków, a w krótkim sezonie nawet najlepsza drużyna przegina niemal połowę czasu. Tak właśnie szumi futbol.