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.

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

Attack (0 = league average)Defense ↑Heerenveen -- attack 0.080 (1540 Elo), defense 0.043 (1521 Elo), 140 matchesSparta Rotterdam -- attack -0.201 (1399 Elo), defense -0.055 (1472 Elo), 141 matchesFortuna Sittard -- attack -0.104 (1448 Elo), defense -0.094 (1453 Elo), 136 matchesAjax -- attack 0.145 (1572 Elo), defense 0.334 (1667 Elo), 138 matchesAjaxCambuur -- attack -0.154 (1423 Elo), defense -0.072 (1464 Elo), 36 matchesExcelsior -- attack -0.028 (1486 Elo), defense 0.001 (1500 Elo), 106 matchesPSV Eindhoven -- attack 0.709 (1855 Elo), defense 0.197 (1598 Elo), 136 matchesPSV EindhovenEmmen -- attack -0.100 (1450 Elo), defense -0.034 (1483 Elo), 42 matchesWaalwijk -- attack -0.046 (1477 Elo), defense -0.151 (1424 Elo), 102 matchesUtrecht -- attack 0.119 (1559 Elo), defense 0.257 (1628 Elo), 142 matchesUtrechtGroningen -- attack -0.063 (1468 Elo), defense 0.145 (1573 Elo), 103 matchesFC Volendam -- attack -0.305 (1348 Elo), defense 0.015 (1508 Elo), 102 matchesVitesse -- attack -0.151 (1424 Elo), defense -0.100 (1450 Elo), 68 matchesFeyenoord -- attack 0.225 (1613 Elo), defense 0.251 (1626 Elo), 136 matchesFeyenoordNEC Nijmegen -- attack 0.284 (1642 Elo), defense 0.098 (1549 Elo), 138 matchesNEC NijmegenTwente -- attack 0.198 (1599 Elo), defense 0.250 (1625 Elo), 142 matchesAZ Alkmaar -- attack 0.114 (1557 Elo), defense 0.147 (1574 Elo), 138 matchesGO Ahead Eagles -- attack 0.069 (1534 Elo), defense 0.075 (1538 Elo), 138 matchesFC Eindhoven -- attack -0.009 (1495 Elo), defense 0.000 (1500 Elo), 2 matchesAlmere City FC -- attack -0.325 (1337 Elo), defense -0.027 (1486 Elo), 74 matchesVVV Venlo -- attack 0.006 (1503 Elo), defense 0.003 (1501 Elo), 4 matchesWillem II -- attack -0.138 (1431 Elo), defense -0.096 (1452 Elo), 40 matchesNAC Breda -- attack -0.272 (1364 Elo), defense -0.037 (1482 Elo), 78 matchesMVV -- attack -0.017 (1491 Elo), defense -0.017 (1492 Elo), 2 matchesHeracles -- attack -0.312 (1344 Elo), defense -0.344 (1328 Elo), 102 matchesPEC Zwolle -- attack -0.136 (1432 Elo), defense -0.205 (1398 Elo), 102 matchesRoda -- attack -0.025 (1487 Elo), defense -0.059 (1470 Elo), 2 matchesDordrecht -- attack -0.022 (1489 Elo), defense 0.019 (1509 Elo), 6 matchesDe Graafschap -- attack -0.043 (1478 Elo), defense -0.003 (1498 Elo), 4 matchesADO Den Haag -- attack -0.056 (1472 Elo), defense -0.076 (1462 Elo), 6 matchesDen Bosch -- attack -0.056 (1472 Elo), defense 0.042 (1521 Elo), 4 matchesTelstar -- attack 0.038 (1519 Elo), defense 0.068 (1534 Elo), 40 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
PSV Eindhoven0.7090.197185515982.781.12136
NEC Nijmegen0.2840.098164215491.811.24138
Feyenoord0.2250.251161316261.711.06136
Twente0.1980.250159916251.671.06142
Ajax0.1450.334157216671.580.98138
Utrecht0.1190.257155916281.541.06142
AZ Alkmaar0.1140.147155715741.531.18138
Heerenveen0.0800.043154015211.481.31140
GO Ahead Eagles0.0690.075153415381.461.27138
Telstar0.0380.068151915341.421.2840
VVV Venlo0.0060.003150315011.371.364
FC Eindhoven-0.0090.000149515001.351.372
MVV-0.017-0.017149114921.341.392
Dordrecht-0.0220.019148915091.341.346
Roda-0.025-0.059148714701.331.452
Excelsior-0.0280.001148615001.331.36106
De Graafschap-0.043-0.003147814981.311.374
Waalwijk-0.046-0.151147714241.301.59102
ADO Den Haag-0.056-0.076147214621.291.476
Den Bosch-0.0560.042147215211.291.314
Groningen-0.0630.145146815731.281.18103
Emmen-0.100-0.034145014831.241.4142
Fortuna Sittard-0.104-0.094144814531.231.50136
PEC Zwolle-0.136-0.205143213981.191.68102
Willem II-0.138-0.096143114521.191.5040
Vitesse-0.151-0.100142414501.171.5168
Cambuur-0.154-0.072142314641.171.4736
Sparta Rotterdam-0.201-0.055139914721.121.44141
NAC Breda-0.272-0.037136414821.041.4278
FC Volendam-0.3050.015134815081.011.35102
Heracles-0.312-0.344134413281.001.93102
Almere City FC-0.325-0.027133714860.991.4074

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 — Netherlands - Eredivisie (212)

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

DateMatchScoreP(over)ActualCall
2026-09-18Groningen v PEC Zwolle3-087%over
2026-09-15Ajax v Willem II5-187%over
2026-09-13Excelsior v Utrecht1-286%over
2026-09-13Heerenveen v Telstar0-082%under
2026-09-13PEC Zwolle v Feyenoord0-785%over
2026-09-13PSV Eindhoven v Sparta Rotterdam4-194%over
2026-09-12Twente v ADO Den Haag2-086%over
2026-09-12GO Ahead Eagles v Groningen1-187%over
2026-09-12Fortuna Sittard v Ajax1-581%over
2026-09-12Cambuur v NEC Nijmegen3-089%over
2026-09-11AZ Alkmaar v Willem II1-190%over
2026-09-09Twente v Telstar1-085%under
2026-09-08Utrecht v GO Ahead Eagles3-387%over
2026-09-08NEC Nijmegen v Excelsior2-286%over
2026-09-06Groningen v Twente2-282%over
2026-09-06Heerenveen v AZ Alkmaar2-383%over
2026-09-06Telstar v Cambuur2-287%over
2026-09-06ADO Den Haag v Fortuna Sittard2-384%over
2026-09-05NEC Nijmegen v Feyenoord1-387%over
2026-09-05Ajax v PSV Eindhoven1-389%over
2026-09-05Willem II v Excelsior0-383%over
2026-09-04Sparta Rotterdam v PEC Zwolle2-282%over
2026-08-30Utrecht v PSV Eindhoven1-690%over
2026-08-30Willem II v Heerenveen2-282%over
2026-08-30Feyenoord v ADO Den Haag2-287%over
2026-08-30Telstar v Ajax0-479%over
2026-08-30Cambuur v Twente1-483%over
2026-08-29Excelsior v Sparta Rotterdam2-181%over
2026-08-29AZ Alkmaar v GO Ahead Eagles5-283%over
2026-08-29PEC Zwolle v NEC Nijmegen1-386%over
2026-08-28Groningen v Fortuna Sittard2-382%over
2026-08-23GO Ahead Eagles v ADO Den Haag3-186%over
2026-08-23PSV Eindhoven v Groningen5-189%over
2026-08-23Cambuur v Feyenoord2-581%over
2026-08-22Fortuna Sittard v AZ Alkmaar0-282%over
2026-08-22Sparta Rotterdam v Utrecht3-378%over
2026-08-22Heerenveen v PEC Zwolle0-285%over
2026-08-16ADO Den Haag v Groningen1-478%over
2026-08-16Feyenoord v GO Ahead Eagles2-282%over
2026-08-16Twente v PEC Zwolle3-183%over
2026-08-16Ajax v Heerenveen2-279%over
2026-08-15Willem II v NEC Nijmegen1-485%over
2026-08-15Utrecht v AZ Alkmaar1-479%over
2026-08-15Excelsior v PSV Eindhoven1-289%over
2026-08-15Fortuna Sittard v Cambuur3-182%over
2026-08-14Telstar v Sparta Rotterdam1-379%over
2026-08-09Sparta Rotterdam v Feyenoord0-179%under
2026-08-09PEC Zwolle v Ajax0-280%over
2026-08-09Groningen v Utrecht2-176%over
2026-08-09Heerenveen v Twente1-081%under
2026-08-08NEC Nijmegen v Telstar1-285%over
2026-08-08GO Ahead Eagles v Willem II4-182%over
2026-08-08PSV Eindhoven v Fortuna Sittard2-292%over
2026-08-08AZ Alkmaar v ADO Den Haag2-083%over
2026-08-07Cambuur v Excelsior0-480%over
2026-05-24Ajax v Utrecht1-175%over
2026-05-21Ajax v Groningen2-075%over
2026-05-21Utrecht v Heerenveen3-278%over
2026-05-17PEC Zwolle v Feyenoord0-285%over
2026-05-17PSV Eindhoven v Twente5-189%over
2026-05-17AZ Alkmaar v NAC Breda3-376%over
2026-05-17Heracles v Groningen1-279%over
2026-05-17Utrecht v Fortuna Sittard2-082%over
2026-05-17Heerenveen v Ajax0-081%under
2026-05-17NEC Nijmegen v GO Ahead Eagles2-187%over
2026-05-17FC Volendam v Telstar1-273%over
2026-05-17Sparta Rotterdam v Excelsior2-375%over
2026-05-11NAC Breda v Heerenveen2-077%over
2026-05-10Ajax v Utrecht1-277%over
2026-05-10Excelsior v FC Volendam1-174%over
2026-05-10Groningen v NEC Nijmegen2-182%over
2026-05-10Fortuna Sittard v PEC Zwolle3-283%over
2026-05-10Feyenoord v AZ Alkmaar1-181%over
2026-05-10GO Ahead Eagles v PSV Eindhoven1-490%over
2026-05-10Twente v Sparta Rotterdam4-077%over
2026-05-10Telstar v Heracles3-086%over
2026-05-03FC Volendam v Heerenveen0-277%over
2026-05-03PEC Zwolle v Heracles1-087%under
2026-05-03Fortuna Sittard v Feyenoord1-283%over
2026-05-03AZ Alkmaar v Twente2-275%over
2026-05-03Sparta Rotterdam v GO Ahead Eagles2-274%over
2026-05-02Utrecht v NAC Breda2-076%over
2026-05-02Groningen v Excelsior2-374%over
2026-05-02Ajax v PSV Eindhoven2-288%over
2026-05-02NEC Nijmegen v Telstar1-188%over
2026-04-26Excelsior v Utrecht5-074%over
2026-04-26Heracles v FC Volendam0-278%over
2026-04-25Feyenoord v Groningen3-177%over
2026-04-25Heerenveen v Fortuna Sittard2-185%over
2026-04-25NAC Breda v Ajax0-276%over
2026-04-25Twente v NEC Nijmegen1-185%over
2026-04-23GO Ahead Eagles v AZ Alkmaar0-081%under
2026-04-23PSV Eindhoven v PEC Zwolle6-194%over
2026-04-22Telstar v Sparta Rotterdam4-173%over
2026-04-12Fortuna Sittard v NAC Breda1-177%over
2026-04-12PEC Zwolle v Excelsior2-278%over
2026-04-12NEC Nijmegen v Feyenoord1-189%over
2026-04-12AZ Alkmaar v Heerenveen3-083%over
2026-04-11Utrecht v Telstar4-175%over
2026-04-11Sparta Rotterdam v PSV Eindhoven0-285%over
2026-04-11Groningen v GO Ahead Eagles0-079%under
2026-04-11Heracles v Ajax0-386%over
2026-04-10Twente v FC Volendam2-177%over
2026-04-05GO Ahead Eagles v PEC Zwolle5-083%over
2026-04-05Heerenveen v Heracles4-189%over
2026-04-05FC Volendam v Feyenoord0-082%under
2026-04-05NAC Breda v Sparta Rotterdam0-072%under
2026-04-04PSV Eindhoven v Utrecht4-382%over
2026-04-04AZ Alkmaar v Fortuna Sittard2-084%over
2026-04-04Telstar v Groningen0-275%over
2026-04-04Ajax v Twente1-277%over
2026-04-04Excelsior v NEC Nijmegen0-286%over
2026-03-22NEC Nijmegen v Heerenveen2-291%over
2026-03-22Utrecht v GO Ahead Eagles2-077%over
2026-03-22Feyenoord v Ajax1-185%over
2026-03-22Groningen v AZ Alkmaar3-077%over
2026-03-22Telstar v PSV Eindhoven3-187%over
2026-03-21Fortuna Sittard v Twente1-280%over
2026-03-21Sparta Rotterdam v FC Volendam2-073%over
2026-03-21PEC Zwolle v NAC Breda2-178%over
2026-03-20Heracles v Excelsior1-181%over
2026-03-15Twente v Utrecht0-272%over
2026-03-15AZ Alkmaar v Heracles4-087%over
2026-03-15Feyenoord v Excelsior2-186%over
2026-03-15GO Ahead Eagles v NAC Breda6-077%over
2026-03-14FC Volendam v Fortuna Sittard1-278%over
2026-03-14PSV Eindhoven v NEC Nijmegen2-394%over
2026-03-14Heerenveen v Telstar3-082%over
2026-03-14Ajax v Sparta Rotterdam4-077%over
2026-03-13PEC Zwolle v Groningen1-178%over
2026-03-08Sparta Rotterdam v PEC Zwolle1-178%over
2026-03-08Fortuna Sittard v Telstar1-478%over
2026-03-08GO Ahead Eagles v Twente1-476%over
2026-03-08NAC Breda v Feyenoord3-377%over
2026-03-08NEC Nijmegen v FC Volendam3-088%over
2026-03-07Groningen v Ajax3-175%over
2026-03-07PSV Eindhoven v AZ Alkmaar2-190%over
2026-03-07Excelsior v Heerenveen1-280%over
2026-03-06Heracles v Utrecht0-082%under
2026-03-01PEC Zwolle v Ajax0-084%under
2026-03-01Twente v Feyenoord2-081%over
2026-03-01FC Volendam v Groningen3-269%over
2026-03-01Utrecht v AZ Alkmaar2-078%over
2026-03-01Excelsior v GO Ahead Eagles0-179%under
2026-02-28Heerenveen v Sparta Rotterdam2-179%over
2026-02-28Heracles v PSV Eindhoven1-394%over
2026-02-28NEC Nijmegen v Fortuna Sittard2-389%over
2026-02-27Telstar v NAC Breda3-070%over
2026-02-22Twente v Groningen2-173%over
2026-02-22Utrecht v PEC Zwolle1-183%over
2026-02-22GO Ahead Eagles v Heracles4-087%over
2026-02-22AZ Alkmaar v Sparta Rotterdam3-176%over
2026-02-22Feyenoord v Telstar2-185%over
2026-02-21PSV Eindhoven v Heerenveen3-193%over
2026-02-21NAC Breda v FC Volendam1-069%under
2026-02-21Ajax v NEC Nijmegen1-190%over
2026-02-20Fortuna Sittard v Excelsior2-178%over
2026-02-17Sparta Rotterdam v NEC Nijmegen1-185%over
2026-02-15Feyenoord v GO Ahead Eagles1-089%under
2026-02-15Heerenveen v PEC Zwolle4-284%over
2026-02-15Telstar v Twente1-175%over
2026-02-14Heracles v NAC Breda0-181%under
2026-02-14Excelsior v AZ Alkmaar1-279%over
2026-02-14Ajax v Fortuna Sittard4-182%over
2026-02-14Groningen v Utrecht1-270%over
2026-02-13FC Volendam v PSV Eindhoven2-189%over
2026-02-11GO Ahead Eagles v Heerenveen1-383%over
2026-02-11NEC Nijmegen v Utrecht1-387%over
2026-02-08Utrecht v Feyenoord0-184%under
2026-02-08AZ Alkmaar v Ajax1-182%over
2026-02-08GO Ahead Eagles v Telstar1-181%over
2026-02-08Groningen v PSV Eindhoven1-285%over
2026-02-07NEC Nijmegen v Heracles4-195%over
2026-02-07PEC Zwolle v FC Volendam1-280%over
2026-02-07Twente v Heerenveen5-077%over
2026-02-07Fortuna Sittard v Sparta Rotterdam2-272%over
2026-02-06NAC Breda v Excelsior0-274%over
2026-02-01Excelsior v Ajax2-280%over
2026-02-01PSV Eindhoven v Feyenoord3-094%over
2026-02-01Heracles v Fortuna Sittard2-184%over
2026-02-01Heerenveen v Utrecht1-178%over
2026-02-01FC Volendam v GO Ahead Eagles1-180%over
2026-01-31AZ Alkmaar v NEC Nijmegen1-389%over
2026-01-31PEC Zwolle v Telstar4-178%over
2026-01-31Sparta Rotterdam v Groningen2-069%over
2026-01-30NAC Breda v Twente2-269%over
2026-01-25Telstar v AZ Alkmaar0-180%under
2026-01-25Groningen v Fortuna Sittard1-273%over
2026-01-25Utrecht v Sparta Rotterdam0-176%under
2026-01-25Feyenoord v Heracles4-294%over
2026-01-24Ajax v FC Volendam2-084%over
2026-01-24NEC Nijmegen v PEC Zwolle2-192%over
2026-01-24PSV Eindhoven v NAC Breda2-291%over
2026-01-24Twente v Excelsior0-079%under
2026-01-21AZ Alkmaar v Excelsior1-186%over
2026-01-18Heerenveen v Groningen0-276%over
2026-01-18Heracles v Twente0-284%over
2026-01-18FC Volendam v Utrecht2-177%over
2026-01-18Feyenoord v Sparta Rotterdam3-483%over
2026-01-17Ajax v GO Ahead Eagles2-285%over
2026-01-17PEC Zwolle v AZ Alkmaar3-184%over
2026-01-17Excelsior v Telstar2-278%over
2026-01-17Fortuna Sittard v PSV Eindhoven1-290%over
2026-01-17NAC Breda v NEC Nijmegen3-481%over
2026-01-11Heerenveen v Feyenoord2-285%over
2026-01-11GO Ahead Eagles v Fortuna Sittard2-280%over
2026-01-11Telstar v Ajax2-376%over
2026-01-11Sparta Rotterdam v Heracles2-082%over
2026-01-10AZ Alkmaar v FC Volendam1-087%under
2026-01-10Twente v PEC Zwolle1-184%over
2026-01-10PSV Eindhoven v Excelsior5-193%over
2026-01-10Groningen v NAC Breda0-070%under