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.

27 teams · K=0.025 · league avg 1.176 goals/team/match · home advantage +0.150 log-units (~16%) · seasons 2022, 2023, 2024, 2025 · generated 2026-09-19 10:32 UTC

Attack (0 = league average)Defense ↑AC Milan -- attack 0.115 (1557 Elo), defense 0.201 (1600 Elo), 152 matchesUdinese -- attack -0.020 (1490 Elo), defense 0.090 (1545 Elo), 152 matchesSampdoria -- attack -0.123 (1439 Elo), defense -0.123 (1439 Elo), 38 matchesAtalanta -- attack 0.161 (1580 Elo), defense 0.264 (1632 Elo), 152 matchesLecce -- attack -0.355 (1322 Elo), defense 0.026 (1513 Elo), 152 matchesInter -- attack 0.644 (1822 Elo), defense 0.286 (1643 Elo), 152 matchesInterMonza -- attack -0.245 (1378 Elo), defense -0.224 (1388 Elo), 114 matchesTorino -- attack -0.033 (1484 Elo), defense -0.135 (1432 Elo), 152 matchesLazio -- attack -0.036 (1482 Elo), defense 0.136 (1568 Elo), 152 matchesBologna -- attack 0.064 (1532 Elo), defense 0.061 (1530 Elo), 152 matchesFiorentina -- attack -0.012 (1494 Elo), defense 0.080 (1540 Elo), 152 matchesCremonese -- attack -0.247 (1376 Elo), defense -0.173 (1413 Elo), 76 matchesSalernitana -- attack -0.100 (1450 Elo), defense -0.210 (1395 Elo), 76 matchesAS Roma -- attack 0.329 (1664 Elo), defense 0.333 (1667 Elo), 152 matchesAS RomaSpezia -- attack -0.095 (1452 Elo), defense -0.083 (1458 Elo), 39 matchesEmpoli -- attack -0.193 (1404 Elo), defense -0.107 (1447 Elo), 114 matchesHellas Verona -- attack -0.418 (1291 Elo), defense -0.083 (1458 Elo), 153 matchesNapoli -- attack 0.200 (1600 Elo), defense 0.289 (1644 Elo), 152 matchesJuventus -- attack 0.233 (1616 Elo), defense 0.306 (1653 Elo), 152 matchesJuventusSassuolo -- attack -0.001 (1499 Elo), defense -0.048 (1476 Elo), 114 matchesFrosinone -- attack -0.044 (1478 Elo), defense -0.110 (1445 Elo), 38 matchesGenoa -- attack -0.103 (1448 Elo), defense 0.046 (1523 Elo), 114 matchesCagliari -- attack -0.091 (1454 Elo), defense -0.047 (1477 Elo), 114 matchesParma -- attack -0.279 (1361 Elo), defense 0.084 (1542 Elo), 76 matchesVenezia -- attack -0.157 (1421 Elo), defense -0.027 (1486 Elo), 38 matchesComo -- attack 0.332 (1666 Elo), defense 0.330 (1665 Elo), 76 matchesComoPisa -- attack -0.325 (1338 Elo), defense -0.363 (1319 Elo), 38 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
Inter0.6440.286182216432.240.88152
Como0.3320.330166616651.640.8476
AS Roma0.3290.333166416671.630.84152
Juventus0.2330.306161616531.480.87152
Napoli0.2000.289160016441.440.88152
Atalanta0.1610.264158016321.380.90152
AC Milan0.1150.201155716001.320.96152
Bologna0.0640.061153215301.251.11152
Sassuolo-0.001-0.048149914761.171.23114
Fiorentina-0.0120.080149415401.161.08152
Udinese-0.0200.090149015451.151.07152
Torino-0.033-0.135148414321.141.35152
Lazio-0.0360.136148215681.131.03152
Frosinone-0.044-0.110147814451.121.3138
Cagliari-0.091-0.047145414771.071.23114
Spezia-0.095-0.083145214581.071.2839
Salernitana-0.100-0.210145013951.061.4576
Genoa-0.1030.046144815231.061.12114
Sampdoria-0.123-0.123143914391.041.3338
Venezia-0.157-0.027142114861.001.2138
Empoli-0.193-0.107140414470.971.31114
Monza-0.245-0.224137813880.921.47114
Cremonese-0.247-0.173137614130.921.4076
Parma-0.2790.084136115420.891.0876
Pisa-0.325-0.363133813190.851.6938
Lecce-0.3550.026132215130.821.15152
Hellas Verona-0.418-0.083129114580.771.28153

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 — Italy - Serie A (255)

Switch leagues with the tabs above the ratings table; newest match first.

DateMatchScoreP(over)ActualCall
2026-09-18Monza v Sassuolo2-180%over
2026-09-14Torino v AS Roma0-279%over
2026-09-14Como v Parma2-171%over
2026-09-14Inter v Udinese5-382%over
2026-09-13Lecce v Monza3-268%over
2026-09-13Napoli v Bologna1-072%under
2026-09-13Sassuolo v Juventus3-272%over
2026-09-12Genoa v Frosinone1-172%over
2026-09-12Lazio v AC Milan2-266%over
2026-09-12Atalanta v Cagliari1-268%over
2026-09-11Venezia v Fiorentina2-471%over
2026-09-07Cagliari v Lecce1-064%under
2026-09-07Udinese v Lazio1-267%over
2026-09-06Frosinone v Venezia3-271%over
2026-09-06Parma v Monza1-168%over
2026-09-06Bologna v Sassuolo2-272%over
2026-09-06Juventus v AC Milan1-169%over
2026-09-05Fiorentina v Torino1-274%over
2026-09-05Inter v Napoli3-278%over
2026-09-05AS Roma v Atalanta2-173%over
2026-09-04Genoa v Como1-470%over
2026-08-31Lecce v AS Roma0-468%over
2026-08-31Atalanta v Bologna1-071%under
2026-08-30Napoli v Como1-270%over
2026-08-30Lazio v Genoa1-066%under
2026-08-30Cagliari v Inter0-180%under
2026-08-29Sassuolo v Torino2-176%over
2026-08-29Fiorentina v Frosinone0-372%over
2026-08-29Monza v Udinese2-371%over
2026-08-29Juventus v Parma2-065%over
2026-08-28AC Milan v Venezia2-070%over
2026-08-24Bologna v Lazio0-169%under
2026-08-24AS Roma v Fiorentina4-072%over
2026-08-23Frosinone v Juventus0-173%under
2026-08-23Venezia v Lecce0-263%over
2026-08-23Atalanta v Sassuolo2-172%over
2026-08-23Torino v AC Milan1-273%over
2026-08-22Udinese v Como1-171%over
2026-08-22Inter v Monza4-184%over
2026-08-22Genoa v Napoli0-268%over
2026-08-22Parma v Cagliari0-165%under
2026-05-24Parma v Sassuolo1-065%under
2026-05-24Napoli v Udinese1-071%under
2026-05-24AC Milan v Cagliari1-271%over
2026-05-24Torino v Juventus2-273%over
2026-05-24Hellas Verona v AS Roma0-270%over
2026-05-24Cremonese v Como1-471%over
2026-05-24Lecce v Genoa1-059%under
2026-05-23Bologna v Inter3-380%over
2026-05-23Lazio v Pisa2-173%over
2026-05-22Fiorentina v Atalanta1-168%over
2026-05-17Genoa v AC Milan1-265%over
2026-05-17Juventus v Fiorentina0-272%over
2026-05-17AS Roma v Lazio2-070%over
2026-05-17Pisa v Napoli0-376%over
2026-05-17Como v Parma1-070%under
2026-05-17Inter v Hellas Verona1-187%over
2026-05-17Atalanta v Bologna0-172%under
2026-05-17Sassuolo v Lecce2-363%over
2026-05-17Cagliari v Torino2-172%over
2026-05-17Udinese v Cremonese0-171%under
2026-05-11Napoli v Bologna2-369%over
2026-05-10Hellas Verona v Como0-172%under
2026-05-10Fiorentina v Genoa0-070%under
2026-05-10Cremonese v Pisa3-070%over
2026-05-10Parma v AS Roma2-364%over
2026-05-10AC Milan v Atalanta2-364%over
2026-05-09Cagliari v Udinese0-270%over
2026-05-09Lazio v Inter0-378%over
2026-05-09Lecce v Juventus0-165%under
2026-05-08Torino v Sassuolo2-173%over
2026-05-04Cremonese v Lazio1-265%over
2026-05-04AS Roma v Fiorentina4-071%over
2026-05-03Bologna v Cagliari0-072%under
2026-05-03Sassuolo v AC Milan2-068%over
2026-05-03Juventus v Hellas Verona1-177%over
2026-05-03Inter v Parma2-082%over
2026-05-02Udinese v Torino2-074%over
2026-05-02Como v Napoli0-073%under
2026-05-02Atalanta v Genoa0-072%under
2026-05-01Pisa v Lecce1-260%over
2026-04-27Cagliari v Atalanta3-269%over
2026-04-27Lazio v Udinese3-362%over
2026-04-26Fiorentina v Sassuolo0-075%under
2026-04-26Genoa v Como0-276%over
2026-04-26Torino v Inter2-286%over
2026-04-26AC Milan v Juventus0-069%under
2026-04-25Parma v Pisa1-066%under
2026-04-25Bologna v AS Roma0-270%over
2026-04-25Hellas Verona v Lecce0-057%under
2026-04-24Napoli v Cremonese4-071%over
2026-04-20Lecce v Fiorentina1-164%over
2026-04-19Cremonese v Torino0-072%under
2026-04-19Hellas Verona v AC Milan0-171%under
2026-04-19Pisa v Genoa1-273%over
2026-04-19Juventus v Bologna2-076%over
2026-04-18Udinese v Parma0-164%under
2026-04-18Napoli v Lazio0-263%over
2026-04-18AS Roma v Atalanta1-167%over
2026-04-17Sassuolo v Como2-178%over
2026-04-17Inter v Cagliari3-088%over
2026-04-13Fiorentina v Lazio1-067%under
2026-04-12Genoa v Sassuolo2-173%over
2026-04-12Parma v Napoli1-165%over
2026-04-12Bologna v Lecce2-065%over
2026-04-12Como v Inter3-478%over
2026-04-11Cagliari v Cremonese1-071%under
2026-04-11Torino v Hellas Verona2-172%over
2026-04-11AC Milan v Udinese0-370%over
2026-04-11Atalanta v Juventus0-172%under
2026-04-10AS Roma v Pisa3-077%over
2026-04-06Udinese v Como0-075%under
2026-04-06Lecce v Atalanta0-362%over
2026-04-06Juventus v Genoa2-078%over
2026-04-06Napoli v AC Milan1-069%under
2026-04-05Cremonese v Bologna1-270%over
2026-04-05Pisa v Torino0-177%under
2026-04-05Inter v AS Roma5-272%over
2026-04-04Sassuolo v Cagliari2-173%over
2026-04-04Hellas Verona v Fiorentina0-173%under
2026-04-04Lazio v Parma1-160%over
2026-03-22Como v Pisa5-079%over
2026-03-22Atalanta v Hellas Verona1-077%under
2026-03-22Bologna v Lazio0-265%over
2026-03-22AS Roma v Lecce1-064%under
2026-03-22Fiorentina v Inter1-182%over
2026-03-21Parma v Cremonese0-264%over
2026-03-21AC Milan v Torino3-276%over
2026-03-21Juventus v Sassuolo1-181%over
2026-03-20Cagliari v Napoli0-174%under
2026-03-20Genoa v Udinese0-273%over
2026-03-16Cremonese v Fiorentina1-470%over
2026-03-15Hellas Verona v Genoa0-272%over
2026-03-15Sassuolo v Bologna0-176%under
2026-03-15Pisa v Cagliari3-171%over
2026-03-15Como v AS Roma2-167%over
2026-03-15Lazio v AC Milan1-065%under
2026-03-14Inter v Atalanta1-178%over
2026-03-14Napoli v Lecce2-167%over
2026-03-14Udinese v Juventus0-179%under
2026-03-13Torino v Parma4-164%over
2026-03-09Lazio v Sassuolo2-169%over
2026-03-08Lecce v Cremonese2-157%over
2026-03-08Bologna v Hellas Verona1-276%over
2026-03-08Fiorentina v Parma0-068%under
2026-03-08Genoa v AS Roma2-168%over
2026-03-08AC Milan v Inter1-077%under
2026-03-07Cagliari v Como1-272%over
2026-03-07Atalanta v Udinese2-274%over
2026-03-07Juventus v Pisa4-080%over
2026-03-06Napoli v Torino2-176%over
2026-03-02Pisa v Bologna0-174%under
2026-03-02Udinese v Fiorentina3-075%over
2026-03-01Cremonese v AC Milan0-270%over
2026-03-01Sassuolo v Atalanta2-174%over
2026-03-01Torino v Lazio2-067%over
2026-03-01AS Roma v Juventus3-366%over
2026-02-28Como v Lecce3-165%over
2026-02-28Hellas Verona v Napoli1-274%over
2026-02-28Inter v Genoa2-086%over
2026-02-27Parma v Cagliari1-164%over
2026-02-23Fiorentina v Pisa1-078%under
2026-02-23Bologna v Udinese1-077%under
2026-02-22Genoa v Torino3-074%over
2026-02-22Atalanta v Napoli2-168%over
2026-02-22AC Milan v Parma0-171%under
2026-02-22AS Roma v Cremonese3-064%over
2026-02-21Juventus v Como0-273%over
2026-02-21Lecce v Inter0-276%over
2026-02-21Cagliari v Lazio0-069%under
2026-02-20Sassuolo v Hellas Verona3-074%over
2026-02-18AC Milan v Como1-172%over
2026-02-16Cagliari v Lecce0-263%over
2026-02-15Udinese v Sassuolo1-275%over
2026-02-15Cremonese v Genoa0-072%under
2026-02-15Parma v Hellas Verona2-164%over
2026-02-15Torino v Bologna1-275%over
2026-02-15Napoli v AS Roma2-260%over
2026-02-14Como v Fiorentina1-277%over
2026-02-14Lazio v Atalanta0-266%over
2026-02-14Inter v Juventus3-279%over
2026-02-13Pisa v AC Milan1-276%over
2026-02-09Atalanta v Cremonese2-171%over
2026-02-09AS Roma v Cagliari2-067%over
2026-02-08Bologna v Parma0-172%under
2026-02-08Lecce v Udinese2-161%over
2026-02-08Sassuolo v Inter0-581%over
2026-02-08Juventus v Lazio2-269%over
2026-02-07Genoa v Napoli2-369%over
2026-02-07Fiorentina v Torino2-276%over
2026-02-06Hellas Verona v Pisa0-073%under
2026-02-03Bologna v AC Milan0-376%over
2026-02-02Udinese v AS Roma1-067%under
2026-02-01Torino v Lecce1-061%under
2026-02-01Como v Atalanta0-072%under
2026-02-01Cremonese v Inter0-280%over
2026-02-01Parma v Juventus1-464%over
2026-01-31Pisa v Sassuolo1-373%over
2026-01-31Napoli v Fiorentina2-172%over
2026-01-31Cagliari v Hellas Verona4-072%over
2026-01-30Lazio v Genoa3-265%over
2026-01-26Hellas Verona v Udinese1-369%over
2026-01-25Sassuolo v Cremonese1-071%under
2026-01-25Genoa v Bologna3-272%over
2026-01-25Atalanta v Parma4-064%over
2026-01-25Juventus v Napoli3-063%over
2026-01-25AS Roma v AC Milan1-164%over
2026-01-24Como v Torino6-071%over
2026-01-24Fiorentina v Cagliari1-275%over
2026-01-24Lecce v Lazio0-057%under
2026-01-23Inter v Pisa6-280%over
2026-01-19Cremonese v Hellas Verona0-071%under
2026-01-19Lazio v Como0-363%over
2026-01-18Parma v Genoa0-064%under
2026-01-18Bologna v Fiorentina1-277%over
2026-01-18Torino v AS Roma0-263%over
2026-01-18AC Milan v Lecce1-072%under
2026-01-17Udinese v Inter0-181%under
2026-01-17Napoli v Sassuolo1-074%under
2026-01-17Cagliari v Juventus1-073%under
2026-01-16Pisa v Atalanta1-170%over
2026-01-15Hellas Verona v Bologna2-371%over
2026-01-15Como v AC Milan1-369%over
2026-01-14Napoli v Parma0-068%under
2026-01-14Inter v Lecce1-080%under
2026-01-12Genoa v Cagliari3-072%over
2026-01-12Juventus v Cremonese5-069%over
2026-01-11Lecce v Parma1-257%over
2026-01-11Fiorentina v AC Milan1-176%over
2026-01-11Hellas Verona v Lazio0-166%under
2026-01-11Inter v Napoli2-273%over
2026-01-10Udinese v Pisa2-270%over
2026-01-10Como v Bologna1-170%over
2026-01-10AS Roma v Sassuolo2-070%over
2026-01-10Atalanta v Torino2-071%over
2026-01-08Cremonese v Cagliari2-269%over
2026-01-08AC Milan v Genoa1-176%over
2026-01-07Napoli v Hellas Verona2-272%over
2026-01-07Bologna v Atalanta0-271%over
2026-01-07Lazio v Fiorentina2-268%over
2026-01-07Torino v Udinese1-270%over
2026-01-07Parma v Inter0-274%over
2026-01-06Pisa v Como0-366%over
2026-01-06Lecce v AS Roma0-258%over
2026-01-06Sassuolo v Juventus0-370%over
2026-01-04Lazio v Napoli0-261%over
2026-01-04Fiorentina v Cremonese1-073%under
2026-01-04Hellas Verona v Torino0-366%over
2026-01-04Inter v Bologna3-177%over
2026-01-03Como v Udinese1-074%under
2026-01-03Sassuolo v Parma1-168%over
2026-01-03Genoa v Pisa1-168%over
2026-01-03Juventus v Lecce1-166%over
2026-01-03Atalanta v AS Roma1-064%under
2026-01-02Cagliari v AC Milan0-176%under