The free key reads yesterday again: our one-month trial of today on the free key has finished. Read the changelog
← The Lab Study · Predictions

Fixture probabilities, computed and then explained

Can a language model price a football match?

What we found No — so it does not. The numbers are computed; the model explains them.
Run it yourself python3 predict.py
680,916 matches Python, no dependencies Free key runs it MIT Updated 9 Sep 2026

The whole study is the difference between two tables

Bucket away results by how far the side travelled and you find an effect. Compare the same matches against what the market charged for them and it disappears. Both readings are correct; only one of them is news.

Points per game falls from 1.25 to 1.15 as the journey grows. Goals conceded rise from 1.54 to 1.60. There is the travel effect.

Against the price the gap moves 1.8 points in total, inside noise of 4.3. The pale band is that noise. Every bar sits within it.

Why the naive reading is wrong

Long trips happen to weaker sides

Distance is not randomly assigned. In any league the clubs at the geographic edges travel most, and travelling sides are on average the weaker ones in the fixtures that produce long journeys. Bucket by distance and you have measured the fixtures.

The price already knows everything

A kickoff price contains form, injuries, rest, motivation and whatever the market believes about the journey. Comparing the outcome against the implied probability removes all of it in one step. What is left is only what the market got wrong.

A flat line is a result

Nothing here is a failed run. A liquid market pricing travel correctly is exactly what should happen, and it is worth knowing the next time somebody sells a travel angle. The finding is that the obvious edge is not there.

Three more ways to look for it

If travel were mispriced anywhere, it would most likely be for a particular kind of side, after a short rest, or both at once. None of them beat their own noise.

What it needed from the archive

Three fields. The first two are the reason this study is possible here and awkward anywhere else.

/v1/matches Results and prices, walked by cursor 680,916 matches
/v1/teams/{id}/match-stats Corners, cards and fouls per club
/v1/standings/{id}/{season} Position and games played
away_travel_km How this club fares on trips this long 556,507 matches

Bands were fixed before any result was looked at. Bands chosen afterwards are how a flat line becomes a finding, and it is the easiest way to fool yourself here.

Check it yourself

Every figure on this page comes from public endpoints. The script is forty lines of arithmetic over a walk of the archive, and it prints its own working.

python3 predict.py View the repository

A free key reads yesterday, as one whole day, so the script says which key it ran on before it starts. The numbers above are from a full key. Get a free key · The PHP client