ProofOdds

23 divisions · Dixon-Coles · 277 matches priced

Published before kickoff. Scored afterwards.

Every probability is sealed before the whistle. Where the market publishes a closing price, ours is graded against it; where it does not, the forecast is measured against guessing and labelled as such. The running score stays public whether it flatters the model or not.

Publish picks of your own? The same machinery seals your record: hashed before kickoff, timestamped in Bitcoin, impossible to edit, and scored against the closing line. Seal your own record.

01

ForecastModel probabilities are produced from past results only.

02

SealThe earliest publication is hashed into the public ledger.

03

ScoreThe same forecast is measured against the closing line.

Our log loss
1.0161
over 599 graded matches
Closing line
0.9788
the number to beat
Gap
+0.0374
±0.0151 at 95% — clear of zero
No knowledge
1.0986
predicting 1/3 every week

Over 599 graded matches the gap is +0.0374 ± 0.0151 at 95% confidence, so this sample separates the model from the closing line. The number with a sample behind it is the walk-forward backtest: 2660 matches, +0.0188 per match, and the model loses. How this is computed.

Upcoming forecasts

Choose a matchday

From today through Sunday 18 October. Choose a date, then optionally narrow it by competition.

Showing 122 matches on Saturday 10 October

Saturday 10 October

122 matches
Turkey Super Lig Turkey 4 matches
Germany 2. Bundesliga Germany 4 matches
England Premier League England 6 matches
England Championship England 10 matches
England League One England 12 matches
England League Two England 12 matches
England National League England 11 matches
Spain La Liga Spain 4 matches
France Ligue 2 France 3 matches
Italy Serie A Italy 3 matches
Italy Serie B Italy 6 matches
Germany Bundesliga Germany 6 matches
Belgium Jupiler Pro League Belgium 4 matches
Scotland Scottish Premiership Scotland 4 matches
Scotland Scottish Championship Scotland 5 matches
Scotland Scottish League One Scotland 5 matches
Scotland Scottish League Two Scotland 5 matches
Spain Segunda Division Spain 3 matches
Portugal Primeira Liga Portugal 3 matches
Netherlands Eredivisie Netherlands 4 matches
France Ligue 1 France 5 matches
Greece Super League Greece Greece 2 matches
Brazil Brasileirao Serie A Brazil 1 match

Sunday 11 October

54 matches
Brazil Brasileirao Serie A Brazil 6 matches
Netherlands Eredivisie Netherlands 4 matches
Italy Serie A Italy 5 matches
Turkey Super Lig Turkey 3 matches
England Championship England 1 match
Scotland Scottish Premiership Scotland 2 matches
Belgium Jupiler Pro League Belgium 4 matches
Germany 2. Bundesliga Germany 3 matches
Spain La Liga Spain 4 matches
Spain Segunda Division Spain 4 matches
England Premier League England 3 matches
France Ligue 1 France 3 matches
Italy Serie B Italy 3 matches
Germany Bundesliga Germany 2 matches
Greece Super League Greece Greece 4 matches
Portugal Primeira Liga Portugal 3 matches

Monday 12 October

14 matches
Spain Segunda Division Spain 4 matches
Greece Super League Greece Greece 1 match
Italy Serie A Italy 2 matches
Turkey Super Lig Turkey 1 match
France Ligue 2 France 1 match
England Premier League England 1 match
Spain La Liga Spain 1 match
Brazil Brasileirao Serie A Brazil 2 matches
Portugal Primeira Liga Portugal 1 match

Tuesday 13 October

9 matches
Brazil Brasileirao Serie A Brazil 1 match
England Championship England 8 matches

Wednesday 14 October

4 matches
England Championship England 4 matches

Thursday 15 October

0 matches
No matches priced for this day Choose another date in the calendar above.

Friday 16 October

7 matches
Netherlands Eredivisie Netherlands 1 match
Germany Bundesliga Germany 1 match
Italy Serie A Italy 1 match
France Ligue 1 France 1 match
England Championship England 1 match
Spain La Liga Spain 1 match
Brazil Brasileirao Serie A Brazil 1 match

Saturday 17 October

38 matches
England Premier League England 5 matches
England Championship England 11 matches
Spain La Liga Spain 4 matches
Italy Serie A Italy 3 matches
Germany Bundesliga Germany 6 matches
Netherlands Eredivisie Netherlands 3 matches
France Ligue 1 France 3 matches
Brazil Brasileirao Serie A Brazil 3 matches

Sunday 18 October

29 matches
Brazil Brasileirao Serie A Brazil 5 matches
Netherlands Eredivisie Netherlands 5 matches
Italy Serie A Italy 4 matches
Spain La Liga Spain 4 matches
England Premier League England 4 matches
France Ligue 1 France 5 matches
Germany Bundesliga Germany 2 matches

Why you can check this

Separate evidence for content, order, time and scoring.

Sealed before kickoff

Each day's predictions are written to a JSON file and hashed. A file is never rewritten, and no prediction is issued for a match that has already started.

Chained

Every file carries the hash of the one before it. Alter a past prediction without rebuilding every later hash and verification fails, publicly, on the ledger. Rebuilding the whole chain instead means force-pushing over a public repository, which is visible to anyone who cloned it before. The ledger separately labels entries with no external proof, timestamp submissions still pending, and matching proofs that contain a Bitcoin block attestation.

Generator identified

New entries record the source commit that produced their probabilities, whether those files had local changes, and a hash of the exact generator source bytes.

Graded against the close

Not against our own opinion of a good result. Against the market's average closing price, the number left after all the informed money has moved it — and where no closing price exists, the market is tagged forecast only rather than quietly counted as a win.

The model is the demonstration, not the product

What was actually built here is the machinery underneath it, and it does not care whose numbers it measures.

Seal your own record

The same rules as ours, applied to your forecasts: hashed before kickoff, anchored to a Bitcoin block, measured by closing line value, published whichever way it goes and never editable afterwards. It works for every competition with a published closing price, well past the 23 divisions we price ourselves. If you would rather be measured than believed, that is the offer.

Seal your own record

Use the numbers

Every probability on this site is already a public JSON file, served across origins, with no key and no account — the same bytes the ledger hashes. They are worth something for editorial context and for testing your own model against a forecast that provably was not written afterwards. They are not worth anything against a bookmaker, and the scorecard is where that is proven rather than asserted.

What is in the feed