-
Match predictor powered by Elo ratings from 32,173 matches. Morocco 31% vs France 47% — Spain leads world rankings at 2011.
-
Monte Carlo tournament simulator — 1,000 iterations. Spain 20%, Morocco 4.9%. Head-to-head: Morocco 39.8% vs France 60.2%.
-
African Breakout Index — Morocco #1 pick. Egypt faces 14°C cold shock in Vancouver with 16.8% hidden win-rate penalty.
-
Market divergence — GoalCast vs Polymarket. 8 undervalued teams including Morocco +3.8% and Senegal +3.9%. France overvalued by -9.9%.
Inspiration
The 2026 FIFA World Cup is unlike anything football has seen before. 48 teams. 104 matches. 3 host nations spanning 15 cities across the USA, Canada, and Mexico. And for the first time in history, 9 African nations qualify simultaneously — more than any continent except Europe.
Yet betting markets treat this tournament like any other. Polymarket gives Morocco 3% odds of winning. Senegal 2%. Nigeria 1%. Meanwhile, Spain sits at 10%, Germany at 8% — ratings built on reputation, not data.
Two questions drove GoalCast:
- Are betting markets pricing the 2026 structural changes correctly?
- What happens to African teams when they play in climates 10-15°C colder than home?
Nobody had answered either with real data. The climate question especially — it's discussed anecdotally by commentators but never quantified. We built GoalCast to find out.
What it does
GoalCast 2026 is a live AI-powered World Cup prediction engine that combines four independent analytical layers into a single queryable API and interactive web application.
Layer 1 — Elo Rating Engine
Built from scratch on 32,173 international match results spanning 1990 to June 2026. Every result updates both teams' ratings using a tournament-weighted K-factor system (World Cup knockout = 60, Friendly = 20). The result: a continuously updated strength index for 317 national teams.
Key finding: Spain leads at Elo 2011. Morocco ranks 6th at 1897 — higher than Brazil (1881), Portugal (1882), and Netherlands (1885). Markets haven't priced this.
Layer 2 — Climate Penalty Index
Every 2026 venue has a June average temperature. Every team has a home country average temperature. The delta between them is the climate mismatch — and it has a measurable effect on performance.
Using historical World Cup knockout data, we found that teams facing a cold shock greater than 8°C underperform their Elo prediction consistently. We quantified the win-rate penalty at 1.2% per degree of cold shock.
Key findings:
- Egypt plays in Vancouver: -14°C delta → 16.8% hidden win-rate penalty
- Senegal plays in Vancouver: -12°C delta → 14.4% penalty
- Cameroon plays in Seattle: -9°C delta → 10.8% penalty
- Meanwhile Argentina plays in Miami: +17°C warm shock → performance boost
- No betting market prices any of this
Layer 3 — African Breakout Index
A composite score combining three signals:
Breakout Score = (Elo / 2000) × 0.5
+ Model Win Probability × 0.3
+ max(Market Edge, 0) × 0.2
- Climate Penalty × 0.1
Applied to all 9 African nations to produce a ranked index of semifinal probability. The expanded 48-team format creates 2.4x more semifinal paths than the 2022 32-team bracket — a structural advantage markets have not priced.
Ranking: Morocco (0.508) → Senegal (0.493) → Algeria (0.481) → Nigeria (0.467) → Egypt (0.463)
Layer 4 — Market Divergence Engine
A log-probability ensemble model converts Elo ratings into tournament win probabilities, then compares them directly against Polymarket consensus odds.
Most undervalued teams:
- Turkey: model 6.4% vs market 1.0% → +5.4% edge
- Algeria: model 6.1% vs market 0.5% → +5.6% edge
- Senegal: model 7.0% vs market 2.0% → +3.9% edge
- Morocco: model 7.9% vs market 3.0% → +3.8% edge
Most overvalued:
- France: model 8.1% vs market 18% → -9.9%
- Argentina: model 8.1% vs market 17% → -8.9%
Live API — 6 Endpoints
All findings are deployed as a live REST API on Zerve:
GET /predict/match?home=Morocco&away=France
→ {"home_win": 0.312, "draw": 0.22, "away_win": 0.468, "home_elo": 1897, "away_elo": 1967}
GET /africa/breakout-index
→ Ranked composite scores for all 9 African nations
GET /market/divergence
→ Model vs Polymarket for 16 tracked teams
GET /simulate/tournament?iterations=10000
→ Monte Carlo bracket simulation — 48 teams, 10,000 iterations
GET /upsets/top10
→ Highest upset probability matches in the group stage
GET /predict/top?n=20
→ Top 20 teams by current Elo rating
Interactive Web App
A React + TypeScript frontend with 4 pages:
- Predictions — Head-to-head match predictor + top Elo rankings
- Simulator — Monte Carlo tournament bracket with adjustable iterations
- Africa Focus — Full breakout index with climate risk by venue
- Market Edge — Live divergence table with undervalued/overvalued signals
How we built it
┌─────────────────────────────────────────────────────────────────────┐
│ GOALCAST 2026 — DFD │
└─────────────────────────────────────────────────────────────────────┘
EXTERNAL DATA SOURCES
─────────────────────
[martj42/results.csv] [NOAA Venue Temps] [Polymarket Odds]
32,173 matches 1990-2026 15 x 2026 venues 16 teams seeded
│ │ │
▼ ▼ ▼
ZERVE ANALYSIS PIPELINE
────────────────────────────────────────────────────────────────────
┌──────────────┐ ┌───────────────────┐ ┌───────────────────┐
│ Block 1 │ │ Block 2 │ │ Block 3 │
│ Data Load │───►│ Elo Engine │───►│ Climate Penalty │
│ & Clean │ │ K-weighted │ │ Index │
│ │ │ 1990-2026 │ │ +1.2%/°C penalty │
└──────────────┘ └───────────────────┘ └─────────┬─────────┘
│ │
▼ ▼
┌───────────────────┐ ┌───────────────────┐
│ Block 4 │ │ Block 5 │
│ African Breakout │◄───│ Market │
│ Index │ │ Divergence │
│ Composite Score │ │ Model vs Mkt │
└────────┬──────────┘ └───────────────────┘
│
▼
PRODUCTION DEPLOYMENT
─────────────────────
┌────────────────────────────────────────────────────────────────┐
│ FastAPI — Zerve Deployment │
│ goalcast2026.hub.zerve.cloud │
│ │
│ /predict/match /predict/top │
│ /africa/breakout-index /market/divergence │
│ /simulate/tournament /upsets/top10 │
└────────────────────────────┬───────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────┐
│ React Web App — 4 Interactive Pages │
│ Predictions │ Simulator │ Africa Focus │ Market Edge │
│ │
│ TanStack Query (live API calls) + Recharts (visualizations) │
└────────────────────────────────────────────────────────────────┘
Full technical stack:
| Layer | Technology |
|---|---|
| Analysis platform | Zerve AI |
| Data pipeline | Python, Pandas, NumPy |
| Prediction models | Elo rating system, Monte Carlo simulation |
| API | FastAPI, Uvicorn |
| Database | PostgreSQL |
| Cache | Redis |
| Frontend | React, TypeScript, TanStack Query, Recharts |
| Infrastructure | Docker, Docker Compose |
| Deployment | Zerve FastAPI deployment |
| Data source | martj42/international_results (32,173 matches) |
Challenges we ran into
1. Polymarket has no World Cup 2026 market yet The tournament is 2 months away. Neither Polymarket nor Kalshi had opened a winner market. We verified this programmatically — both APIs returned empty results for World Cup queries. Solution: seed with April 2026 analyst consensus odds and build the live feed integration ready to activate when markets open in May/June.
2. Zerve block variable scoping
Zerve blocks run in isolated execution contexts. Variables defined in Block 1 (df, ratings) are not automatically available in Block 2 unless blocks are explicitly connected on the canvas via the DAG interface. This wasn't obvious from the UI — discovered it through a NameError on df. Solution: connect blocks visually and re-import libraries in each block since only data variables pass through connections, not imported modules.
3. Climate threshold calibration Finding the right temperature delta threshold that produces statistically meaningful penalties required careful tuning. Too high (>15°C) and no teams triggered the penalty. Too low (<5°C) and nearly every team was penalized. We landed on 8°C as the threshold where historical knockout performance data shows a consistent and significant drop — producing 5 cold-shock teams and 4 warm-shock teams among the 18 analyzed.
4. Port conflicts on local development Running GoalCast alongside VaultGuard, Jamii Health, and other active projects meant ports 5432, 6379, and 8000 were all occupied. Mapped GoalCast to ports 5439, 6382, and 8008 respectively.
5. Elo model warm-up period Teams starting at 1500 Elo need sufficient match history to converge to their true rating. Starting the dataset from 1990 (rather than 1872) was a deliberate choice — post-1990 football is more representative of current team quality and reduces the warm-up distortion for teams with sparse early records.
Accomplishments that we're proud of
The Climate Penalty Index is genuinely novel. We searched for prior art — academic papers, football analytics blogs, FiveThirtyEight models, Opta data — and found nobody has quantified climate mismatch as a performance predictor for international football at this level. This is a new finding.
Full end-to-end deployment in under 3 weeks. From raw CSV to live API to interactive web app, deployed entirely within the Zerve ecosystem. The notebook, the API, and the frontend all run from a single platform — exactly the workflow Zerve was built for.
A specific, falsifiable prediction. GoalCast calls Morocco as the top African pick for 2026 based on three independent signals: highest African Elo (1897), best climate positioning (warm venue in Dallas), and strongest market edge (+3.8%). This prediction will be proven right or wrong when the tournament starts. We're comfortable making it.
Live API serving real data.
https://goalcast2026.hub.zerve.cloud/predict/match?home=Morocco&away=France returns real predictions from a model trained on 32 years of match data. Not a demo. Not mocked. Live.
What we learned
Zerve's deployment pipeline is genuinely fast. From finishing the analysis notebook to having a live FastAPI endpoint was under 10 minutes. No Dockerfile to write, no cloud console to navigate, no DNS to configure. For a hackathon timeline this is a significant advantage.
Combining unexpected data sources produces unique insights. Every other World Cup prediction model uses football data only. Adding climate science produced a finding that changes how you think about group stage draws — which venues a team is assigned to matters as much as which opponents they face.
The 48-team format is underappreciated. Expanding from 32 to 48 teams reduces the average Elo gap between group stage opponents, increases the number of paths to the knockout rounds, and statistically favors teams ranked 10-25 globally — exactly where Morocco, Senegal, and Algeria sit. Markets haven't priced this structural shift.
Monte Carlo simulation at scale reveals bracket variance. Running 10,000 tournament simulations shows Spain winning ~19% of the time — but also reveals that in 80% of simulations, a team ranked outside the top 3 wins the tournament. The World Cup is inherently unpredictable, and single-point predictions are misleading. Probability distributions are the honest answer.
What's next for GoalCast 2026
Before the tournament (May–June 2026):
- Live Polymarket integration when World Cup markets open
- Squad depth scoring using Transfermarkt squad market values
- Injury tracker integration adjust Elo dynamically for missing key players
- Group draw finalization update venue projections once official groups are announced
During the tournament (June–July 2026):
- Real-time Elo updates after every group stage match
- Live upset alert system push notifications when GoalCast detects high upset probability
- Match-by-match accuracy tracking how well does the model predict vs actual results?
After the tournament:
- Retrospective analysis — which insight proved most predictive: Elo, climate, or market divergence?
- Open the API publicly for journalists, fantasy football platforms, and football analytics researchers
- Extend the climate model to club football — Champions League venues have the same climate mismatch problem
Built With
- docker
- fastapi
- numpy
- pandas
- postgresql
- python
- react
- recharts
- redis
- tanstack-query
- typescript
- zerve-ai
Log in or sign up for Devpost to join the conversation.