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.

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

Attack (0 = league average)Defense ↑Benfica -- attack 0.544 (1772 Elo), defense 0.427 (1714 Elo), 136 matchesBenficaArouca -- attack 0.105 (1552 Elo), defense -0.131 (1435 Elo), 136 matchesRio Ave -- attack -0.167 (1416 Elo), defense -0.121 (1439 Elo), 136 matchesVizela -- attack -0.095 (1453 Elo), defense -0.174 (1413 Elo), 70 matchesEstoril -- attack 0.153 (1577 Elo), defense -0.131 (1434 Elo), 136 matchesFamalicao -- attack -0.026 (1487 Elo), defense 0.326 (1663 Elo), 136 matchesFC Porto -- attack 0.306 (1653 Elo), defense 0.524 (1762 Elo), 136 matchesFC PortoMaritimo -- attack -0.042 (1479 Elo), defense -0.080 (1460 Elo), 36 matchesSanta Clara -- attack -0.199 (1401 Elo), defense 0.170 (1585 Elo), 102 matchesCasa Pia -- attack -0.253 (1374 Elo), defense 0.002 (1501 Elo), 138 matchesSC Braga -- attack 0.310 (1655 Elo), defense 0.221 (1611 Elo), 136 matchesSC BragaSporting CP -- attack 0.663 (1832 Elo), defense 0.434 (1717 Elo), 136 matchesSporting CPPortimonense -- attack -0.069 (1466 Elo), defense -0.152 (1424 Elo), 70 matchesBoavista -- attack -0.229 (1385 Elo), defense -0.179 (1410 Elo), 102 matchesChaves -- attack -0.133 (1433 Elo), defense -0.115 (1442 Elo), 68 matchesVitória SC -- attack -0.045 (1477 Elo), defense -0.024 (1488 Elo), 136 matchesGIL Vicente -- attack -0.024 (1488 Elo), defense 0.095 (1547 Elo), 136 matchesPacos Ferreira -- attack -0.089 (1456 Elo), defense -0.083 (1459 Elo), 34 matchesEstrela -- attack -0.182 (1409 Elo), defense -0.105 (1448 Elo), 104 matchesFarense -- attack -0.176 (1412 Elo), defense 0.023 (1512 Elo), 68 matchesMoreirense -- attack -0.169 (1416 Elo), defense -0.026 (1487 Elo), 102 matchesAVS -- attack -0.291 (1355 Elo), defense -0.152 (1424 Elo), 72 matchesNacional -- attack -0.157 (1422 Elo), defense 0.058 (1529 Elo), 68 matchesAlverca -- attack -0.135 (1433 Elo), defense -0.020 (1490 Elo), 34 matchesTondela -- attack -0.242 (1379 Elo), defense -0.081 (1460 Elo), 34 matchesTorreense -- attack -0.068 (1466 Elo), defense 0.000 (1500 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
Sporting CP0.6630.434183217172.280.76136
Benfica0.5440.427177217142.030.77136
SC Braga0.3100.221165516111.600.94136
FC Porto0.3060.524165317621.600.70136
Estoril0.153-0.131157714341.371.34136
Arouca0.105-0.131155214351.311.34136
GIL Vicente-0.0240.095148815471.151.07136
Famalicao-0.0260.326148716631.150.85136
Maritimo-0.042-0.080147914601.131.2736
Vitória SC-0.045-0.024147714881.121.21136
Torreense-0.0680.000146615001.101.182
Portimonense-0.069-0.152146614241.101.3770
Pacos Ferreira-0.089-0.083145614591.081.2834
Vizela-0.095-0.174145314131.071.4070
Chaves-0.133-0.115143314421.031.3268
Alverca-0.135-0.020143314901.031.2034
Nacional-0.1570.058142215291.011.1168
Rio Ave-0.167-0.121141614391.001.33136
Moreirense-0.169-0.026141614870.991.21102
Farense-0.1760.023141215120.991.1568
Estrela-0.182-0.105140914480.981.31104
Santa Clara-0.1990.170140115850.960.99102
Boavista-0.229-0.179138514100.941.41102
Tondela-0.242-0.081137914600.921.2734
Casa Pia-0.2530.002137415010.911.17138
AVS-0.291-0.152135514240.881.3772

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 — Portugal - Primeira Liga (219)

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

DateMatchScoreP(over)ActualCall
2026-09-14Rio Ave v Estrela3-376%over
2026-09-14Moreirense v Maritimo3-174%over
2026-09-14SC Braga v Estoril1-079%under
2026-09-13Benfica v GIL Vicente3-180%over
2026-09-13Arouca v Santa Clara1-270%over
2026-09-13Famalicao v Sporting CP1-174%over
2026-09-12Nacional v Alverca1-370%over
2026-09-12Casa Pia v FC Porto1-469%over
2026-09-12Academico Viseu v Vitória SC2-170%over
2026-09-10Estrela v SC Braga2-179%over
2026-09-09Moreirense v Benfica0-481%over
2026-09-07Estoril v Arouca0-080%under
2026-09-06Santa Clara v Rio Ave4-066%over
2026-09-06Vitória SC v Casa Pia0-070%under
2026-09-06GIL Vicente v Academico Viseu0-171%under
2026-09-05Estrela v Famalicao2-267%over
2026-09-05Maritimo v Benfica0-382%over
2026-09-05Alverca v SC Braga1-275%over
2026-09-05Sporting CP v Nacional2-084%over
2026-09-04FC Porto v Moreirense2-175%over
2026-08-31Benfica v Estoril2-188%over
2026-08-31SC Braga v Vitória SC1-077%under
2026-08-30Nacional v Estrela2-371%over
2026-08-30Casa Pia v Moreirense0-170%under
2026-08-30Famalicao v GIL Vicente0-064%under
2026-08-29Arouca v Maritimo2-179%over
2026-08-29Alverca v Santa Clara1-166%over
2026-08-29Academico Viseu v FC Porto0-371%over
2026-08-28Rio Ave v Sporting CP0-480%over
2026-08-24GIL Vicente v Casa Pia2-071%over
2026-08-23Vitória SC v Nacional1-071%under
2026-08-23Santa Clara v Famalicao1-061%under
2026-08-23FC Porto v Arouca2-077%over
2026-08-22Maritimo v Academico Viseu2-274%over
2026-08-22Estoril v Rio Ave0-277%over
2026-08-22Sporting CP v Alverca3-184%over
2026-08-17Casa Pia v Benfica0-774%over
2026-08-16Nacional v Estoril2-076%over
2026-08-16Arouca v Moreirense4-076%over
2026-08-16Famalicao v Maritimo1-269%over
2026-08-15Alverca v Estrela2-271%over
2026-08-15Academico Viseu v Santa Clara0-170%under
2026-08-15Rio Ave v FC Porto0-270%over
2026-08-14Sporting CP v Vitória SC3-283%over
2026-08-10Santa Clara v Nacional2-264%over
2026-08-09FC Porto v Alverca2-073%over
2026-08-09Benfica v Academico Viseu2-281%over
2026-08-09Moreirense v SC Braga2-274%over
2026-08-09GIL Vicente v Rio Ave1-072%under
2026-08-08Maritimo v Casa Pia1-071%under
2026-08-08Vitória SC v Arouca0-178%under
2026-08-08Estrela v Sporting CP2-280%over
2026-08-07Estoril v Famalicao1-173%over
2026-05-28Casa Pia v Torreense2-066%over
2026-05-20Torreense v Casa Pia0-071%under
2026-05-16FC Porto v Santa Clara1-068%under
2026-05-16Moreirense v AVS0-072%under
2026-05-16SC Braga v Estrela2-280%over
2026-05-16Nacional v Vitória SC2-068%over
2026-05-16Arouca v Tondela3-175%over
2026-05-16Casa Pia v Rio Ave1-169%over
2026-05-16Sporting CP v GIL Vicente3-084%over
2026-05-16Estoril v Benfica1-385%over
2026-05-16Famalicao v Alverca1-066%under
2026-05-11Benfica v SC Braga2-279%over
2026-05-11Tondela v Moreirense2-067%over
2026-05-11Vitória SC v Casa Pia0-173%under
2026-05-11Rio Ave v Sporting CP1-483%over
2026-05-11Santa Clara v Nacional2-060%over
2026-05-11GIL Vicente v Arouca1-376%over
2026-05-11Estrela v Famalicao0-067%under
2026-05-10AVS v FC Porto3-175%over
2026-05-10Alverca v Estoril1-180%over
2026-05-04Sporting CP v Vitória SC5-183%over
2026-05-03Casa Pia v Tondela0-168%under
2026-05-03SC Braga v Estoril1-186%over
2026-05-03Rio Ave v GIL Vicente0-072%under
2026-05-02Moreirense v Estrela3-269%over
2026-05-02Nacional v AVS1-269%over
2026-05-02Arouca v Santa Clara2-268%over
2026-05-02Famalicao v Benfica2-269%over
2026-05-02FC Porto v Alverca1-079%under
2026-04-29Sporting CP v Tondela2-287%over
2026-04-27GIL Vicente v Casa Pia2-172%over
2026-04-26Estoril v Famalicao0-177%under
2026-04-26Santa Clara v SC Braga2-167%over
2026-04-26Estrela v FC Porto1-273%over
2026-04-26AVS v Sporting CP1-187%over
2026-04-25Tondela v Nacional0-264%over
2026-04-25Benfica v Moreirense4-178%over
2026-04-25Vitória SC v Rio Ave2-075%over
2026-04-24Alverca v Arouca2-177%over
2026-04-23Casa Pia v SC Braga0-178%under
2026-04-20Moreirense v Estoril1-081%under
2026-04-19Arouca v Estrela1-077%under
2026-04-19Sporting CP v Benfica1-278%over
2026-04-19FC Porto v Tondela2-080%over
2026-04-19SC Braga v Famalicao2-270%over
2026-04-18Nacional v Alverca1-070%under
2026-04-18Casa Pia v Santa Clara0-065%under
2026-04-18GIL Vicente v Vitória SC0-174%under
2026-04-17Rio Ave v AVS2-273%over
2026-04-13Tondela v GIL Vicente2-268%over
2026-04-12Alverca v Casa Pia3-173%over
2026-04-12Benfica v Nacional2-079%over
2026-04-12SC Braga v Arouca1-087%under
2026-04-12Estoril v FC Porto1-381%over
2026-04-11AVS v Vitória SC1-174%over
2026-04-11Santa Clara v Rio Ave0-266%over
2026-04-11Estrela v Sporting CP0-187%under
2026-04-10Famalicao v Moreirense1-166%over
2026-04-06Arouca v Estoril3-286%over
2026-04-06Casa Pia v Benfica1-180%over
2026-04-04Nacional v Estrela2-071%over
2026-04-04Moreirense v SC Braga0-178%under
2026-04-04Rio Ave v Alverca1-273%over
2026-04-04FC Porto v Famalicao2-265%over
2026-04-03GIL Vicente v AVS3-075%over
2026-04-03Vitória SC v Tondela5-068%over
2026-04-03Sporting CP v Santa Clara4-278%over
2026-03-22Estoril v Rio Ave1-284%over
2026-03-22Alverca v Sporting CP1-481%over
2026-03-22SC Braga v FC Porto1-272%over
2026-03-21Moreirense v Arouca0-180%under
2026-03-21Famalicao v Nacional1-065%under
2026-03-21Benfica v Vitória SC3-081%over
2026-03-21Santa Clara v GIL Vicente1-062%under
2026-03-21Tondela v AVS0-070%under
2026-03-20Estrela v Casa Pia4-072%over
2026-03-15Nacional v Estoril0-183%under
2026-03-15AVS v Santa Clara0-165%under
2026-03-15Rio Ave v Estrela2-172%over
2026-03-15FC Porto v Moreirense3-075%over
2026-03-14Vitória SC v Famalicao1-264%over
2026-03-14GIL Vicente v Alverca2-271%over
2026-03-14Arouca v Benfica1-285%over
2026-03-09Tondela v Rio Ave0-171%under
2026-03-08Estrela v GIL Vicente2-269%over
2026-03-08Benfica v FC Porto2-267%over
2026-03-08Santa Clara v Vitória SC2-064%over
2026-03-07Moreirense v Nacional1-173%over
2026-03-07Alverca v AVS0-077%under
2026-03-07SC Braga v Sporting CP2-279%over
2026-03-07Estoril v Casa Pia0-088%under
2026-03-06Famalicao v Arouca1-077%under
2026-03-02GIL Vicente v Benfica1-271%over
2026-03-01Tondela v Santa Clara2-259%over
2026-03-01Casa Pia v Moreirense1-175%over
2026-03-01Rio Ave v Famalicao0-071%under
2026-02-28AVS v Estrela0-076%under
2026-02-28Nacional v SC Braga1-278%over
2026-02-28Vitória SC v Alverca1-174%over
2026-02-27FC Porto v Arouca3-182%over
2026-02-27Sporting CP v Estoril3-092%over
2026-02-23Famalicao v Casa Pia2-073%over
2026-02-22Estoril v GIL Vicente3-182%over
2026-02-22FC Porto v Rio Ave1-082%under
2026-02-21Arouca v Nacional3-079%over
2026-02-21Alverca v Santa Clara1-163%over
2026-02-21Benfica v AVS3-091%over
2026-02-21Moreirense v Sporting CP0-380%over
2026-02-21SC Braga v Vitória SC3-278%over
2026-02-20Estrela v Tondela0-269%over
2026-02-16Rio Ave v Moreirense1-276%over
2026-02-15Nacional v FC Porto0-171%under
2026-02-15AVS v Estoril3-092%over
2026-02-15Sporting CP v Famalicao1-080%under
2026-02-14Casa Pia v Arouca3-280%over
2026-02-14Vitória SC v Estrela2-173%over
2026-02-14GIL Vicente v SC Braga2-171%over
2026-02-13Santa Clara v Benfica1-268%over
2026-02-13Tondela v Alverca1-170%over
2026-02-09Famalicao v AVS3-181%over
2026-02-09FC Porto v Sporting CP1-173%over
2026-02-08Nacional v Casa Pia0-079%under
2026-02-08SC Braga v Rio Ave3-086%over
2026-02-08Benfica v Alverca2-184%over
2026-02-07Moreirense v GIL Vicente1-268%over
2026-02-07Estrela v Santa Clara1-064%under
2026-02-07Estoril v Tondela2-285%over
2026-02-07Arouca v Vitória SC3-274%over
2026-02-02AVS v SC Braga0-485%over
2026-02-02Casa Pia v FC Porto2-177%over
2026-02-01GIL Vicente v Famalicao5-060%over
2026-02-01Sporting CP v Nacional2-188%over
2026-02-01Tondela v Benfica0-080%under
2026-01-31Santa Clara v Estoril2-474%over
2026-01-31Rio Ave v Arouca0-381%over
2026-01-31Alverca v Estrela1-176%over
2026-01-30Vitória SC v Moreirense1-071%under
2026-01-26FC Porto v GIL Vicente3-066%over
2026-01-25Nacional v Rio Ave4-078%over
2026-01-25Benfica v Estrela4-087%over
2026-01-25Famalicao v Tondela3-067%over
2026-01-25SC Braga v Alverca5-078%over
2026-01-24Moreirense v Santa Clara1-064%under
2026-01-24Arouca v Sporting CP1-290%over
2026-01-24Estoril v Vitória SC4-279%over
2026-01-23Casa Pia v AVS3-378%over
2026-01-19Estrela v Estoril0-581%over
2026-01-18Santa Clara v Famalicao0-157%under
2026-01-18Tondela v SC Braga0-175%under
2026-01-18Vitória SC v FC Porto0-167%under
2026-01-17GIL Vicente v Nacional2-168%over
2026-01-17Alverca v Moreirense2-173%over
2026-01-17AVS v Arouca0-182%under
2026-01-17Rio Ave v Benfica0-282%over
2026-01-16Sporting CP v Casa Pia3-091%over
2026-01-11Nacional v Santa Clara3-359%over
2026-01-11Moreirense v Tondela1-076%under
2026-01-04Rio Ave v Casa Pia3-176%over
2026-01-04Santa Clara v FC Porto0-160%under
2026-01-04Alverca v Famalicao1-068%under
2026-01-03Tondela v Arouca3-178%over
2026-01-03Benfica v Estoril3-188%over
2026-01-03Estrela v SC Braga3-372%over
2026-01-03AVS v Moreirense0-280%over
2026-01-02GIL Vicente v Sporting CP1-176%over
2026-01-02Vitória SC v Nacional2-168%over