# mikobinbin/2026-world-cup-predictor: a Poisson xG model with an I Ching layer

> This Python project predicts head-to-head World Cup matches from Elo differentials and a Poisson goal model, then adds a deliberately unscientific factor engine. It runs locally as a Streamlit app, and the README is honest about neither the licence nor the model's limits.

**mikobinbin/2026-world-cup-predictor** — 2026 FIFA World Cup H2H Match Prediction | Poisson xG + Mystic Factors + Mobile-first | 世界杯H2H对战预测

- Repository: https://github.com/mikobinbin/2026-world-cup-predictor
- Website: https://worldcup.imiaozhan.com
- Stars: 658 · Forks: 15
- Language: Python
- License: not declared
- Published: 2026-09-20 · Updated: 2026-09-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/mikobinbin-2026-world-cup-predictor

## The gap this fills: head-to-head probabilities, not a full bracket

Most World Cup prediction tools ask you to fill in a bracket and then score your picks. This project does something narrower. You give it any two teams, and it returns win, draw and loss probabilities plus a score probability matrix. The README describes the output as a matrix that includes a high-scoring gamble zone, where total goals of three or more are highlighted in yellow. That is a different job from bracket scoring: it is a per-match probability calculator.

The audience is the person who wants to argue about a single fixture. The README frames the model as a Poisson xG model powered by Elo differentials plus what it calls mystic factors, drawn from the I Ching and the Tao Te Ching. The live instance is at worldcup.imiaozhan.com and is described as mobile-first. If you want a printable bracket, look elsewhere. If you want to ask what the model thinks about one matchup and see the distribution behind it, this is aimed at you.

## How the Poisson xG model turns an Elo gap into goals

The core is two lines of arithmetic. Expected goals for each side come from a baseline of 1.3 plus the team's Elo minus 1700, divided by 500. The README gives exactly this:

```
λA = 1.3 + (eloA - 1700) / 500
λB = 1.3 + (eloB - 1700) / 500
P(ga, gb) = Poisson(ga | λA) × Poisson(gb | λB)
```

Two independent Poisson draws, one per team, multiplied to get the joint probability of a scoreline. That independence assumption is the standard simplification and also the model's biggest structural weakness: real matches have correlated scoring, because game state changes how both teams play. The README does not discuss this. What it does expose is the score matrix, the top six most likely scorelines ranked by probability, and the high-scoring zone.

The Elo side lives in src/simulation/elo_engine.py, with cached ratings for 52 teams in data/elo_cache_2026.json. Release v4.5.5 is labelled ELO adaptive update plus a high-score fix, which suggests the rating handling has been revised rather than fixed once. Squad data sits in data/wc2026_squads_wikipedia.json. The repository also carries src/models/ucl_final_mentality.py, described as quantifying the final-match mentality of players such as Mbappé, Dembélé and Lautaro Martínez and mapping it onto historical frameworks from Brazil 2014 and France 2018. How those mappings are derived is not documented in the README, and that is a real gap: a term that adjusts predictions but has no stated derivation is a term you cannot audit.

## The mystic factor engine, and why the README's own table is the problem

The README lists six factors: Elo rating, age structure, tournament experience, recent form over six matches, a coach factor, and a mystic bonus described as a combined I Ching and Tao Te Ching judgement. It calls the weights adjustable. It does not say what the weights are.

That matters more than the novelty suggests. The engine is split across src/models/mystic_factor.py and the mentality module, and the README describes three layers of validation (logic, method, value) and a lottery paradox concept covering favourite traps and contrarian value. None of that comes with a formula, a coefficient, or a test. The project is not hiding this: the framing is openly metaphysical. But a reader deciding whether to trust an output needs to know how much of the final probability the mystic term moves. If it shifts a win probability by a percentage point, it is decoration. If it shifts it by ten, the Poisson arithmetic is not really the model. The README does not answer that, and the repository does not appear to include a calibration report.

My view: treat the statistical core and the factor layer as two separate products sharing one interface. The first is a legible Elo-to-goals baseline you can reason about. The second is editorial.

## Installing it and running your first matchup on port 8080

The README gives a short local path. Clone the repository, install the pinned dependencies, and start the mobile UI module. Pinning matters here: requirements.txt fixes streamlit at 1.50.0, pandas at 2.3.3, numpy at 2.0.2 and matplotlib at 3.9.4, among others, so a fresh environment should resolve to the same versions the author used.

```bash
git clone https://github.com/mikobinbin/2026-world-cup-predictor.git
cd 2026-world-cup-predictor
pip install -r requirements.txt
python3 -m src.dashboard.mobile_ui
```

The README states that the app is then reachable at http://localhost:8080/mobile. That is the mobile-first interface referenced in the description, and the module path src/dashboard/mobile_ui.py is listed in the project structure as the main entry point. Note the port: 8080, not Streamlit's usual 8501. The repository also contains a .streamlit directory and a start.sh, so a Streamlit configuration and a launch script are present, but the README does not document either one and does not explain the relationship between them and the python3 -m command above.

Once it is up, the interaction is a head-to-head selection. Pick any two of the teams in the Elo cache, and the interface returns win, draw and loss probabilities, the top six scorelines by probability, and the score matrix with the high-scoring zone highlighted. If you want to see the model's raw behaviour rather than the UI's presentation, the entry points to read are src/simulation/elo_engine.py and src/models/mystic_factor.py.

## Where this model breaks down, and when to use something else

The independence assumption is the first limit. Multiplying two Poisson distributions treats each team's goals as unrelated, which is false in matches where one side is chasing the game. Expect the model to understate the probability of lopsided scorelines and to be least reliable in exactly the knockout scenarios people care about most.

The second limit is that the README does not document rollback, does not state a licence, and does not describe a validation methodology. There is no backtest table, no calibration curve, no stated error rate against historical results. For a prediction model that is the central omission. You can inspect the code, but the project does not make the accuracy argument for you.

The third is scope. This is a head-to-head calculator. It does not simulate a group stage, it does not propagate winners through a bracket, and the README gives no indication that it handles the 2026 format's progression. If your question is who lifts the trophy, this tool answers a different question and you would be assembling the tournament logic yourself.

## Compared with a full tournament simulator

A bracket simulator and this project differ in what they hold constant. A simulator fixes a tournament structure and runs the whole thing, group stage through final, usually with a large number of iterations to produce a distribution over champions. Its unit of output is a tournament outcome.

This project fixes a single fixture and produces a scoreline distribution. Its unit of output is a match. The Elo-to-lambda arithmetic is simple enough to verify by hand, which is a genuine advantage over simulators that bury team strength inside a trained model. The trade-off is that you cannot ask it how often a given team reaches the semi-finals, because nothing in the README suggests it plays out the intervening matches.

There is a second difference worth naming. The mystic factor layer has no counterpart in a conventional simulator. That is the project's identity, and also the part a sceptical reader will discount first.

## Maintenance, licence and what an upgrade costs you

The last push to the default branch was on 2026-07-18, and the most recent release is v4.5.5 from 2026-06-18, labelled ELO adaptive update plus a high-score fix. Earlier releases v4.2.1 and v3.4.2 landed in June 2026. The repository is not archived. The release cadence visible in the tags is concentrated in a single month, so the version numbers reflect rapid iteration during the tournament window rather than a long, steady history.

Upgrade cost is mostly dependency risk. requirements.txt pins eight packages to exact versions, including numpy 2.0.2 and pandas 2.3.3. Moving any of them forward means testing the Streamlit UI and the numerical code together. There is no test suite listed in the repository entries, so that testing is manual.

The licence is the open question. The material states no licence identifier, and no LICENSE file appears among the top-level entries. Without a stated licence, the default position is that the author retains rights, which affects redistribution and any derivative work. I am not giving legal advice; the practical point is that you cannot tell from the repository what you are permitted to do, and the README does not address it.

## Conclusion

Adopt it if you want a readable, self-contained Poisson xG baseline for World Cup head-to-head matchups and you are comfortable reading Python to see where the numbers come from. Do not adopt it if you need a bracket simulator that plays out the whole tournament, if you need a documented licence before shipping anything derived from it, or if you intend to treat its output as a betting edge. Before anything else, check the repository licence file and open src/models/mystic_factor.py to see how much of the final probability the non-statistical factors actually move.

## FAQ

### Who will win the 2026 World Cup according to this AI prediction?

The project does not publish a single champion. It predicts head-to-head matchups, returning win, draw and loss probabilities plus a score probability matrix for any two teams you select. A tournament-wide winner would require simulating the full bracket, which the README does not describe.

### Does 2026-world-cup-predictor include astrology-style predictions?

It includes a mystic factor engine drawing on the I Ching and the Tao Te Ching, described in the README as a combined judgement layered on top of the Elo rating. The README lists the factors as adjustable but does not state their weights.

### How does 2026-world-cup-predictor calculate expected goals?

Each team's expected goals is 1.3 plus its Elo minus 1700, divided by 500. The joint probability of a scoreline is the product of the two independent Poisson distributions, and the interface returns the top six scorelines plus the full matrix.

### What port does the 2026-world-cup-predictor mobile UI run on?

The README states that after running python3 -m src.dashboard.mobile_ui, the app is reachable at http://localhost:8080/mobile. That is 8080 rather than Streamlit's default port.

### Does 2026-world-cup-predictor simulate the whole tournament?

The README describes head-to-head match prediction and a score probability matrix. It does not document group-stage or bracket simulation, so the tool answers questions about a single fixture rather than a full tournament path.

## Sources

- [Issues](https://github.com/mikobinbin/2026-world-cup-predictor/issues)
- [mikobinbin/2026-world-cup-predictor on GitHub](https://github.com/mikobinbin/2026-world-cup-predictor)
- [Project website](https://worldcup.imiaozhan.com)
- [README](https://github.com/mikobinbin/2026-world-cup-predictor/blob/main/README.md)
- [Releases](https://github.com/mikobinbin/2026-world-cup-predictor/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/mikobinbin-2026-world-cup-predictor
