Before kickoff, our model publishes its probabilities; at the same moment, the betting market sets its closing price. After full time, both are graded on what actually happened (log-loss — lower is better). The market is the judge, never an input — and we publish the verdict either way. How the ratings behind the model work.
The market leads across 90 graded matches. That gap is the mission — every model improvement ships only if it closes it, and this page will say so the day it does.
A 3-way close is a regulation-time instrument — a knockout Tie contract settles on the 90-minute scoreline — so every row is graded on the 90-minute outcome wherever it can be derived from the goal record, and on the full-time outcome (labelled 'full') where it cannot. The market and every engine on a row always grade against the SAME outcome: one basis per row, never mixed. 96 of 98 recorded quotes grade on the 90-minute outcome.
The headline pooled numbers weight one MATCH once: a fixture quoted on two venues is collapsed to a single per-match log-loss before pooling. The per-venue table keeps every row as recorded.
| Venue | Matches | Market | dc | elo |
|---|---|---|---|---|
| kalshi | 90 | 0.829 | 0.844 | 0.883 |
| polymarket | 8 | 0.989 | 0.934 | 0.957 |
Small samples stay labeled as such — a venue with a handful of matches proves nothing yet, in either direction.
The probability each grader gave the result that actually happened — higher was better that day.
| Date | Match | Result | Market | dc | elo |
|---|---|---|---|---|---|
| 2026-07-29 | Gornik Zabrze v Fenerbahce | X | 22% | — | — |
| 2026-07-19 | Spain v Argentina | X 90' | 32% | 32% | 29% |
| 2026-07-19 | Spain v Argentina | X 90' | 32% | 32% | 29% |
| 2026-07-18 | France v England | 2 | 21% | 35% | 25% |
| 2026-07-18 | France v England | 2 | 21% | 35% | 25% |
| 2026-07-15 | England v Argentina | 2 | 31% | 40% | 47% |
| 2026-07-15 | England v Argentina | 2 | 31% | 40% | 47% |
| 2026-07-14 | France v Spain | 2 | 30% | 42% | 36% |
| 2026-07-14 | France v Spain | 2 | 30% | 42% | 36% |
| 2026-07-11 | Argentina v Switzerland | X 90' | 29% | 26% | 21% |
| 2026-07-11 | Argentina v Switzerland | X 90' | 30% | 26% | 21% |
| 2026-07-11 | Norway v England | 2 | 54% | 55% | 50% |
| 2026-07-11 | Norway v England | 2 | 53% | 55% | 50% |
| 2026-07-10 | Spain v Belgium | 1 | 59% | 49% | 62% |
| 2026-07-10 | Spain v Belgium | 1 | 57% | 49% | 62% |
| 2026-07-09 | France v Morocco | 1 | 61% | 43% | 58% |
| 2026-07-09 | France v Morocco | 1 | 61% | 43% | 58% |
| 2026-07-07 | Argentina v Egypt | 1 | 73% | 65% | 80% |
| 2026-07-07 | Switzerland v Colombia | X | 33% | 29% | 28% |
| 2026-07-06 | Portugal v Spain | 2 | 50% | 43% | 46% |
| 2026-07-06 | United States v Belgium | 2 | 35% | 51% | 36% |
| 2026-07-05 | Brazil v Norway | 2 | 20% | 14% | 12% |
| 2026-07-05 | Mexico v England | 2 | 37% | 47% | 33% |
| 2026-07-04 | Canada v Morocco | 2 | 53% | 47% | 46% |
| 2026-07-04 | Paraguay v France | 2 | 81% | 60% | 71% |
| 2026-07-03 | Argentina v Cape Verde | X 90' | 11% | 15% | 7% |
| 2026-07-03 | Australia v Egypt | X | 35% | 34% | 30% |
| 2026-07-03 | Colombia v Ghana | 1 | 67% | 68% | 82% |
| 2026-07-02 | Portugal v Croatia | 1 | 57% | 50% | 51% |
| 2026-07-02 | Spain v Austria | 1 | 72% | 63% | 74% |
| 2026-07-02 | Switzerland v Algeria | 1 | 50% | 44% | 45% |
| 2026-07-01 | Belgium v Senegal | X 90' | 28% | 28% | 28% |
| 2026-06-30 | France v Sweden | 1 | 76% | 59% | 77% |
| 2026-06-30 | Ivory Coast v Norway | 2 | 44% | 42% | 39% |
| 2026-06-30 | Mexico v Ecuador | 1 | 42% | 36% | 52% |
| 2026-06-29 | Brazil v Japan | 1 | 54% | 59% | 54% |
| 2026-06-29 | Germany v Paraguay | X | 19% | 26% | 24% |
| 2026-06-29 | Netherlands v Morocco | X | 31% | 32% | 30% |
| 2026-06-28 | South Africa v Canada | 2 | 52% | 43% | 50% |
| 2026-06-27 | Algeria v Austria | X | 45% | 29% | 29% |
| 2026-06-27 | Colombia v Portugal | X | 23% | 30% | 30% |
| 2026-06-27 | Croatia v Ghana | 1 | 54% | 61% | 72% |
| 2026-06-27 | Jordan v Argentina | 2 | 85% | 84% | 88% |
| 2026-06-27 | Panama v England | 2 | 84% | 78% | 66% |
| 2026-06-26 | Cape Verde v Saudi Arabia | X | 28% | 34% | 29% |
| 2026-06-26 | Egypt v Iran | X | 35% | 34% | 28% |
| 2026-06-26 | New Zealand v Belgium | 2 | 81% | 74% | 63% |
| 2026-06-26 | Norway v France | 2 | 74% | 54% | 56% |
| 2026-06-26 | Senegal v Iraq | 1 | 79% | 58% | 62% |
| 2026-06-26 | Uruguay v Spain | 2 | 57% | 50% | 56% |
| 2026-06-25 | Curaçao v Ivory Coast | 2 | 81% | 76% | 65% |
| 2026-06-25 | Ecuador v Germany | 1 | 24% | 27% | 27% |
| 2026-06-25 | Japan v Sweden | X | 28% | 28% | 23% |
| 2026-06-25 | Paraguay v Australia | X | 39% | 34% | 28% |
| 2026-06-25 | Tunisia v Netherlands | 2 | 85% | 57% | 71% |
| 2026-06-24 | Morocco v Haiti | 1 | 75% | 76% | 75% |
| 2026-06-24 | Scotland v Brazil | 2 | 73% | 74% | 71% |
| 2026-06-24 | South Africa v South Korea | 1 | 18% | 23% | 17% |
| 2026-06-23 | England v Ghana | X | 12% | 20% | 13% |
| 2026-06-23 | Panama v Croatia | 2 | 68% | 67% | 50% |
| 2026-06-23 | Portugal v Uzbekistan | 1 | 84% | 68% | 70% |
| 2026-06-22 | Argentina v Austria | 1 | 68% | 62% | 74% |
| 2026-06-22 | France v Iraq | 1 | 90% | 76% | 83% |
| 2026-06-22 | Jordan v Algeria | 2 | 66% | 61% | 50% |
| 2026-06-22 | Norway v Senegal | 1 | 40% | 35% | 39% |
| 2026-06-21 | Belgium v Iran | X | 21% | 28% | 29% |
| 2026-06-21 | New Zealand v Egypt | 2 | 59% | 51% | 42% |
| 2026-06-21 | Spain v Saudi Arabia | 1 | 88% | 82% | 87% |
| 2026-06-21 | Uruguay v Cape Verde | X | 21% | 25% | 18% |
| 2026-06-20 | Ecuador v Curaçao | X | 11% | 14% | 14% |
| 2026-06-20 | Germany v Ivory Coast | 1 | 66% | 56% | 61% |
| 2026-06-20 | Netherlands v Sweden | 1 | 57% | 55% | 65% |
| 2026-06-20 | Tunisia v Japan | 2 | 66% | 45% | 62% |
| 2026-06-19 | Brazil v Haiti | 1 | 86% | 93% | 84% |
| 2026-06-19 | Scotland v Morocco | 2 | 58% | 50% | 53% |
| 2026-06-19 | United States v Australia | 1 | 62% | 41% | 42% |
| 2026-06-18 | Canada v Qatar | 1 | 77% | 68% | 74% |
| 2026-06-18 | Mexico v South Korea | 1 | 49% | 50% | 56% |
| 2026-06-17 | England v Croatia | 1 | 58% | 48% | 50% |
| 2026-06-17 | Ghana v Panama | 1 | 39% | 39% | 20% |
| 2026-06-17 | Uzbekistan v Colombia | 2 | 75% | 65% | 63% |
| 2026-06-16 | Argentina v Algeria | 1 | 63% | 66% | 74% |
| 2026-06-16 | Austria v Jordan | 1 | 69% | 62% | 56% |
| 2026-06-16 | France v Senegal | 1 | 65% | 52% | 64% |
| 2026-06-16 | Iraq v Norway | 2 | 78% | 61% | 50% |
| 2026-06-15 | Belgium v Egypt | X | 23% | 28% | 24% |
| 2026-06-15 | Iran v New Zealand | X | 28% | 28% | 23% |
| 2026-06-15 | Saudi Arabia v Uruguay | X | 24% | 25% | 22% |
| 2026-06-15 | Spain v Cape Verde | X | 6% | 14% | 8% |
| 2026-06-14 | Germany v Curaçao | 1 | 92% | 93% | 86% |
| 2026-06-14 | Ivory Coast v Ecuador | 1 | 28% | 24% | 24% |
| 2026-06-14 | Netherlands v Japan | X | 27% | 27% | 30% |
| 2026-06-14 | Sweden v Tunisia | 1 | 51% | 40% | 41% |
| 2026-06-13 | Brazil v Morocco | X | 25% | 31% | 25% |
| 2026-06-13 | Haiti v Scotland | 2 | 61% | 63% | 43% |
| 2026-06-13 | Qatar v Switzerland | X | 13% | 17% | 20% |
| 2026-06-12 | United States v Paraguay | 1 | 47% | 43% | 51% |
| 2026-06-11 | Mexico v South Africa | 1 | 69% | 62% | 77% |
World Cup 2026 · 98 graded quotes of 126 recorded market closes (15 matched no played fixture, 13 matched one no engine covers); unmatched closes are counted, never guessed onto a match. Club competitions join as the season's fixtures grade.
Every engine logs its probabilities before kickoff — immutably — and is graded the moment the match resolves. This table grows on its own, ten minutes at a time. It grades on the full-time result; the headline section above grades every engine against the market on the shared 90-minute basis — two different questions, each labelled.
| Engine | Predictions | Graded | Log-loss (full-time) | Since |
|---|---|---|---|---|
| PitchVAR elo — clubs | 99 | 67 | 0.992 | 2026-07-28 |
| PitchVAR elo — internationals | 1 | 1 | 0.915 | 2026-07-19 |
| PitchVAR dc — internationals | 1 | 1 | 1.039 | 2026-07-19 |
A prediction is logged only when both teams carry a rated history — a fixture we cannot honestly price logs nothing, and that refusal is part of the record. Once a logged match has a market close of its own, it joins the graded table above.