Goal Elo

monitoring only -- not used by any card's picks

An 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.

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

Attack (0 = league average)Defense ↑Khimki -- attack -0.091 (1455 Elo), defense -0.189 (1405 Elo), 60 matchesZenit -- attack 0.232 (1616 Elo), defense 0.551 (1776 Elo), 120 matchesZenitCSKA Moscow -- attack 0.073 (1536 Elo), defense 0.208 (1604 Elo), 120 matchesUral -- attack -0.159 (1420 Elo), defense -0.069 (1465 Elo), 66 matchesFC Orenburg -- attack -0.233 (1384 Elo), defense -0.040 (1480 Elo), 120 matchesKrylia Sovetov -- attack -0.073 (1464 Elo), defense -0.130 (1435 Elo), 120 matchesAkhmat -- attack -0.129 (1436 Elo), defense 0.047 (1524 Elo), 122 matchesSpartak Moscow -- attack 0.184 (1592 Elo), defense 0.148 (1574 Elo), 120 matchesTorpedo Moskva -- attack -0.119 (1440 Elo), defense -0.111 (1445 Elo), 30 matchesFC Sochi -- attack -0.121 (1440 Elo), defense -0.221 (1389 Elo), 92 matchesLokomotiv -- attack 0.188 (1594 Elo), defense 0.040 (1520 Elo), 120 matchesNizhny Novgorod -- attack -0.260 (1370 Elo), defense -0.167 (1416 Elo), 126 matchesFC Krasnodar -- attack 0.383 (1691 Elo), defense 0.392 (1696 Elo), 120 matchesFC KrasnodarFakel -- attack -0.397 (1302 Elo), defense 0.058 (1529 Elo), 92 matchesDynamo -- attack 0.286 (1643 Elo), defense 0.057 (1529 Elo), 120 matchesDynamoFC Rostov -- attack -0.225 (1388 Elo), defense 0.179 (1590 Elo), 120 matchesEnisey -- attack -0.023 (1489 Elo), defense -0.005 (1498 Elo), 2 matchesRodina Moskva -- attack -0.006 (1497 Elo), defense -0.005 (1498 Elo), 2 matchesRubin -- attack -0.198 (1401 Elo), defense 0.236 (1618 Elo), 90 matchesBaltika -- attack -0.069 (1465 Elo), defense 0.314 (1657 Elo), 60 matchesBaltikaAkron -- attack -0.084 (1458 Elo), defense -0.189 (1405 Elo), 64 matchesArsenal Tula -- attack -0.020 (1490 Elo), defense -0.010 (1495 Elo), 2 matchesDinamo Makhachkala -- attack -0.355 (1323 Elo), defense 0.165 (1583 Elo), 62 matchesRotor Volgograd -- attack -0.059 (1471 Elo), defense 0.015 (1508 Elo), 2 matches

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.

TeamAttackDefenseAtk EloDef EloGF vs avg defenseGA vs avg attackMatches
FC Krasnodar0.3830.392169116961.750.81120
Dynamo0.2860.057164315291.591.13120
Zenit0.2320.551161617761.500.69120
Lokomotiv0.1880.040159415201.441.15120
Spartak Moscow0.1840.148159215741.431.03120
CSKA Moscow0.0730.208153616041.280.97120
Rodina Moskva-0.006-0.005149714981.191.202
Arsenal Tula-0.020-0.010149014951.171.202
Enisey-0.023-0.005148914981.171.202
Rotor Volgograd-0.0590.015147115081.121.172
Baltika-0.0690.314146516571.110.8760
Krylia Sovetov-0.073-0.130146414351.111.36120
Akron-0.084-0.189145814051.101.4464
Khimki-0.091-0.189145514051.091.4460
Torpedo Moskva-0.119-0.111144014451.061.3330
FC Sochi-0.121-0.221144013891.061.4992
Akhmat-0.1290.047143615241.051.14122
Ural-0.159-0.069142014651.021.2866
Rubin-0.1980.236140116180.980.9490
FC Rostov-0.2250.179138815900.951.00120
FC Orenburg-0.233-0.040138414800.941.24120
Nizhny Novgorod-0.260-0.167137014160.921.41126
Dinamo Makhachkala-0.3550.165132315830.841.0162
Fakel-0.3970.058130215290.801.1392

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.

7,770
Matches scored
75.8%
Actual over-1.5 rate
0.182
Model Brier score
-0.5%
Skill vs baseline

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

0%0%25%25%50%50%75%75%100%100%Predicted P(over 1.5)Actual over-1.5 rateperfect calibrationpredicted ~50%, actually over 1.5 51% of the time (n=45)predicted ~55%, actually over 1.5 67% of the time (n=177)predicted ~60%, actually over 1.5 65% of the time (n=428)predicted ~65%, actually over 1.5 71% of the time (n=967)predicted ~70%, actually over 1.5 74% of the time (n=1564)predicted ~75%, actually over 1.5 76% of the time (n=1858)predicted ~80%, actually over 1.5 79% of the time (n=1593)predicted ~85%, actually over 1.5 84% of the time (n=835)predicted ~90%, actually over 1.5 87% of the time (n=243)predicted ~95%, actually over 1.5 95% of the time (n=44)

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

Peru - Primera Division
5.0%
Bolivia - Primera Division
3.8%
South Africa - Premier Soccer League
3.2%
Turkey - Super Lig
2.2%
Portugal - Primeira Liga
2.1%
Ecuador - Liga Pro
1.8%
Russia - Premier League
1.1%
China - Super League
1.1%
USA - MLS
1.0%
Australia - A-League
0.9%
Brazil - Serie A
0.4%
Argentina - Liga Profesional
0.3%
Colombia - Primera A
0.1%
Costa Rica - Primera Division
0.0%
Chile - Primera Division
-0.2%
Norway - Eliteserien
-0.2%
France - Ligue 1
-0.3%
Greece - Super League
-0.5%
Guatemala - Liga Nacional
-0.6%
Spain - La Liga
-0.6%
Italy - Serie A
-1.1%
Netherlands - Eredivisie
-1.3%
El Salvador - Primera Division
-1.3%
Uruguay - Primera Division
-1.4%
Honduras - Liga Nacional
-1.6%
Sweden - Allsvenskan
-1.9%
Denmark - Superliga
-2.1%
Mexico - Liga MX
-2.4%
Paraguay - Division Profesional (Apertura)
-2.4%
Saudi Arabia - Pro League
-2.6%
England - Premier League
-2.7%
India - Indian Super League
-2.9%
Austria - Bundesliga
-2.9%
Scotland - Premiership
-3.0%
Venezuela - Primera Division
-3.3%
Japan - J1 League
-3.5%
Belgium - Jupiler Pro League
-4.1%
Germany - Bundesliga
-4.7%

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.

DateMatchScoreP(over)ActualCall
2026-09-17FC Orenburg v FC Krasnodar0-070%under
2026-09-17FC Rostov v Dynamo0-373%over
2026-09-17Akron v Akhmat2-079%over
2026-09-17Dinamo Makhachkala v CSKA Moscow1-369%over
2026-09-16Spartak Moscow v Fakel1-074%under
2026-09-16Rodina Moskva v Rubin1-174%over
2026-09-16Lokomotiv v Krylia Sovetov1-179%over
2026-09-16Baltika v Zenit2-366%over
2026-09-13Akhmat v Dinamo Makhachkala3-268%over
2026-09-13Spartak Moscow v FC Rostov3-074%over
2026-09-13FC Krasnodar v Akron1-186%over
2026-09-12Fakel v Baltika2-259%over
2026-09-12Zenit v Lokomotiv2-174%over
2026-09-12Dynamo v FC Orenburg1-077%under
2026-09-12CSKA Moscow v Rubin1-169%over
2026-09-11Krylia Sovetov v Rodina Moskva2-183%over
2026-09-07Rubin v Akhmat1-168%over
2026-09-06FC Orenburg v Akron2-276%over
2026-09-06Dinamo Makhachkala v Rodina Moskva2-076%over
2026-09-06Dynamo v Spartak Moscow2-178%over
2026-09-06Baltika v Lokomotiv0-171%under
2026-09-05Krylia Sovetov v FC Krasnodar2-278%over
2026-09-05Zenit v CSKA Moscow1-271%over
2026-09-05FC Rostov v Fakel3-160%over
2026-08-30Rodina Moskva v Baltika0-374%over
2026-08-30Spartak Moscow v FC Orenburg1-176%over
2026-08-30Rubin v Dinamo Makhachkala3-162%over
2026-08-29Fakel v Zenit0-164%under
2026-08-29FC Krasnodar v FC Rostov1-076%under
2026-08-29Lokomotiv v Dynamo0-181%under
2026-08-29Akhmat v Krylia Sovetov3-372%over
2026-08-28Akron v CSKA Moscow2-276%over
2026-08-24Baltika v Rubin1-164%over
2026-08-23Akron v Krylia Sovetov0-379%over
2026-08-23Dynamo v Rodina Moskva3-183%over
2026-08-23Dinamo Makhachkala v FC Krasnodar0-172%under
2026-08-23Spartak Moscow v Zenit2-073%over
2026-08-22Fakel v FC Orenburg0-064%under
2026-08-22Akhmat v FC Rostov4-163%over
2026-08-22CSKA Moscow v Lokomotiv3-271%over
2026-08-16Zenit v Dynamo3-077%over
2026-08-16Krylia Sovetov v Dinamo Makhachkala1-467%over
2026-08-16Baltika v Spartak Moscow1-270%over
2026-08-15Rodina Moskva v Akron3-380%over
2026-08-15CSKA Moscow v Fakel1-067%under
2026-08-15FC Rostov v Rubin1-163%over
2026-08-15FC Krasnodar v Akhmat1-078%under
2026-08-14FC Orenburg v Lokomotiv1-173%over
2026-08-10Fakel v Akhmat0-066%under
2026-08-09Dynamo v Dinamo Makhachkala3-171%over
2026-08-09Zenit v Rodina Moskva1-280%over
2026-08-09Spartak Moscow v FC Krasnodar1-278%over
2026-08-09Rubin v FC Orenburg1-168%over
2026-08-08Krylia Sovetov v Baltika0-268%over
2026-08-08Lokomotiv v Akron0-083%under
2026-08-08CSKA Moscow v FC Rostov0-070%under
2026-08-02FC Orenburg v Zenit0-370%over
2026-08-02FC Krasnodar v Fakel3-276%over
2026-08-02Akhmat v Spartak Moscow1-273%over
2026-08-01Akron v Rubin1-272%over
2026-08-01CSKA Moscow v Krylia Sovetov1-174%over
2026-08-01Dinamo Makhachkala v Lokomotiv2-169%over
2026-08-01Baltika v Dynamo2-171%over
2026-07-31Rodina Moskva v FC Rostov2-469%over
2026-07-26Lokomotiv v Akhmat1-176%over
2026-07-26FC Orenburg v FC Rostov2-164%over
2026-07-26Rubin v FC Krasnodar1-368%over
2026-07-25Dynamo v Krylia Sovetov0-082%under
2026-07-25Akron v Zenit0-573%over
2026-07-25Fakel v Dinamo Makhachkala1-257%over
2026-07-25Spartak Moscow v Rodina Moskva3-077%over
2026-07-24CSKA Moscow v Baltika2-166%over
2026-05-23Dinamo Makhachkala v Ural2-059%over
2026-05-23Akron v Rotor Volgograd0-178%under
2026-05-20Ural v Dinamo Makhachkala0-162%under
2026-05-20Rotor Volgograd v Akron0-281%over
2026-05-17CSKA Moscow v Lokomotiv3-174%over
2026-05-17FC Krasnodar v FC Orenburg3-079%over
2026-05-17FC Rostov v Zenit0-160%under
2026-05-17Krylia Sovetov v Akron4-179%over
2026-05-17Rubin v Nizhny Novgorod2-263%over
2026-05-17Baltika v Dynamo1-271%over
2026-05-17FC Sochi v Akhmat1-174%over
2026-05-17Dinamo Makhachkala v Spartak Moscow0-067%under
2026-05-11Akron v FC Rostov1-367%over
2026-05-11Nizhny Novgorod v CSKA Moscow1-268%over
2026-05-11Spartak Moscow v Rubin2-166%over
2026-05-11Dynamo v FC Krasnodar2-180%over
2026-05-10FC Orenburg v Krylia Sovetov1-073%under
2026-05-10Zenit v FC Sochi2-182%over
2026-05-10Akhmat v Dinamo Makhachkala1-161%over
2026-05-10Lokomotiv v Baltika1-070%under
2026-05-03FC Sochi v FC Orenburg3-173%over
2026-05-03Akron v FC Krasnodar0-182%under
2026-05-03Akhmat v Nizhny Novgorod2-070%over
2026-05-02Dinamo Makhachkala v FC Rostov1-251%over
2026-05-02Baltika v Rubin0-156%under
2026-05-02CSKA Moscow v Zenit1-361%over
2026-05-01Krylia Sovetov v Spartak Moscow2-179%over
2026-05-01Lokomotiv v Dynamo1-185%over
2026-04-27Baltika v Akron0-177%under
2026-04-26Nizhny Novgorod v Spartak Moscow1-275%over
2026-04-26FC Krasnodar v Dinamo Makhachkala2-174%over
2026-04-26Dynamo v FC Sochi2-088%over
2026-04-26Zenit v Akhmat2-070%over
2026-04-25FC Rostov v FC Orenburg0-161%under
2026-04-25Krylia Sovetov v Lokomotiv2-083%over
2026-04-25Rubin v CSKA Moscow0-059%under
2026-04-23Akron v Dinamo Makhachkala1-169%over
2026-04-23Spartak Moscow v FC Krasnodar1-278%over
2026-04-23Akhmat v Baltika1-165%over
2026-04-22FC Orenburg v Nizhny Novgorod2-167%over
2026-04-22Lokomotiv v Zenit0-076%under
2026-04-22Dynamo v Rubin0-176%under
2026-04-21FC Sochi v Krylia Sovetov2-180%over
2026-04-21CSKA Moscow v FC Rostov1-162%over
2026-04-19Dinamo Makhachkala v Zenit0-162%under
2026-04-19Spartak Moscow v Akhmat3-174%over
2026-04-19FC Krasnodar v Baltika2-269%over
2026-04-18FC Orenburg v Lokomotiv0-181%under
2026-04-18Krylia Sovetov v CSKA Moscow1-174%over
2026-04-18Rubin v Akron1-173%over
2026-04-18Nizhny Novgorod v Dynamo1-182%over
2026-04-17FC Rostov v FC Sochi0-172%under
2026-04-13Akron v Dynamo2-387%over
2026-04-12CSKA Moscow v FC Sochi0-185%under
2026-04-12Lokomotiv v Dinamo Makhachkala1-178%over
2026-04-12FC Rostov v Spartak Moscow1-167%over
2026-04-12Zenit v FC Krasnodar1-170%over
2026-04-11Krylia Sovetov v Akhmat2-271%over
2026-04-11Rubin v FC Orenburg0-067%under
2026-04-11Baltika v Nizhny Novgorod2-268%over
2026-04-06FC Sochi v Rubin0-176%under
2026-04-05Nizhny Novgorod v FC Rostov0-162%under
2026-04-05Dinamo Makhachkala v Baltika2-253%over
2026-04-05Spartak Moscow v Lokomotiv2-185%over
2026-04-04Akron v CSKA Moscow1-277%over
2026-04-04Zenit v Krylia Sovetov2-181%over
2026-04-04Dynamo v FC Orenburg3-382%over
2026-04-04Akhmat v FC Krasnodar0-174%under
2026-03-22FC Orenburg v Spartak Moscow0-274%over
2026-03-22Dynamo v Zenit1-375%over
2026-03-22Krylia Sovetov v Rubin0-073%under
2026-03-22Lokomotiv v Akron5-187%over
2026-03-21Akhmat v FC Rostov1-064%under
2026-03-21CSKA Moscow v Dinamo Makhachkala3-162%over
2026-03-21FC Krasnodar v Nizhny Novgorod5-079%over
2026-03-21Baltika v FC Sochi4-076%over
2026-03-15Akron v Akhmat1-176%over
2026-03-15Nizhny Novgorod v Krylia Sovetov3-073%over
2026-03-15Rubin v Lokomotiv3-078%over
2026-03-14FC Sochi v FC Krasnodar1-285%over
2026-03-14Zenit v Spartak Moscow2-073%over
2026-03-14FC Rostov v Dynamo0-175%under
2026-03-14Baltika v CSKA Moscow1-061%under
2026-03-13Dinamo Makhachkala v FC Orenburg1-060%under
2026-03-09Lokomotiv v Akhmat2-282%over
2026-03-09Spartak Moscow v Akron4-378%over
2026-03-08FC Orenburg v Zenit2-169%over
2026-03-08Krylia Sovetov v Dinamo Makhachkala2-066%over
2026-03-08Rubin v FC Krasnodar2-172%over
2026-03-08CSKA Moscow v Dynamo1-477%over
2026-03-07FC Rostov v Baltika1-157%over
2026-03-07Nizhny Novgorod v FC Sochi2-176%over
2026-03-02FC Sochi v Spartak Moscow2-380%over
2026-03-01Dynamo v Krylia Sovetov4-085%over
2026-03-01Akhmat v CSKA Moscow1-070%under
2026-02-28FC Orenburg v Akron2-074%over
2026-02-28FC Krasnodar v FC Rostov2-174%over
2026-02-28Lokomotiv v Nizhny Novgorod2-183%over
2026-02-28Dinamo Makhachkala v Rubin2-155%over
2026-02-27Zenit v Baltika1-061%under