FORECAST ARG –% : –% ESP KICKOFF—:—:—
🔧 HOW IT'S BUILT WORLD CUP FINAL · METLIFE · 19.07.26
iolinked

a fun ML prediction research project · the showcase

The final, forecast

One match left in the first 48-team World Cup. Argentina — champions, chasing back-to-back stars, Messi at 39 — against Spain, the machine that hasn't conceded a knockout half it didn't control. I built a model from public data, audited it until it stopped lying to me, and locked its number in before kickoff. This page is the fun half: the tournament, the two roads to MetLife, the players — and a forecast you can play with. The workshop half, with every wrong turn, lives on its own page.

— research by Ajai Raj
■ PREDICTION LOCKED · 18 JULY 2026 · BEFORE A BALL WAS KICKED
⛓ TIME-STAMPED & VERIFIED USING BLOCKCHAIN TECHNOLOGY · AUTHENTICITY CRYPTOGRAPHICALLY PROVABLE
🔒 PROVENANCE, for readers from the future: this exact prediction was committed to a public git repository at 20:34 UTC, 18 July 202622 h 26 min before kickoff. Verify it yourself: commit a87a8a0 — git is content-addressed, so any after-the-fact edit would change every hash in the chain. And cryptography seals it twice: this file's SHA-256 hash is anchored into the Bitcoin blockchain via OpenTimestamps — the proof files (PROVENANCE.txt + the .ots stamps beside this page) verify at opentimestamps.org against a timestamp carved into proof-of-work. Nobody — including me — can move it. The claim isn't “trust me.” It's “check.”
GO DEEPER — verify this page yourself, in two minutes, no experience needed
What you're checking: that this exact page existed before kickoff (19:00 UTC, 19 July 2026) and hasn't been changed by a single letter since.

First, one idea: a hash (SHA-256) is a fingerprint for a file — a short code computed from every byte. Change one comma anywhere and the fingerprint changes completely. My page's fingerprint was buried inside the Bitcoin blockchain before the match. If today's page still produces the same fingerprint, today's page is the pre-match page. That's the whole trick.

The two-minute check (no installs):
① Download the exact page file: this page itself (right-click → “Save link as” if it opens instead of saving), and its proof file: the-final-forecast.html.ots.
② Go to opentimestamps.org and find the “Stamp & Verify” box.
③ Drop the .ots proof file in — it will then ask for the original file; give it the page you saved.
④ Read the result. Success looks like: “Bitcoin block ______ attests existence as of 18/19 July 2026” — a date before kickoff. That's the proof, checked by your own browser against Bitcoin.

Why this can't be faked: to backdate a changed page, someone would have to rewrite the Bitcoin block holding the fingerprint and every block mined after it — redoing more computation than the largest computing network on Earth has performed since. Not “hard.” Practically impossible.

For the technical: pip install opentimestamps-client then ots verify the-final-forecast.html.ots. The full attestation with every fingerprint is in PROVENANCE.txt (with its own proof beside it).

One honest note: in the first hours after publication the checker may say “pending confirmation” — the Bitcoin anchor takes a few hours to land. Once it has, this proof verifies forever, even offline.
HOW TO READ THIS PAGE: ① read the story · ② touch every figure — the pulsing 👇 START HERE chips mark your first click · ③ and when you meet a gold ▸ GO DEEPER box, tap it openthey look closed because they are; most readers scroll past and miss the best part. Inside is the actual math, worked by hand. The full set of six lives on the workshop page.

0'Kick-off: your call, then mine

Before this page shows you a single number, it wants yours. Not to be cute — because the whole page is about what a prediction even is, and the fastest way to feel that is to make one and have to live with it. Pick a winner. Say how sure you are. The scoreboard stays dark until you do.

The gateyour call unlocks the answer
⚡ Make your prediction — and I reveal mine
👇 START HERE — step one: pick who lifts the trophy
How sure are you? 70%
my ML model predicts — locked 18 July, before kickoff
— lifts the trophy —
lock your call to see mine
Committing first is the point: by full-time you'll know exactly what it means for either of these numbers — yours or mine — to be “right.”

Locked in? Good. Now — where does a number like mine even come from? From everything that actually happened. Start where the tournament started.

15'The group stage: twelve tables, twelve stories

The first 48-team World Cup: twelve groups of four, the top two advancing plus the eight best third-placed sides. Every number below is the real thing. Argentina won Group J with a perfect nine points — a Messi hat-trick — three goals by one man in a single game — in the opener. Spain won Group H without conceding a single goal. And the tournament's sweetheart: debutants Cape Verde, who drew all three and squeezed through — the first World Cup debutant to reach the knockouts since 2010.

Every group, as it finishedinteractive · real tables
👇 START HERE — tap a group letter
teamPWDLGFGAGDPts
Reading the table: P played · W/D/L won-drew-lost · GF/GA goals scored/conceded · GD the difference · Pts points (a win is worth 3, a draw 1). Top two advance (✓), plus the eight best thirds (③). One honest asterisk: sources disagree on Saudi Arabia's points — two draws arithmetically make 2, one tracker lists 1. I show 2 and flag it rather than silently pick.
The upset wall — with what the market said, beforestatic · real scores + real closing odds
Germany 1–1 Paraguaypens 3–4 · R32
market: GER 72 · draw 19 · PAR 9 The four-time champions were 72% favourites — a roughly 1-in-3½ failure landed, then the shootout coin fell wrong. The single biggest odds-defiance of the knockouts.
Brazil 1–2 NorwayR16
market: BRA 54 · draw 26 · NOR 20 A 1-in-5 event, delivered by Haaland. Rare ≠ impossible — 20% things happen every fifth time, and this was the fifth time.
Ecuador 2–1 Germanygroup finale
market: ECU 23 · draw 23 · GER 55 A 23% warning shot that the bracket confirmed nine days later. Upsets cluster around teams the odds already doubted slightly.
Netherlands 1–1 Moroccopens 2–3 · R32
market: NED 40 · draw 31 · MAR 29 Feels like a giant-killing; the odds say otherwise — nearly a coin-flip. Memory exaggerates upsets. The market rarely does.
USA 1–4 BelgiumR16
market: USA 37 · draw 29 · BEL 33 The result wasn't the upset — Belgium were near-even money. The scoreline was: four goals nobody priced.
Cape Verde 2–3 Argentinaaet · R32
market: ARG 83 · draw 12 · CV 5 The debutants were 5% — and led twice, deep into the night. For 100 minutes the near-impossible was happening. Then it wasn't.
Each bar shows the market's pre-match chance of what the card describes (green = a favourite's hold that broke · red = the underdog event that landed · gold = "not actually an upset"). Two lessons packed together: rare things happen on schedule, and half of what fans call shocks the odds saw coming. This is why the whole page speaks in percentages.

Twelve tables seed one bracket — and now the road narrows. From here, every match is sudden death.

30'The knockouts: one bracket, sudden death

Thirty-two survivors, five rounds, no second chances. Walk it round by round below — Argentina's road in blue, Spain's in red. Watch how differently they travelled: Spain never needed a minute past ninety; Argentina went to extra time twice — and won both. (My model, for the record, predicted every one of these matches blind before scoring itself — it called 67% of them right, the betting market 69%. The full receipts live on the workshop page.)

The bracket walkinteractive · real results
👇 START HERE — step through the rounds
The rounds: R32/R16 = knockout rounds of 32 and 16 teams · QF/SF = quarter- and semi-finals · AET = settled in extra time (30 added minutes when 90 end level) · pens = a penalty shootout decided it. Every score real and cross-checked. One flagged dispute: sources differ on Mexico–England (3–2 vs 2–2 a.e.t.) — England advanced either way; I show the flag, not a silent pick.

Two survivors. Before I ask a model about them, rewind their roads and lay them side by side — because the two stories could not be less alike.

HTHalf-time analysis: two roads to MetLife

Lay the seven-match roads side by side and the final's whole character appears. Spain cruised: never behind for long, never past ninety minutes, one goal conceded all tournament — six clean sheets (full matches without conceding a goal) for keeper Unai Simón, a tournament high. Argentina survived: twice behind against Cape Verde, 0–2 down to Egypt before the comeback, extra time twice, and a semi-final flipped in seven late minutes by two Messi crosses. Control against chaos. The cagey, careful final my model expects is exactly what happens when these two styles collide.

Seven matches each — control vs survivalstatic · real scores
🇪🇸 SPAIN — THE CRUISE
0–0 Cape Verde the only dropped points
4–0 Saudi Arabia Yamal + Oyarzabal ×2
1–0 Uruguay Baena 42'
3–0 Austria Oyarzabal brace
1–0 Portugal Merino 90' — Ronaldo's farewell
2–1 Belgium the ONE goal conceded
2–0 France a stroll, in a semi-final
13 scored · 1 conceded · 0 minutes of extra time
🇦🇷 ARGENTINA — THE SURVIVAL
3–0 Algeria Messi hat-trick, game one
2–0 Austria Messi ×2
3–1 Jordan routine — the last routine day
3–2 aet Cape Verde behind twice; saved by an own goal in the 111th
3–2 Egypt 0–2 down; Romero, Messi, Enzo in stoppage time
3–1 aet Switzerland broken only in extra time
2–1 England trailing at 84'; two Messi crosses
19 scored · 7 conceded · 2 extra-time nights
Same destination, opposite journeys. Spain have controlled every half; Argentina keep walking out of burning buildings. A forecast has to weigh both truths without falling in love with either story.

Campaigns are made of players. Meet the two casts — and one number about Messi that explains this whole final better than any tactics board.

60'The players: one genius vs eleven hands

Here is the player comparison that actually matters — not "who is better," but where the goals come from. Argentina's 19 goals lean overwhelmingly on one man: Messi has scored 8 and assisted 4 — a hand in roughly 63% of Argentina's entire tournament. Spain's 13 goals came from six different scorers, and they conceded once, ever. Two risk shapes: a concentrated bet against a distributed one. Contain one man and Argentina dims — but nobody has contained him yet. Spain have no single plug to pull.

Where the goals come from — concentration vs spreadstatic · tournament goals
🇦🇷 ARGENTINA — 19 goals
MESSI 8LAUTARO 4ENZO 25 OTHERS
🇪🇸 SPAIN — 13 goals
OYARZABAL 5MERINO 2PORRO 24 OTHERS
Add Messi's 4 assists and one man touches ~63% of Argentina's output. Spain's answer isn't a rival genius — it's that there's no wire to cut.
Why this doesn't change the forecast: Messi's goals are already inside Argentina's scoring rate — feed his form in again and the model counts the same goals twice, becoming more confident but not more right. The comparison explains how each side wins; the λs already knew how often. (Messi's assist tally is 4 per ESPN — other trackers say 2; flagged, not silently picked. Also flagged: the 92′ extra-time winner vs Cape Verde is credited to Lisandro Martínez by match reports, to Lautaro by summaries — if Lisandro's, Lautaro's four becomes three. Sources differ; I show the flag.)
The casts — projected XIs, worn honestlyinteractive · projected, confirmed only at kickoff
👇 START HERE — flip between the squads
Career caps (international matches played) and this-tournament form for both projected 4-3-3 line-ups — four defenders, three midfielders, three attackers — with the squad news that matters. Dispute flags (⚑) mark numbers sources disagree on — a page about honesty doesn't silently pick a variant. The model, remember, sees nations — not names; this table is for humans.

Now go one level deeper — to the goals themselves. I reconstructed every goal of both campaigns from the match reports: who won the ball, who created, who finished. First the relationships — who feeds whom — and then the full explorer: all 32 goals, each scored on an honest rubric, including the question fans argue about in every bar on Earth: how much was luck — and how much only looks like luck but was manufactured?

Who feeds whom — the assist webstatic · from match reports
🇦🇷 THE HUB
creator→ finishergoal
MessiRomeroR16, 79'
MessiMac AllisterQF, 10'
MessiE. FernándezSF, 85'
MessiL. MartínezSF, 90+2'
Messi(forced OG)R32, 111'
De Paul · González · Medina · Lisandro→ Messigroup + R32
Lautaro · Almada→ Enzo · LautaroR16 · QF
Every knockout goal-chain routes through one man — feeding, or being fed.
🇪🇸 THE LATTICE
creator→ finishergoal
Oyarzabal→ YamalMD2, 10'
Cucurella ×2→ OyarzabalR32, 36' & 89'
Baena · Llorente→ Porro · BaenaR32 · MD3
F. Torres→ MerinoR16, 90+1'
Olmo→ Porro · (Ruiz rebound)SF · QF
Cubarsí (33-yd drive)→ Merino (spill)QF, 88'
Yamal (pen won)→ OyarzabalSF, 22'
Eight different creators, six different scorers — no wire to cut.
(Goal refs: MD = group-stage matchday; R32/R16/QF/SF = the knockout rounds.) The coordination thesis in one table: Argentina's chains converge on a hub; Spain's spread into a lattice. Both roads reached the same final — tonight decides which architecture holds.
⭐ The Goal Explorer — all 32, scored honestlyinteractive · editorial rubric — my judgement, from the match reports
👇 START HERE — tap any goal
pick a goal from the list
Four bars per goal — 🎯 skill, 🔗 coordination, 🔥 pressure, 🎲 luck — plus the 🧲 tag for luck that was manufactured: rebounds hunted, fouls drawn, own goals forced by delivery. Not measured stats: an editorial rubric, every score grounded in a reported fact, disputes flagged ⚑ (OG = own goal — a defender accidentally turning the ball into his own net). The honest totals: both teams average almost identical raw luck (~1 point per goal) — what differs is where it lives.
The luck audit — does the record survive the discount?computed from the 32-goal rubric · formula stated
🇦🇷 ARGENTINA
luck per goal1.00 pts of 19 luck pts17 🧲 manufactured · 2 pure luck-adjusted19 goals → 16.9
Fortune = drawn fouls, set-piece chaos, bench timing — systems, all repeatable tonight.
🇪🇸 SPAIN
luck per goal1.23 pts — the “luckier” team! of 16 luck pts16 🧲 manufactured · 0 pure luck-adjusted13 goals → 11.4
Fortune = rebounds hunted, spills forced by range-shooting, the sub weapon — engineered, every point of it.
attack ratio ARG:ESP — raw 1.462 → luck-adjusted 1.482 · change 1.4%, inside noise
Verdict: the forecast survives the audit. Neither record is inflated by unrepeatable fortune — the surprise is that Spain's goals carry more luck than Argentina's, but all of it engineered.
Formula, stated openly: each goal keeps 1 − (luck∕5) of its value if the luck was pure, and only half that discount if manufactured (engineered fortune repeats; coin flips don't). Editorial inputs from the rubric above — change my scores and the ratio still barely moves, which is the point: robustness, not precision.

Players produce shots; shots are where a model starts counting. Time to open the hood — the whole forecast, it turns out, rests on just two numbers.

75'How the model sees it: two numbers called λ

Strip away the drama — the comebacks, the clean sheets, the genius at 39 — and the model compresses everything you've just read into two numbers. Weighing 110 real Argentina matches and 111 real Spain matches (recent and competitive games counting most), it expects Argentina to score 1.04 goals in this final and Spain 1.17. That's it. Those two scoring rates — each called λ — are the whole engine. Because goals are counts of rare events, a century-old formula (the Poisson) unfolds each λ into the chance of scoring 0, 1, 2, 3… and crossing the two gives a price for every possible scoreline. Touch the grid: the final, as a landscape of futures.

Every scoreline, pricedinteractive · λ 1.04 v 1.17
👇 START HERE — hover or tap any score
ARGENTINA goals ↓
SPAIN goals →
most likely single score: 1–1, about 1 in 8 finals — hover a cell for its price
Blue-tinted cells are Argentina wins, red are Spain wins, violet the diagonal of draws. No cell is likely — that's the point. A football match is a landscape of thin possibilities, and a forecast is the sum of regions, not a bet on one square.
GO DEEPER — compute a cell of that grid yourself, by hand
The formula behind every cell is P(k goals) = λᵏ · e⁻λ ÷ k! — chance of scoring nothing, times a helping of scoring-rate per goal, divided by the ways goals can be ordered. Spain's rate is 1.17: so P(0) = 31.0%, P(1) = 36.3%, P(2) = 21.2%. Argentina's 1.04 gives 35.3, 36.8, 19.1. A scoreline is one number from each list multiplied together: P(1–1) = 36.8% × 36.3% ≈ 13.4% — the grid's brightest cell, computed with a pocket calculator. Sum the blue cells: Argentina's win chance. The violet diagonal: the draw. The full machinery, the wrong turns that nearly broke it, and the exam it had to pass are the whole story of the workshop page.

Two λs gave me a table of every scoreline. Now stop reading the table — run it. Ten thousand times.

90'⭐ One match, ten thousand replays

This is the idea the whole page exists to hand you. When I say Spain 54%, the number is literally a count from a parallel-world machine simulation: the computer plays this exact final ten thousand times — same teams, same stadium, the scoring dice rolled fresh in each run — and I count who lifts the trophy. In roughly 5,400 of those simulated worlds Spain lift the trophy; in the other 4,600, Argentina do. First, though, answer the question below honestly — then run the machine yourself.

⭐ The parallel-world machine — run the final 10,000 timesinteractive · the keystone
👇 START HERE — answer, then play ONE final first
If Argentina lift the trophy tomorrow — was the model's “Spain 54%” wrong?
ARGENTINA
SPAIN
machine idle — no worlds simulated yet
latest world
worlds needing extra time: 0
Each simulated world draws a real scoreline from the two λs; level worlds play extra time at one-third rates, then penalties as a fair coin. (This machine uses the raw rates — the shipped headline also applies the small cagey-final correction, which is why its count reads a point or so different.) Run one world and Argentina might win 3–1 — a single simulation proves nothing; the count only means something at scale.

About three thousand of those simulated finals end the ninety minutes level — and a real final can't. Where do they go?

120'Extra time & penalties: where the draws go

A World Cup final always crowns somebody. So the 30.3% of simulated finals that end the ninety level don't vanish — they flow downhill: thirty minutes of extra time (the same two teams, at one-third rates), and if still level, the penalty shootout — one kick each from twelve yards, alternating, until someone cracks — which I price as a fair coin, on purpose. Argentina's famous shootout keeper is a real thing and a tempting one; it stays a footnote because no honest number for it exists, and this project doesn't bake anecdotes into arithmetic. Flip the switch and watch 38.2 become 53.8.

The resolution dialinteractive
👇 START HERE — resolve the final
the ninety minutes
ARG 31.5DRAW 30.3ESP 38.2
somebody lifts it — every world resolved
ARGENTINA 46.2%SPAIN 53.8%
The violet mass split ~fairly — Spain's slightly higher scoring rate tips extra time, the coin does the rest.
The same truth the workshop page shows as a funnel, worn here as a dial — the trophy number is just the ninety-minute probabilities with their draws sent through extra time and a coin. Sensitivity, computed: hand Argentina a 55% shootout edge (the Emi Martínez case) and the numbers move under a point — mine 53.8 → 53.0, market-resolved 58.2 → 57.3 — because only 17% of simulations ever reach the coin. The restraint was cheap, which is why it was safe.

One number left to check — why should you trust the counter at all? The mirror.

FTFull time: what a forecast owes you

📡 The reality check — the page meets the matchlive · fires only when you click
👇 START HERE — pull the real score
ARG — : — ESP
the scoreboard sleeps until you wake it
This button is the page's only outward call, and it fires only on your click — it asks the same public ESPN scoreboard the whole model was built from, which feels right. Before kickoff it finds silence; during the match, it compares the live score with what the machine expected; after full-time, it renders the only verdict a forecast can honestly face.
The honesty mirrorinteractive · one question
👇 START HERE — answer the mirror
A forecaster says “54%” — and is honest. How often should they turn out to be wrong?
About 46% of the time. An honest 54% forecaster is supposed to be wrong nearly half the time — that's what the number means. What a forecast owes you is not the winner: it's a probability that meant what it said. Mine was audited until it did — it beats every naive baseline on matches it never saw, and runs the betting market so close that 102 matches cannot tell the gap from zero — sitting, honestly, a nose behind.
Calibration, not bravado, is the whole promise. Whoever lifts the trophy tonight, this page's number was priced to be honest about both outcomes.
Three strangers, one leanstatic
my model
SPAIN 53.8
lifts the trophy · band 42–66
elo ladder
SPAIN ~54.6
#1 (2232) vs #2 (2200)
the market
SPAIN 41.9 in 90
v Arg 26.6 · its own scale — same lean
THE BEST RECIPE — I searched every weighted blend of my models with the market (cross-validated, 903 combinations, two pooling rules). Every fold chose the market, at 100%. So the sharpest trophy number on Earth tonight = the market's 90-minute price, resolved through my extra-time-and-penalties machinery: Spain 58.2% · Argentina 41.8%.
My independent model says 54/46; the best recipe says 58/42. The four-point gap is honest information — the market discounts Argentina's grind harder than pure goals-form does. I report both, labelled.
A model built from scratch, a decades-old rating ladder, and real money — three independent instruments, one gentle lean, and a weight-search whose verdict is itself the lesson: you don't beat the market, you extend it where it doesn't speak. No market trophy price exists; the 58.2 is the market's 90-minute probabilities pushed through the same resolution stage as mine — machinery, not invention.

One last breadcrumb. Those closing prices — Spain +125, Draw +200, Argentina +255 — convert them to break-even percentages and add them up. You get 105.9%. That is not a rounding error, and what it actually is — plus the four different ways I was wrong before I was right (a model that flipped its winner on eight games, a beautiful number that turned out to be silence, the yardstick I threw away, the question nobody asked) — is the whole other half of this project.

Spain, about 54. Argentina, about 46 — and Messi. The receipts, the wrong turns, and the map of every fork: How I built it →

◈ a note from the author

I'm an electrical engineer. This project is me playing — seriously, joyfully — with ML research, walking into sports analytics through the game I love, trying to understand everything in this space: the models, the market, the luck, the honesty it takes to publish a number before the whistle. I built it from the metal up, built expert agents to mark the homework, and kept every wrong turn on the page because that's how real learning looks. If you find a mistake — and somewhere in here, there is one — correct me. You won't bruise the work; you'll be doing exactly what it was built for. Support it, argue with it, teach me something. That's the whole point.

⚽ YOUR TURN — call it, or correct me
Pick your verdict, say your piece. Corrections beat compliments.
This page stores nothing and phones no server — your note travels only when you choose to send it.