richardthomas.dev

What it takes to win the €2 football card

11 Oct 2026 · 13 min read · football · analytics
A blank Weekly Footie Predictor card for 14 and 15 March: €2 entry, winner takes the pot. Last week's winner scored 13 points and won €440. Fixtures start with Burnley v Bournemouth, Sunderland v Brighton and Arsenal v Everton.
The card for 14–15 March 2026. Last week’s winner is blacked out; they scored 13 and took €440.

Every week a sheet like this does the rounds of the bars here. It lists nine fixtures from the coming weekend, mostly Premier League with the odd Championship, Scottish or cup tie, and internationals when the leagues stop. You write down a score for each one, add your name and the bar you’re leaving it at, and hand it in with €2. You can fill in as many as you like.

Once the weekend’s done, every card gets scored:

Highest total takes the whole pot, and ties split it. The next week’s sheet prints the winner, their score and what they won. The pot is usually around €400, so there are at least 200 cards in every week.

I’ve never actually played. I’ve watched it go round for a long time, though, and the sheets also turn up every week in a WhatsApp group I’m in for Last Man Standing. I work with data, and a game where you predict scores against a crowd is hard to look at without wanting to model it. So I collected photos of 84 of these sheets going back to October 2024, turned them into a dataset, and tried to work out what it takes to win.

What a filled-in card looks like

Here’s a real one, from a normal February weekend in 2025. Someone photographed it after it had been marked.

HomeGuessAwayResultPts
Aston Villa1–1Ipswich1–13
Fulham2–0Nott'm Forest2–11
Man City3–1Newcastle4–01
Southampton0–4Bournemouth1–31
West Ham0–1Brentford0–13
Crystal Palace2–0Everton1–20
Hearts1–3Rangers1–33
Liverpool5–0Wolves2–11
Tottenham2–1Man Utd1–02BM
Total15
A real card from 15–16 February 2025, re-scored against the 90-minute results. It comes to 15, the same total someone circled in pen at the top of the sheet.

Fifteen is a good score. The average winning score across the weeks I have is about 16. I can’t tell you whether this card won, though, because the next week’s sheet left the winner box empty.

It got eight of the nine results right, but most of its points came from three exact scores. One of them was Villa 1–1 Ipswich, a draw, which is exactly the kind of guess the next section says the maths steers you away from.

Filled-in cards are rare in my data. The sheets never show anyone’s picks. All they print is last week’s winning score, how many people shared it and the pot, and that’s everything I know about the other 200 players. Twice, though, someone photographed a filled-in card, which gives me a useful cross-check on my transcriptions and results. This one re-scores to 15, matching the circled total. The other, from an international break in October 2025, re-scores to exactly 20, and the following week’s sheet named it the winner on 20 points.

What is one guess worth?

Every match has a chance of ending in each possible score. I get those chances from the bookmakers: their closing odds, with the margin taken out, say how likely a home win, a draw and an away win are, and how likely the match is to have three or more goals. A simple goals model fitted to those numbers gives a chance for every scoreline. (How that works is in the method notes at the end.)

Once you have that, the value of a guess is short to write down. You get 1 point if the result is right, plus 2 more if the score is exactly right:

def expected_points(guess, probs, bonus=False):
    """probs[(h, a)] is the chance the match ends h-a."""
    h, a = guess
    p_result = sum(p for (i, j), p in probs.items()
                   if (i > j) == (h > a) and (i < j) == (h < a))
    p_exact = probs[(h, a)]
    return (p_result + 2 * p_exact) * (2 if bonus else 1)

That second term is the interesting one. Here’s the bonus match from one of the earliest sheets I have, Man Utd v Chelsea in November 2024:

Chance of each scoreChelsea goalsMan Utd goals00112233444.5%5.8%5.2%2.9%1.2%5.6%10.8%FT8.4%4.6%1.9%5.0%8.2%6.8%3.7%1.5%2.7%4.4%3.6%2.0%0.8%1.1%1.8%1.5%0.8%0.3%Expected points if you guess itChelsea goalsMan Utd goals00112233440.330.500.490.440.410.480.46FT0.560.480.420.470.530.380.460.420.420.460.440.280.400.390.410.400.390.25
Man Utd v Chelsea, 3 November 2024, from the closing odds. 1–1 was the single most likely score at 10.8%, but the best guess was 1–2 (expected points shown before the bonus doubling). It finished 1–1 (FT).

The most likely score was 1–1, but the guess worth the most points was 1–2. Guessing 1–1 only pays the result point if the match is a draw, and a draw was the least likely result at 24%. Guessing 1–2 pays that point for any Chelsea win, which was 39%. The exact-score chances are close (10.8% vs 8.4%), so the bigger result chance wins:

This happens all the time. Across the 718 fixtures I modelled, the points-maximising guess was 1–1 only 10 times. It’s almost always 2–1, 1–0, 1–2 or 2–0, even though roughly a quarter of matches end level.

And yes, Man Utd v Chelsea finished 1–1. Being right on average and being right on Sunday are different things.

The sensible card

So build the card that scores the most points on average: the points-maximising guess for every fixture, every week. Then replay it against every sheet I have, using the real results.

05101520winner 15.6our card 7.12024/252025/262026/2705101520○ winner, avg 15.6● our card, avg 7.12024/252025/262026/27
Each column is one week. Blue dot: what the points-maximising card scored. Ring: the score that won the pot. 70 weeks with a known winning score, Oct 2024 to Oct 2026.

It averaged 7.1 points. The winning score averaged 15.6.

It didn’t win once in these 70 weeks. Its best week was 16 points, in March 2025, when four people shared the pot on 18. Most weeks it finished 8 or 9 points behind the winner.

In the week of the one confirmed winning card, the October international break, it got eight of the nine results right, one more than the winner did. But it didn’t get a single exact score, so it finished on 9 points to their 20.

A losing run like this doesn’t prove the card is a bad bet. Even by the model later in this post, which turns out to be generous, this card would go 70 weeks without a win about a third of the time. What the chart does show is how far away the winning score is.

You’re not playing the matches

Fifteen or sixteen points isn’t what a good card scores. It’s roughly what the luckiest of 200 cards scores.

By my model of the other players (next section), a typical card scores about 6 points, so the sensible card is about a point a week better than the average punter. That’s a real edge, and it’s nowhere near enough. With 200 cards in, somebody usually lands a handful of exact scores, and the best card ends up far above the middle.

0%10%20%0510152025pointstypical card 6.1best-on-average card 7.1winner 15.60%10%20%0510152025points│ typical card 6.1│ best-on-average 7.1│ winner 15.6
one typical cardbest of ~200 cards (model)real winning scores, 70 weeks
Across 70 weeks. Grey: what one typical card scores, according to the crowd model. Blue: what the best of about 200 such cards scores. Solid bars: the real winning scores. Being a point better than average barely moves you towards the right-hand hump.

Look closely and the real winning scores sit a little to the right of the model’s blue hump. Hold that thought. To say anything useful about winning, I need some idea of what the other 200 cards look like, and that’s where the model is weakest.

Modelling a crowd you can’t see

All I have on the other players is each week’s winning score and whether the pot was shared. That’s enough to work backwards to a plausible crowd, but not to observe one.

I built a simple model of how a punter fills in a card, with three habits I can turn up or down: how much they lean on favourites, how often they call a draw, and how much they stick to the usual scorelines. For any setting of those three, I can work out exactly how likely each winning score is in a given week, given the real results. If one card’s score has the distribution card_pmf, the best of n cards is short to write down:

def winning_score_chances(card_pmf, n_cards):
    """card_pmf[k] is the chance one card scores k points."""
    chance_all_at_most = np.cumsum(card_pmf) ** n_cards
    return np.diff(chance_all_at_most, prepend=0)

Then I turned the three dials until the model’s winning scores matched the real ones: an average winning score of 15.2 against the real 15.6, and the pot shared in 30% of weeks against the real 31%. That’s the blue hump in the chart above. It’s a fit, not a test, because the dials were set on the same 70 weeks. Fitting them on the first season only and predicting the 47 weeks after gives much the same answer (15.4 against a real 15.7), which is some comfort.

The crowd that fits best is a conventional one. Across every fixture, the modelled punters back the favourite 60% of the time when the odds say favourites win 55% of the time. The model also has them calling draws in tight games, but that’s the habit I trust least, for reasons coming up.

The fitted crowd also seems to have favourite scorelines regardless of the match. A version that lets punters like or dislike particular scores fits noticeably better, and it says that, on top of their other habits, they pick 2–1 about 70% more often than you’d expect and 1–0 only about half as often. That’s inferred too, but it’s the most distinctive pattern the model finds.

Everything so far is inferred from winning scores. The one real crowd I could find to check it against is from BeTeam, a social prediction app, which published 194,812 score predictions from 3,232 fans at the 2026 World Cup. One prediction in six was exactly 2–1 (16.9%), three times as many as 1–0 (5.7%), which is the same lean my model found. On draws, they did the opposite of my model: in the group stage, 27.8% of matches finished level, but only 13.7% of predictions called a draw. It’s a different crowd (app users, not bar punters), a different competition and only 102 matches, but it’s real behaviour, so I wouldn’t lean on my model’s draw habit.

That 2–1 habit shows the problem with popular picks. If a sixth of the cards have 2–1 for a match and it comes in, that’s about 30 cards gaining the same 3 points. It doesn’t separate you from the people you’re trying to beat.

Now the weak spot: the bar’s real crowd is tougher than my model. Winning scores of 19 to 21 came up 10 times in 70 weeks, and the model only expects about 4 or 5. The cleanest test is to forecast each week’s winning score before the matches are played and see where the real one lands. If the forecasts were honest, the real winner would fall in the top fifth of the forecast about 14 times in 70. It did 24 times. None of the richer crowds I tried fixes that. Whatever makes the real top cards that good, my model can’t see it, so every chance of winning in the next section is too generous.

Playing the field

So the question changes. The aim is no longer the most points. It’s winning: across every way the weekend could go, how often your card comes out on top, and how many people you’d be sharing with when it does.

Given the scoreline model and the modelled crowd, I can estimate that for any card. Since my crowd is too easy to beat, the absolute numbers are too rosy, so read this as a comparison between cards. Here’s a sample of cards for the February weekend from the start of this post:

€1€2€3€4€54.04.55.05.56.06.57.07.5expected points →expected return on €2 ↑best on averagebest foundthe real card€1€2€3€4€54.04.55.05.56.06.57.07.5expected points →expected return on €2 ↑best on averagebest foundthe real card
2,500 sampled cards for 15–16 February 2025 (the sensible card with a few picks swapped), each run through 100,000 simulated weekends against the modelled crowd, with a €400 pot assumed. Across: expected points. Up: the model's estimate of money back for €2. Higher is better, but the level is too generous, so compare dots with each other. Each is good to about ±€0.15.

The sensible card sits on the right with the most expected points. The best card the search found gives up a third of a point and sits higher: by the model, it’s worth about 15% more than the sensible card. The real card from the top of this post sits well below both. For the same weekend, some cards give up very little in points to be noticeably harder to share a pot with.

The best card found for that weekend changes four picks:

Three of those keep the result and change the score. Only one changes who wins, and it’s the one that counts double. (The search used the simpler crowd without favourite scores. With a 2–1 habit built in, Villa 2–1 would look less attractive.)

Across all 70 weeks the pattern holds, and the effect is modest. The best card found changes about four picks a week, mostly to a different score for the same result, sometimes to an underdog, and gives up about 0.8 expected points. By the model, its chance of winning or sharing goes from about 1.5% to 1.7% a week. Both numbers are probably too high. The gap between them is what I’d trust more.

That gap survives the two obvious ways this could be flattering itself. Closing odds aren’t all known when the card goes in, so I chose the cards from the odds available on the Friday instead. It barely changed anything. And everything here was tuned on the same weeks it’s tested on, so I fitted the crowd on the first season only and played the 47 weeks after. Everything came out lower, but the best card found still beat the sensible one.

Replayed against the real results, the sensible card won nothing, as we saw. The best card found won once, in August 2026. It had Hibernian winning 2–1 at Ibrox in the bonus match, which is not a sentence you write often. They did. That was 6 points, the card finished on 18, two clear of the winner, and it took the whole €220 pot.

I wouldn’t read much into one win. The model expected about one from either card over 70 weeks, and the version that chose its cards from Friday’s odds didn’t land this one.

So would I play it?

Seventy weeks, €140 in, and €222 back, all from one Sunday at Ibrox. That’s the honest shape of it, and it’s mostly luck.

I can’t tell you a card is worth its €2. The bar takes a cut I don’t know, and my model is too generous about everyone’s chances. What I can say is that the sensible card, the one most people would call a good card, is a fine way to score 7 points and a poor way to win. If you’re going to play, a card that’s right where the crowd isn’t gives you a better shot at the same pot, even if that shot is small. If you play more than one, make them different. Five copies of the same card win exactly as often as one.

The lesson turned out to be about the other 200 cards more than the football. To win, you need to be right somewhere they aren’t.

As for me, I probably wouldn’t play it now. I’ve spent far more evenings on this than any €2 card could ever pay back, so by my own numbers I’m already a long way down before I’ve picked a single score.

Method notes

For anyone who wants to check the working.

Data. 84 photographed sheets from October 2024 to October 2026, transcribed with an AI model and spot-checked by hand. One duplicate photo and two filled-in copies of sheets I already had leave 81 weekends; 70 of them have both the fixtures and the following week’s winning score. Results are 90-minute scores from API-Football. Two fixtures moved off their weekend and were void.

Odds. Of the 718 played fixtures I modelled, 575 have bookmaker closing odds from football-data.co.uk (Pinnacle where available, otherwise the market average). The other 143, mostly cup ties and internationals, use Elo ratings converted to expected goals, which is rougher. Closing odds are the best public estimate of what will happen, but they aren’t all available when a card goes in, which is before the first match. As a check, I re-ran the strategy choosing cards from the earlier odds football-data.co.uk collects on Friday afternoons for weekend games (Tuesday for midweek), and evaluating them under the closing odds. It made little difference.

Scorelines. Each match is a Dixon-Coles Poisson model: each side gets an expected number of goals, with a small correction for low scores because plain Poisson slightly underrates 0–0 and 1–1. The expected goals are fitted to each match’s odds:

def score_grid(home_xg, away_xg, rho=-0.06):
    grid = np.outer(poisson.pmf(GOALS, home_xg), poisson.pmf(GOALS, away_xg))
    grid[0, 0] *= 1 - home_xg * away_xg * rho   # a few more 0-0s
    grid[0, 1] *= 1 + home_xg * rho             # a few fewer 0-1s
    grid[1, 0] *= 1 + away_xg * rho             # and 1-0s
    grid[1, 1] *= 1 - rho                       # a few more 1-1s
    return grid / grid.sum()

def fit_to_odds(p_home, p_draw, p_away, p_over):
    def error(log_xg):
        g = score_grid(*np.exp(log_xg))
        model = [home_win(g), draw(g), away_win(g), over_2_5(g)]
        return sum((m - t) ** 2 for m, t in zip(model, [p_home, p_draw, p_away, p_over]))
    return np.exp(minimize(error, x0=[0.3, 0.1], method="Nelder-Mead").x)

rho, the size of the low-score correction, was chosen by which value best predicted the real scores across the 575 matches with closing odds. Across all 718 modelled fixtures it predicted draws well (165 against 174 real) but under-predicted 2–2s (34 against 58) and over-predicted wins by four or more. That could be noise, and it slightly affects how draw picks are valued.

The crowd. Three parameters, fitted by maximum likelihood to each week’s winning score and whether it was shared, assuming about pot ÷ €2 entries. Allowing for a bar cut (more entries than that), a group of punters who always pick the likeliest scores, or favourite scorelines fits about as well or a little better. A bigger field lowers every chance of winning. None of these variants reproduces the very high winning weeks.

Forecast check. Before each weekend, I averaged over thousands of simulated weekends to forecast the full distribution of the winning score, then checked where the real one fell. Splitting each forecast into fifths, the real winners landed in them 15, 10, 15, 6 and 24 times (about 14 each if the forecasts were right). The sensible card’s gap to the winner was also worse than forecast. Shared pots were forecast well (30% against 31%). So the model gets a typical week about right and is too generous about the big ones, and therefore about everyone’s chance of winning.

Payouts. For each card I simulate weekends from the scoreline model and work out exactly how the modelled crowd scores in each, then the card’s chance of winning or sharing and its expected share of the pot. The search uses the three-habit crowd (not the favourite-scores version, which would make 2–1 look less attractive). The search for better cards and the numbers reported here use separate simulations. Using the same simulations for both flatters whichever card the search picks, and an earlier version of this analysis made exactly that mistake.

What this is and isn’t. The scoreline model, the crowd and the search were all set up using the same two seasons they’re evaluated on, so this is a reconstruction of what would have happened, not a tested betting system. The closest thing to a fair test is fitting the crowd on 2024/25 only and evaluating on the 47 weeks after. Everything comes out lower, but the best card found still beats the sensible one, although the scoreline model’s few parameters were still set using all the data. For reference, the model’s own estimates of money back per €2 were €3.79 for the sensible card and €4.74 for the best card found (€2.80 and €4.06 in the held-out test). Those figures assume the modelled crowd is right, and the forecast check says it’s too easy to beat, so treat them as an upper bound on a comparison, not as evidence of a real-world edge.

clicktap anywhere to skip