The difference between bettors who win consistently and those who chase losses comes down to one thing: having an edge. The best way to develop that edge is to build your own model, and you don't need expensive software or advanced maths to get started. A spreadsheet, some historical data, and a few simple calculations are all you need.
This guide walks you through building a straightforward value betting model in Excel or Google Sheets. You'll collect data, estimate team probabilities using the Poisson distribution, and compare those estimates against bookmaker odds to find bets where the odds are in your favour. If you're new to value betting concepts, our value betting fundamentals guide covers the basics.
Starting with data
Before your model can predict anything, you need raw material. The first step is collecting historical results and basic performance metrics.
Open a new spreadsheet and create a table with the following columns:
- Date
- Home team
- Away team
- Home goals
- Away goals
- Home xG (expected goals)
- Away xG
- Result (win/draw/loss)
You can gather this data from several sources. Understat, StatsBomb, and the Match Odds section of many football statistics websites publish xG data freely. Once you have your data, aim for at least two seasons of results for the leagues you're analysing. More is better, but 100+ matches gives you a solid foundation to begin testing.
The xG metric matters because it reflects the quality of chances each team created, independent of the luck involved in finishing. A team might win 1-0 but have an xG of 1.2 to 2.8, suggesting they outperformed their underlying chance creation. Tracking xG helps your model ignore noise and focus on what teams are actually doing on the pitch. For more on why this matters, see our guide to using xG in football statistics.
Calculating team strength ratings
Once you have your data, the next step is measuring team quality. You'll create a summary table that captures how many goals each team typically scores and concedes.
For each team in your dataset:
- Filter their home matches and away matches separately
- Calculate their average goals scored per game (home and away)
- Calculate their average goals conceded per game (home and away)
For example, if Manchester City played 10 home matches and scored 25 goals total, their home scoring rate is 2.5 goals per game. If they conceded 5 goals in those 10 matches, their home defence concedes 0.5 per game.
Create a summary table with these columns:
- Team
- Home goals per game
- Away goals per game
- Home conceded per game
- Away conceded per game
- League average goals per game
The league average is important. If the Premier League averaged 2.7 goals per game, that's your baseline. A team scoring 2.5 goals is slightly below average, while a team conceding 0.5 is well above average defensively.
Using Poisson to estimate match probabilities
The Poisson distribution is a probability model that works well for football goals. It assumes that goals are scored randomly over time at a constant rate, which isn't perfect but is surprisingly accurate for modelling match outcomes.
Here's how to use it. For a matchup between Team A (home) and Team B (away):
- Estimate Team A's expected goals using: (A's home scoring rate ร B's away conceding rate ร league average)
- Estimate Team B's expected goals using: (B's away scoring rate ร A's home conceding rate ร league average)
For example:
- Manchester City at home vs Liverpool away
- City's home scoring rate: 2.5
- Liverpool's away conceding rate: 1.2
- League average: 2.7
- City's expected goals: (2.5 ร 1.2 รท 2.7) ร 2.7 = 2.5 ร 1.2 = 3.0
Do the same for Liverpool's expected goals against City's home defence.
Now you have expected goals (xG) forecasts. The Poisson distribution lets you convert these into probabilities for different scorelines. In Excel or Google Sheets, use the POISSON function:
=POISSON(goals, expected_goals, FALSE)
This returns the probability of exactly that many goals being scored. For City's 3.0 xG forecast:
- POISSON(0, 3.0, FALSE) = probability of 0 goals = 0.0498 or 4.98%
- POISSON(1, 3.0, FALSE) = probability of 1 goal = 0.1494 or 14.94%
- POISSON(2, 3.0, FALSE) = probability of 2 goals = 0.2240 or 22.40%
- And so on...
Sum the probabilities for 0, 1, 2 goals to get the probability City scores 2 or fewer. Sum for 3+ goals to get the probability they score 3 or more.
Converting probabilities to odds and finding value
Once you have win/draw/loss probabilities for the match, convert them to implied odds:
Odds = 1 รท Probability
If your model says City has a 65% chance to win, the implied odds are: 1 รท 0.65 = 1.54.
If the bookmaker is offering City at 1.50, then your edge is negative. The odds don't compensate you for the 35% of times City doesn't win. But if the bookmaker offers 1.60, now you have value. You're getting paid more than the true probability suggests.
Create columns in your spreadsheet:
- Match
- Model home win probability
- Model draw probability
- Model away win probability
- Bookmaker home odds
- Bookmaker draw odds
- Bookmaker away odds
- Implied home probability (1 รท home odds)
- Implied draw probability (1 รท draw odds)
- Implied away probability (1 รท away odds)
- Your edge on home (model % - implied %)
- Your edge on draw
- Your edge on away
Flag any match where your edge exceeds, say, 3%. That's your value bet signal.
Stress-testing your model
Before placing real money, test your model against historical results. Take matches from your dataset and apply your model to them as if you were betting weeks before they happened.
Calculate:
- Strike rate (percentage of bets that won)
- ROI (return on investment: profit รท stake)
- Closing line value (how many favourite-odds bets beat the opening line)
If your model goes 45% strike rate over 200 bets on odds of 2.0+, you're generating roughly 10% ROI. That's solid and worth pursuing. If you're under 50% strike rate on heavy favourites, your model may be overweighting home team strength.
Run sensitivity tests. What if you add 10% to all away team xG? What if you weight recent form more heavily? These iterations help you understand what drives your edge.
Refining over time
Your first model won't be perfect, and that's fine. The goal is to build something that beats the bookmaker, not to predict football perfectly.
Common refinements include:
- Adding form weighting (recent matches count more than old ones)
- Adjusting for injuries and suspensions
- Accounting for travel distance and fixture congestion
- Including weather data for extreme conditions
- Separating attacking and defending strength more granularly
Start simple. Once you have a working spreadsheet that identifies value, you can layer in sophistication. Many professional bettors run models that are conceptually simple but rigorously tested. Fancy maths without evidence won't beat bookmakers. Honest testing will.
In Summary
- Building a value betting model is a practical, testable way to develop an edge without advanced coding experience
- Start by collecting historical data with goals scored, goals conceded, and expected goals (xG) by team
- Calculate team strength ratings separated by home and away performance; this becomes your offensive and defensive metric
- Use the Poisson distribution to convert team strength ratings into scoreline probabilities for any matchup
- Compare your probabilities to bookmaker odds and flag gaps of 3%+ as potential value opportunities
- Test your results against historical matches to refine your model; honest backtesting reveals whether it actually works
- You don't need advanced statistics or coding; a spreadsheet, discipline, and honest testing are enough to start
- xG data is better than just goals because it smooths randomness, but goals alone work if you use more data
- Refine your model based on what the data shows; track what works (bet type, league, season phase) and what doesn't
Frequently Asked Questions
Can I use just goals scored and conceded, without xG data?
Yes. xG is better because it smooths out randomness, but goals alone work. You'll need more data (3-4 seasons instead of 2) to compensate for the noisiness.
How far back should my historical data go?
At least two seasons for the league you're modelling. One season works if you have no other option, but you'll have more variance in your estimates. For lower leagues with weaker opponents, three seasons can help.
What Poisson probability should I use as my "value" threshold?
Start with 2-3% edge on all odds. Once you've tested 100+ bets and you're profitable, try tightening to 1.5%. Softer bookmakers (those with wider margins) may need 4-5% to be profitable after their built-in edge.
Should I model all three outcomes (win/draw/loss)?
Yes, but you might find your edge only on one or two. Some bettors skip draws entirely and focus on goal lines or Asian handicaps. Test where your model is most accurate before committing capital.
What if my model says value exists but the odds have already shortened since yesterday?
That's information. Shortening odds mean money came in on that selection. See the article on odds movement to understand whether that's sharp money or just public attention.
How often should I update my model?
Recalculate team ratings after every round of matches, at minimum. If you're serious about this, weekly updates help you catch form changes before the market does.
