Transparency · How this works

Methodology

Everything here is meant to be checkable. Below: how the model turns team strength into match probabilities, how it decides something is a value edge, how its calls are graded honestly against results, and the tamper-evident ledger that timestamps each prediction set. The honest summary up front — the model is well-calibrated and beats a naive baseline, but "beats the market" is not yet proven. That's exactly what the live calibration record is being built to test.

How the model works

1

Team strength (Elo)

Each team carries an Elo rating trained on thousands of historical internationals. Wins against strong teams move it more than wins against weak ones; home advantage and venue/host context adjust it per match. Games are also weighted by importance — a friendly counts at half the weight of a competitive match, so warm-up exhibitions move the ratings less than a World Cup or qualifier result.

2

Scoreline matrix (Poisson + Dixon-Coles)

The rating gap becomes each side's expected goals, and a Poisson model gives a probability for every exact scoreline, with a Dixon-Coles correction for low-scoring results.

3

Markets & calibration

The matrix is summed into 1X2, Over/Under 2.5 and BTTS probabilities. Five model constants are fitted by minimising out-of-sample log-loss, then checked on data the fit never saw — see the calibration report.

Finding value

model vs market

For each market we de-vig the bookmaker prices to fair probabilities, then compute edge = our call − fair. A positive edge means a genuine disagreement, not a sure thing. We de-vig with the power method (fit one exponent so the book's implied probabilities sum to 1) rather than splitting the margin proportionally — the proportional shortcut overstates longshots and understates favourites, the well-known favourite-longshot bias, so the power baseline is closer to realised frequencies. Edges are priced against the best available book (line-shopping shows the best price the market offers) and shown with their expected value, flagged for longshots since raw EV flatters long prices. See them all on the edges page.

Why "our call", not the raw model. Plain Elo is poorly anchored between confederations that rarely play each other — left alone it rates Germany below Iran and Morocco second in the world. We fix that at the source: a per-confederation anchoring step fits one Elo offset per confederation to the de-vigged market (UEFA up, CONCACAF/AFC/CAF down, mean-zero overall), which roughly halves the model's disagreement with the market and — crucially — also corrects the knockout/outright simulations. On top of that, because no model can fully see squad quality, we publish a confidence-weighted market blend: where odds exist, the anchored model's 1X2 and Over/Under probabilities are pulled toward the de-vigged market, and the further they stray the less the model is trusted (a big disagreement with a sharp 29-book consensus is more often model error than value). Edges are measured from that blend, so a structural error no longer masquerades as value. Each match's Model vs market panel shows the (anchored) model, the market, and the blended call side by side; the divergence tracker ranks the residual gaps.

Grading honestly

the part that matters

A forecast is only as good as its record against reality. Every pre-kickoff call is frozen before the match (in the prediction archive), then graded against the actual result as games finish — top-pick hit rate, Brier and one-vs-rest reliability — on the live calibration page. We show the misses as plainly as the hits. Beating base rates is not the same as beating the market, though: where the model disagrees with the de-vigged price we surface it as analysis on the edges and divergence pages, but until a long calibration record exists nothing here should be read as a proven market edge.

Tamper-evident predictions

SHA-256 ledger

Every prediction run writes a SHA-256 hash of the exact predictions.json bytes into an append-only, hash-chained ledger: each entry also records the hash of the entry before it, so altering one historical line breaks every line after it. You can check the current numbers yourself — re-hash the live file and it must match the latest line below (and the sidecar). And because the chain links every set, a past prediction can't be silently rewritten without the chain failing to verify.

What this does and doesn't prove. It lets anyone confirm the published file matches its recorded hash, and that the history hasn't been edited after the fact. It is self-published, though — the ledger lives in this repo, so the strongest possible proof (that the whole chain wasn't regenerated at once) would need an external anchor — committing each hash to a public, append-only place we can't rewrite (e.g. a public git remote or a timestamping service). That external anchoring is on the roadmap; until then, treat this as a self-auditable record, not a third-party-notarised one.

Latest prediction set 1 Jul 2026, 05:08 UTC
Predictions 26
SHA-256 of predictions.json e9c49a416e2dd8bace60344e3f84d0d17290e712e057575550b728f9d8621d72
How to verify it yourself
  1. Download the live file: /data/predictions.json
  2. Hash it — macOS/Linux: shasum -a 256 predictions.json; Windows PowerShell: Get-FileHash predictions.json
  3. It must equal the SHA-256 above (and the sidecar /data/predictions.hash.json).
  4. To check the whole history, fetch /data/predictions_ledger.json: each entry's prev must equal the SHA-256 of the previous entry (sorted-keys JSON); the first is all-zeros.
Generated (UTC)PicksSHA-256
1 Jul 2026, 05:08 UTC 26 e9c49a416e2dd8ba…
22 Jun 2026, 21:21 UTC 30 c6fbfdace48844ab…
22 Jun 2026, 17:17 UTC 32 5e7263409938c567…
22 Jun 2026, 12:36 UTC 32 ad749e9b91ebbc6f…
22 Jun 2026, 06:09 UTC 32 7c3b3f073b7f26b0…
21 Jun 2026, 20:15 UTC 34 7ffefa701ca2bd55…
21 Jun 2026, 14:58 UTC 36 a5b01bcbb86e6663…
21 Jun 2026, 10:20 UTC 36 849446a333ef4836…

Showing the 8 most recent of 54 recorded prediction sets.

Glossary

the jargon, plainly
Elo rating
A single strength number per team, updated after every match by the gap between expected and actual result. Higher = stronger.
Poisson / scoreline matrix
Goals are modelled as a Poisson process from each side's expected goals, giving a probability for every exact scoreline — which is summed into 1X2, Over/Under and BTTS.
Dixon-Coles
A correction to the independent-Poisson matrix that fixes the well-known under-counting of 0-0/1-0/0-1/1-1 results in low-scoring games.
De-vig (fair price)
Bookmaker odds include a margin (the 'vig'/overround). De-vigging normalises a market's implied probabilities back to sum to 1 so the model is compared against the market's true opinion, not its margin. We use the power method (one fitted exponent), which corrects the favourite-longshot bias better than splitting the margin proportionally.
Edge
Our published call minus the de-vigged market probability for the same outcome. A positive edge means we disagree with the market in your favour — not a guarantee of profit.
Our call (market blend)
The probability we publish: the raw Elo+Poisson model pulled toward the de-vigged market on the markets the books price (1X2, Over/Under). The pull is confidence-weighted — the more the model disagrees with the market, the less it's trusted, because the model is mis-scaled across confederations and a big disagreement is usually its error, not value. Knockout rounds have no odds, so they stay pure model.
EV (expected value)
The model's expected value per unit at the best available price — a way to read how generous the market price looks versus the model. Long prices inflate it, so it's flagged for longshots and read with care.
Calibration / ECE
Whether stated probabilities match reality (of all '60%' calls, ~60% should happen). ECE is the average gap; lower is better.

Honest limitations

  • Small sample. 104 World Cup matches can't establish a market edge on their own — the live calibration record is the test, and it's only just starting.
  • Minor-nation uncertainty. Ratings for teams with few recent internationals rest on thin data; those predictions are less certain than the single number suggests.
  • Not advice. Edges are estimates and can be wrong. This is analysis for interest, not betting or financial advice.