Goal Elo
monitoring only -- not used by any card's picksAn attack/defense Elo variant tracking goal-scoring and goal-conceding strength independently of win/loss. Each team's Attack and Defense sit on a log scale where 0 is exactly league average; ratings update after every match from the gap between actual and expected goals. See scripts/goal_elo/goal_elo.py for the model.
Ratings
24 teams · K=0.025 · league avg 1.193 goals/team/match · home advantage +0.250 log-units (~28%) · seasons 2022, 2023, 2024, 2025 · generated 2026-09-19 10:32 UTC
Dot size = matches played (a small dot is a partial-season sample -- promoted/relegated sides). Color is combined attack+defense strength, green (strong) to red (weak). Labeled: top 3 by attack, top 3 by defense.
| Team | Attack | Defense | Atk Elo | Def Elo | GF vs avg defense | GA vs avg attack | Matches |
|---|---|---|---|---|---|---|---|
| FC Krasnodar | 0.383 | 0.392 | 1691 | 1696 | 1.75 | 0.81 | 120 |
| Dynamo | 0.286 | 0.057 | 1643 | 1529 | 1.59 | 1.13 | 120 |
| Zenit | 0.232 | 0.551 | 1616 | 1776 | 1.50 | 0.69 | 120 |
| Lokomotiv | 0.188 | 0.040 | 1594 | 1520 | 1.44 | 1.15 | 120 |
| Spartak Moscow | 0.184 | 0.148 | 1592 | 1574 | 1.43 | 1.03 | 120 |
| CSKA Moscow | 0.073 | 0.208 | 1536 | 1604 | 1.28 | 0.97 | 120 |
| Rodina Moskva | -0.006 | -0.005 | 1497 | 1498 | 1.19 | 1.20 | 2 |
| Arsenal Tula | -0.020 | -0.010 | 1490 | 1495 | 1.17 | 1.20 | 2 |
| Enisey | -0.023 | -0.005 | 1489 | 1498 | 1.17 | 1.20 | 2 |
| Rotor Volgograd | -0.059 | 0.015 | 1471 | 1508 | 1.12 | 1.17 | 2 |
| Baltika | -0.069 | 0.314 | 1465 | 1657 | 1.11 | 0.87 | 60 |
| Krylia Sovetov | -0.073 | -0.130 | 1464 | 1435 | 1.11 | 1.36 | 120 |
| Akron | -0.084 | -0.189 | 1458 | 1405 | 1.10 | 1.44 | 64 |
| Khimki | -0.091 | -0.189 | 1455 | 1405 | 1.09 | 1.44 | 60 |
| Torpedo Moskva | -0.119 | -0.111 | 1440 | 1445 | 1.06 | 1.33 | 30 |
| FC Sochi | -0.121 | -0.221 | 1440 | 1389 | 1.06 | 1.49 | 92 |
| Akhmat | -0.129 | 0.047 | 1436 | 1524 | 1.05 | 1.14 | 122 |
| Ural | -0.159 | -0.069 | 1420 | 1465 | 1.02 | 1.28 | 66 |
| Rubin | -0.198 | 0.236 | 1401 | 1618 | 0.98 | 0.94 | 90 |
| FC Rostov | -0.225 | 0.179 | 1388 | 1590 | 0.95 | 1.00 | 120 |
| FC Orenburg | -0.233 | -0.040 | 1384 | 1480 | 0.94 | 1.24 | 120 |
| Nizhny Novgorod | -0.260 | -0.167 | 1370 | 1416 | 0.92 | 1.41 | 126 |
| Dinamo Makhachkala | -0.355 | 0.165 | 1323 | 1583 | 0.84 | 1.01 | 62 |
| Fakel | -0.397 | 0.058 | 1302 | 1529 | 0.80 | 1.13 | 92 |
Atk/Def Elo = 1500 + raw × 500 -- a cosmetic rescale for familiarity, not a real unit conversion. Chess Elo's 400-point gap has a specific meaning (10:1 win odds) that goal-scoring rate has no equivalent of. The Attack/Defense columns are what the model actually computes with.
2026 over 1.5 check
P(total goals ≥ 2) for every completed match since 2026-01-01 across all 38 tracked leagues -- the mu_home + mu_away → Poisson total construction, same as over-15-card's own math, just fed by Goal Elo's ratings instead. Each prediction used only ratings built from strictly earlier matches, compared against a baseline that knows just the league's average scoring rate and home advantage, no team identity at all.
Honest read: over 1.5 is a low bar in football (the baseline alone already expects it 76% of the time), so knowing which specific teams are playing barely moves the needle here -- skill sits close to 0% pooled, unlike the real, consistent edge Attack/Defense showed on raw expected goals. The model is well calibrated (see below), it just isn't adding much information a viewer didn't already have from the league's baseline rate.
Reliability
Matches bucketed by predicted P(over 1.5); dot = actual over-1.5 rate in that bucket (size = sample). On the dashed line means perfectly calibrated.
Skill vs no-team-identity baseline
1 − (model Brier / baseline Brier). 0% = no better than ignoring which teams are playing; a negative bar means Attack/Defense info actually hurt on that league's calls.
Biggest surprises
Lowest probability the model gave to what actually happened.
- VfL Wolfsburg 0-1 Bayern München (Germany - Bundesliga, 2026-05-09)model said 96% over
- CF Montreal 0-1 Inter Miami (USA - MLS, 2026-07-25)model said 93% over
- Club Brugge KV 1-0 Cercle Brugge (Belgium - Jupiler Pro League, 2026-08-23)model said 92% over
- Barcelona 1-0 Celta Vigo (Spain - La Liga, 2026-04-22)model said 92% over
- FC Schalke 04 0-0 Bayern München (Germany - Bundesliga, 2026-09-05)model said 92% over
- Sirius 0-1 Malmo FF (Sweden - Allsvenskan, 2026-08-31)model said 91% over
- FC Midtjylland 0-1 FC Nordsjaelland (Denmark - Superliga, 2026-03-15)model said 91% over
- Always Ready 1-0 Oriente Petrolero (Bolivia - Primera Division, 2026-04-22)model said 91% over
- Newcastle Jets 1-0 Macarthur (Australia - A-League, 2026-02-22)model said 90% over
- Al-Fateh 0-1 Al-Hilal Saudi FC (Saudi Arabia - Pro League, 2026-03-14)model said 90% over
All predictions — Russia - Premier League (172)
Switch leagues with the tabs above the ratings table; newest match first.
| Date | Match | Score | P(over) | Actual | Call |
|---|---|---|---|---|---|
| 2026-09-17 | FC Orenburg v FC Krasnodar | 0-0 | 70% | under | ✗ |
| 2026-09-17 | FC Rostov v Dynamo | 0-3 | 73% | over | ✓ |
| 2026-09-17 | Akron v Akhmat | 2-0 | 79% | over | ✓ |
| 2026-09-17 | Dinamo Makhachkala v CSKA Moscow | 1-3 | 69% | over | ✓ |
| 2026-09-16 | Spartak Moscow v Fakel | 1-0 | 74% | under | ✗ |
| 2026-09-16 | Rodina Moskva v Rubin | 1-1 | 74% | over | ✓ |
| 2026-09-16 | Lokomotiv v Krylia Sovetov | 1-1 | 79% | over | ✓ |
| 2026-09-16 | Baltika v Zenit | 2-3 | 66% | over | ✓ |
| 2026-09-13 | Akhmat v Dinamo Makhachkala | 3-2 | 68% | over | ✓ |
| 2026-09-13 | Spartak Moscow v FC Rostov | 3-0 | 74% | over | ✓ |
| 2026-09-13 | FC Krasnodar v Akron | 1-1 | 86% | over | ✓ |
| 2026-09-12 | Fakel v Baltika | 2-2 | 59% | over | ✓ |
| 2026-09-12 | Zenit v Lokomotiv | 2-1 | 74% | over | ✓ |
| 2026-09-12 | Dynamo v FC Orenburg | 1-0 | 77% | under | ✗ |
| 2026-09-12 | CSKA Moscow v Rubin | 1-1 | 69% | over | ✓ |
| 2026-09-11 | Krylia Sovetov v Rodina Moskva | 2-1 | 83% | over | ✓ |
| 2026-09-07 | Rubin v Akhmat | 1-1 | 68% | over | ✓ |
| 2026-09-06 | FC Orenburg v Akron | 2-2 | 76% | over | ✓ |
| 2026-09-06 | Dinamo Makhachkala v Rodina Moskva | 2-0 | 76% | over | ✓ |
| 2026-09-06 | Dynamo v Spartak Moscow | 2-1 | 78% | over | ✓ |
| 2026-09-06 | Baltika v Lokomotiv | 0-1 | 71% | under | ✗ |
| 2026-09-05 | Krylia Sovetov v FC Krasnodar | 2-2 | 78% | over | ✓ |
| 2026-09-05 | Zenit v CSKA Moscow | 1-2 | 71% | over | ✓ |
| 2026-09-05 | FC Rostov v Fakel | 3-1 | 60% | over | ✓ |
| 2026-08-30 | Rodina Moskva v Baltika | 0-3 | 74% | over | ✓ |
| 2026-08-30 | Spartak Moscow v FC Orenburg | 1-1 | 76% | over | ✓ |
| 2026-08-30 | Rubin v Dinamo Makhachkala | 3-1 | 62% | over | ✓ |
| 2026-08-29 | Fakel v Zenit | 0-1 | 64% | under | ✗ |
| 2026-08-29 | FC Krasnodar v FC Rostov | 1-0 | 76% | under | ✗ |
| 2026-08-29 | Lokomotiv v Dynamo | 0-1 | 81% | under | ✗ |
| 2026-08-29 | Akhmat v Krylia Sovetov | 3-3 | 72% | over | ✓ |
| 2026-08-28 | Akron v CSKA Moscow | 2-2 | 76% | over | ✓ |
| 2026-08-24 | Baltika v Rubin | 1-1 | 64% | over | ✓ |
| 2026-08-23 | Akron v Krylia Sovetov | 0-3 | 79% | over | ✓ |
| 2026-08-23 | Dynamo v Rodina Moskva | 3-1 | 83% | over | ✓ |
| 2026-08-23 | Dinamo Makhachkala v FC Krasnodar | 0-1 | 72% | under | ✗ |
| 2026-08-23 | Spartak Moscow v Zenit | 2-0 | 73% | over | ✓ |
| 2026-08-22 | Fakel v FC Orenburg | 0-0 | 64% | under | ✗ |
| 2026-08-22 | Akhmat v FC Rostov | 4-1 | 63% | over | ✓ |
| 2026-08-22 | CSKA Moscow v Lokomotiv | 3-2 | 71% | over | ✓ |
| 2026-08-16 | Zenit v Dynamo | 3-0 | 77% | over | ✓ |
| 2026-08-16 | Krylia Sovetov v Dinamo Makhachkala | 1-4 | 67% | over | ✓ |
| 2026-08-16 | Baltika v Spartak Moscow | 1-2 | 70% | over | ✓ |
| 2026-08-15 | Rodina Moskva v Akron | 3-3 | 80% | over | ✓ |
| 2026-08-15 | CSKA Moscow v Fakel | 1-0 | 67% | under | ✗ |
| 2026-08-15 | FC Rostov v Rubin | 1-1 | 63% | over | ✓ |
| 2026-08-15 | FC Krasnodar v Akhmat | 1-0 | 78% | under | ✗ |
| 2026-08-14 | FC Orenburg v Lokomotiv | 1-1 | 73% | over | ✓ |
| 2026-08-10 | Fakel v Akhmat | 0-0 | 66% | under | ✗ |
| 2026-08-09 | Dynamo v Dinamo Makhachkala | 3-1 | 71% | over | ✓ |
| 2026-08-09 | Zenit v Rodina Moskva | 1-2 | 80% | over | ✓ |
| 2026-08-09 | Spartak Moscow v FC Krasnodar | 1-2 | 78% | over | ✓ |
| 2026-08-09 | Rubin v FC Orenburg | 1-1 | 68% | over | ✓ |
| 2026-08-08 | Krylia Sovetov v Baltika | 0-2 | 68% | over | ✓ |
| 2026-08-08 | Lokomotiv v Akron | 0-0 | 83% | under | ✗ |
| 2026-08-08 | CSKA Moscow v FC Rostov | 0-0 | 70% | under | ✗ |
| 2026-08-02 | FC Orenburg v Zenit | 0-3 | 70% | over | ✓ |
| 2026-08-02 | FC Krasnodar v Fakel | 3-2 | 76% | over | ✓ |
| 2026-08-02 | Akhmat v Spartak Moscow | 1-2 | 73% | over | ✓ |
| 2026-08-01 | Akron v Rubin | 1-2 | 72% | over | ✓ |
| 2026-08-01 | CSKA Moscow v Krylia Sovetov | 1-1 | 74% | over | ✓ |
| 2026-08-01 | Dinamo Makhachkala v Lokomotiv | 2-1 | 69% | over | ✓ |
| 2026-08-01 | Baltika v Dynamo | 2-1 | 71% | over | ✓ |
| 2026-07-31 | Rodina Moskva v FC Rostov | 2-4 | 69% | over | ✓ |
| 2026-07-26 | Lokomotiv v Akhmat | 1-1 | 76% | over | ✓ |
| 2026-07-26 | FC Orenburg v FC Rostov | 2-1 | 64% | over | ✓ |
| 2026-07-26 | Rubin v FC Krasnodar | 1-3 | 68% | over | ✓ |
| 2026-07-25 | Dynamo v Krylia Sovetov | 0-0 | 82% | under | ✗ |
| 2026-07-25 | Akron v Zenit | 0-5 | 73% | over | ✓ |
| 2026-07-25 | Fakel v Dinamo Makhachkala | 1-2 | 57% | over | ✓ |
| 2026-07-25 | Spartak Moscow v Rodina Moskva | 3-0 | 77% | over | ✓ |
| 2026-07-24 | CSKA Moscow v Baltika | 2-1 | 66% | over | ✓ |
| 2026-05-23 | Dinamo Makhachkala v Ural | 2-0 | 59% | over | ✓ |
| 2026-05-23 | Akron v Rotor Volgograd | 0-1 | 78% | under | ✗ |
| 2026-05-20 | Ural v Dinamo Makhachkala | 0-1 | 62% | under | ✗ |
| 2026-05-20 | Rotor Volgograd v Akron | 0-2 | 81% | over | ✓ |
| 2026-05-17 | CSKA Moscow v Lokomotiv | 3-1 | 74% | over | ✓ |
| 2026-05-17 | FC Krasnodar v FC Orenburg | 3-0 | 79% | over | ✓ |
| 2026-05-17 | FC Rostov v Zenit | 0-1 | 60% | under | ✗ |
| 2026-05-17 | Krylia Sovetov v Akron | 4-1 | 79% | over | ✓ |
| 2026-05-17 | Rubin v Nizhny Novgorod | 2-2 | 63% | over | ✓ |
| 2026-05-17 | Baltika v Dynamo | 1-2 | 71% | over | ✓ |
| 2026-05-17 | FC Sochi v Akhmat | 1-1 | 74% | over | ✓ |
| 2026-05-17 | Dinamo Makhachkala v Spartak Moscow | 0-0 | 67% | under | ✗ |
| 2026-05-11 | Akron v FC Rostov | 1-3 | 67% | over | ✓ |
| 2026-05-11 | Nizhny Novgorod v CSKA Moscow | 1-2 | 68% | over | ✓ |
| 2026-05-11 | Spartak Moscow v Rubin | 2-1 | 66% | over | ✓ |
| 2026-05-11 | Dynamo v FC Krasnodar | 2-1 | 80% | over | ✓ |
| 2026-05-10 | FC Orenburg v Krylia Sovetov | 1-0 | 73% | under | ✗ |
| 2026-05-10 | Zenit v FC Sochi | 2-1 | 82% | over | ✓ |
| 2026-05-10 | Akhmat v Dinamo Makhachkala | 1-1 | 61% | over | ✓ |
| 2026-05-10 | Lokomotiv v Baltika | 1-0 | 70% | under | ✗ |
| 2026-05-03 | FC Sochi v FC Orenburg | 3-1 | 73% | over | ✓ |
| 2026-05-03 | Akron v FC Krasnodar | 0-1 | 82% | under | ✗ |
| 2026-05-03 | Akhmat v Nizhny Novgorod | 2-0 | 70% | over | ✓ |
| 2026-05-02 | Dinamo Makhachkala v FC Rostov | 1-2 | 51% | over | ✓ |
| 2026-05-02 | Baltika v Rubin | 0-1 | 56% | under | ✗ |
| 2026-05-02 | CSKA Moscow v Zenit | 1-3 | 61% | over | ✓ |
| 2026-05-01 | Krylia Sovetov v Spartak Moscow | 2-1 | 79% | over | ✓ |
| 2026-05-01 | Lokomotiv v Dynamo | 1-1 | 85% | over | ✓ |
| 2026-04-27 | Baltika v Akron | 0-1 | 77% | under | ✗ |
| 2026-04-26 | Nizhny Novgorod v Spartak Moscow | 1-2 | 75% | over | ✓ |
| 2026-04-26 | FC Krasnodar v Dinamo Makhachkala | 2-1 | 74% | over | ✓ |
| 2026-04-26 | Dynamo v FC Sochi | 2-0 | 88% | over | ✓ |
| 2026-04-26 | Zenit v Akhmat | 2-0 | 70% | over | ✓ |
| 2026-04-25 | FC Rostov v FC Orenburg | 0-1 | 61% | under | ✗ |
| 2026-04-25 | Krylia Sovetov v Lokomotiv | 2-0 | 83% | over | ✓ |
| 2026-04-25 | Rubin v CSKA Moscow | 0-0 | 59% | under | ✗ |
| 2026-04-23 | Akron v Dinamo Makhachkala | 1-1 | 69% | over | ✓ |
| 2026-04-23 | Spartak Moscow v FC Krasnodar | 1-2 | 78% | over | ✓ |
| 2026-04-23 | Akhmat v Baltika | 1-1 | 65% | over | ✓ |
| 2026-04-22 | FC Orenburg v Nizhny Novgorod | 2-1 | 67% | over | ✓ |
| 2026-04-22 | Lokomotiv v Zenit | 0-0 | 76% | under | ✗ |
| 2026-04-22 | Dynamo v Rubin | 0-1 | 76% | under | ✗ |
| 2026-04-21 | FC Sochi v Krylia Sovetov | 2-1 | 80% | over | ✓ |
| 2026-04-21 | CSKA Moscow v FC Rostov | 1-1 | 62% | over | ✓ |
| 2026-04-19 | Dinamo Makhachkala v Zenit | 0-1 | 62% | under | ✗ |
| 2026-04-19 | Spartak Moscow v Akhmat | 3-1 | 74% | over | ✓ |
| 2026-04-19 | FC Krasnodar v Baltika | 2-2 | 69% | over | ✓ |
| 2026-04-18 | FC Orenburg v Lokomotiv | 0-1 | 81% | under | ✗ |
| 2026-04-18 | Krylia Sovetov v CSKA Moscow | 1-1 | 74% | over | ✓ |
| 2026-04-18 | Rubin v Akron | 1-1 | 73% | over | ✓ |
| 2026-04-18 | Nizhny Novgorod v Dynamo | 1-1 | 82% | over | ✓ |
| 2026-04-17 | FC Rostov v FC Sochi | 0-1 | 72% | under | ✗ |
| 2026-04-13 | Akron v Dynamo | 2-3 | 87% | over | ✓ |
| 2026-04-12 | CSKA Moscow v FC Sochi | 0-1 | 85% | under | ✗ |
| 2026-04-12 | Lokomotiv v Dinamo Makhachkala | 1-1 | 78% | over | ✓ |
| 2026-04-12 | FC Rostov v Spartak Moscow | 1-1 | 67% | over | ✓ |
| 2026-04-12 | Zenit v FC Krasnodar | 1-1 | 70% | over | ✓ |
| 2026-04-11 | Krylia Sovetov v Akhmat | 2-2 | 71% | over | ✓ |
| 2026-04-11 | Rubin v FC Orenburg | 0-0 | 67% | under | ✗ |
| 2026-04-11 | Baltika v Nizhny Novgorod | 2-2 | 68% | over | ✓ |
| 2026-04-06 | FC Sochi v Rubin | 0-1 | 76% | under | ✗ |
| 2026-04-05 | Nizhny Novgorod v FC Rostov | 0-1 | 62% | under | ✗ |
| 2026-04-05 | Dinamo Makhachkala v Baltika | 2-2 | 53% | over | ✓ |
| 2026-04-05 | Spartak Moscow v Lokomotiv | 2-1 | 85% | over | ✓ |
| 2026-04-04 | Akron v CSKA Moscow | 1-2 | 77% | over | ✓ |
| 2026-04-04 | Zenit v Krylia Sovetov | 2-1 | 81% | over | ✓ |
| 2026-04-04 | Dynamo v FC Orenburg | 3-3 | 82% | over | ✓ |
| 2026-04-04 | Akhmat v FC Krasnodar | 0-1 | 74% | under | ✗ |
| 2026-03-22 | FC Orenburg v Spartak Moscow | 0-2 | 74% | over | ✓ |
| 2026-03-22 | Dynamo v Zenit | 1-3 | 75% | over | ✓ |
| 2026-03-22 | Krylia Sovetov v Rubin | 0-0 | 73% | under | ✗ |
| 2026-03-22 | Lokomotiv v Akron | 5-1 | 87% | over | ✓ |
| 2026-03-21 | Akhmat v FC Rostov | 1-0 | 64% | under | ✗ |
| 2026-03-21 | CSKA Moscow v Dinamo Makhachkala | 3-1 | 62% | over | ✓ |
| 2026-03-21 | FC Krasnodar v Nizhny Novgorod | 5-0 | 79% | over | ✓ |
| 2026-03-21 | Baltika v FC Sochi | 4-0 | 76% | over | ✓ |
| 2026-03-15 | Akron v Akhmat | 1-1 | 76% | over | ✓ |
| 2026-03-15 | Nizhny Novgorod v Krylia Sovetov | 3-0 | 73% | over | ✓ |
| 2026-03-15 | Rubin v Lokomotiv | 3-0 | 78% | over | ✓ |
| 2026-03-14 | FC Sochi v FC Krasnodar | 1-2 | 85% | over | ✓ |
| 2026-03-14 | Zenit v Spartak Moscow | 2-0 | 73% | over | ✓ |
| 2026-03-14 | FC Rostov v Dynamo | 0-1 | 75% | under | ✗ |
| 2026-03-14 | Baltika v CSKA Moscow | 1-0 | 61% | under | ✗ |
| 2026-03-13 | Dinamo Makhachkala v FC Orenburg | 1-0 | 60% | under | ✗ |
| 2026-03-09 | Lokomotiv v Akhmat | 2-2 | 82% | over | ✓ |
| 2026-03-09 | Spartak Moscow v Akron | 4-3 | 78% | over | ✓ |
| 2026-03-08 | FC Orenburg v Zenit | 2-1 | 69% | over | ✓ |
| 2026-03-08 | Krylia Sovetov v Dinamo Makhachkala | 2-0 | 66% | over | ✓ |
| 2026-03-08 | Rubin v FC Krasnodar | 2-1 | 72% | over | ✓ |
| 2026-03-08 | CSKA Moscow v Dynamo | 1-4 | 77% | over | ✓ |
| 2026-03-07 | FC Rostov v Baltika | 1-1 | 57% | over | ✓ |
| 2026-03-07 | Nizhny Novgorod v FC Sochi | 2-1 | 76% | over | ✓ |
| 2026-03-02 | FC Sochi v Spartak Moscow | 2-3 | 80% | over | ✓ |
| 2026-03-01 | Dynamo v Krylia Sovetov | 4-0 | 85% | over | ✓ |
| 2026-03-01 | Akhmat v CSKA Moscow | 1-0 | 70% | under | ✗ |
| 2026-02-28 | FC Orenburg v Akron | 2-0 | 74% | over | ✓ |
| 2026-02-28 | FC Krasnodar v FC Rostov | 2-1 | 74% | over | ✓ |
| 2026-02-28 | Lokomotiv v Nizhny Novgorod | 2-1 | 83% | over | ✓ |
| 2026-02-28 | Dinamo Makhachkala v Rubin | 2-1 | 55% | over | ✓ |
| 2026-02-27 | Zenit v Baltika | 1-0 | 61% | under | ✗ |