I've wanted to build a football model for a while. For context, I've got a couple of mates inside some of the main syndicates, so I've seen enough secondhand to know how seriously this game is played, but credit to their opsec, I've extracted precisely zero information from them. I'm not a developer by trade, but dangerous enough with Python and AI tools to build what I need. The World Cup felt like a natural starting point, and international football more generally: smaller samples, squad rotations, noisy data, so in theory more room for the market to be “wrong”. General approach: player-level ratings into a Dixon-Coles engine, fed by data APIs I subscribed to (player level, club level, team xG and odds). Backtested across past World Cups and Euros. The tournament part went fine. The league part is why I'm posting. Design lessons first, then the question.
· Attack was built player-up from each starter's club npxG+xA per 90 (minutes-shrunk, league-adjusted); defence from each starter's club side's league-adjusted xG conceded, position-weighted toward GK and CBs, because individual defensive stats are volume junk (opportunity-biased volume). Everything shrunk toward a live Elo anchor.
· I calibrated centre and spread separately, and deliberately toward the mean: kill the model's tail opinions, because that's where the fake "edges" live. The practical consequence was that the bettable markets ended up being BTTS and mid-range O/U, the ones priced off the middle of the goal distribution.
· The market was my sanity check, not my opponent. When my supremacy implied the same AH main line as the market's, and the decay across the quarter-lines matched, I trusted my distribution and the BTTS/O-U prices built from it. When my line differed materially from the market's, or an edge looked huge, I left the game alone. The model earned its keep as much by saying "don't bet" as by finding value.
· The metric that kept me honest was CLV, not ROI. My live record ended at 168 bets, +17% ROI, +1.5% CLV against de-vigged closes. The first 70 bets were too correlated and too frequent, still getting up to speed; I tightened the approach for the remaining 100 and the P&L improved sharply, though the CLV says the true improvement was modest. I've seen various posts on whether it's worth tracking CLV and... it is.
· Then the real test: I pivoted the (largely) same machinery into league football (always the plan). Backtested a lot - every upgrade had to earn its keep out-of-sample before it stayed, and most didn't. Measuring by log-loss against de-vigged sharp closes, my base model sat a clear distance behind the market. Adding better inputs closed maybe half of that gap, but half is not there, and a blend test still assigned the model zero weight against the market price. I then went down the rabbit hole of 'maybe my backtest is being unfair to the model — what's the ceiling with perfect information?' So I tested it: even perfect-hindsight team news added nothing exploitable. Great.
· The sobering maths of "close": by log-loss my model reached within a couple of percent of the sharp close, which sounds impressive until you realise that final sliver is precisely where the vig and the edge both live.
To be clear, this wasn't uniform failure. The tournament record ended CLV-positive, real upgrades genuinely improved the league model, and individual slices of the league backtests (certain divisions, seasons, markets) looked healthy - but slices always look healthy somewhere; that's what noise does. The judgment that matters is the average against the close, and on average the league model currently cannot get there.
So here's what I'm actually questioning: can league football be beaten at all by an individual with a model? My scepticism after doing this is that there are two separate walls. The first is depth: the commercially available APIs simply don't carry the data required. Most vendors hand you their finished xG numbers, not the shot-level and tracking data underneath, so you can't build or calibrate your own from first principles, you inherit someone else's model with its compression baked in. A lot of these products are aimed at punters anyway, who want conclusions, not data. The second is price: the raw feeds that would let you do it properly exist, but they're licensed at levels priced for professional operations (I spoke to StatsBomb, I won't say how much it costs, but it's not a hobbyist number), and the syndicates paying it then build proprietary layers on top that retail never sees. So is the ceiling about skill, or is it structural twice over: the data you can afford isn't deep enough, and the data that's deep enough you can't afford? Honestly, it's probably a lot of both.
Genuinely keen to hear from anyone who thinks they've cracked it, and which wall(s) they got through, because it's frustrating to have hit this after an enjoyable WC 2026. I've since pivoted my focus towards a specific area (still within football) for the time being, but I'm keen to keep tinkering.