Football. Both teams to score model: Indicators that actually work

Both teams to score model: Indicators that actually work

Both teams to score markets are among the most popular and, at the same time, most misunderstood bets in football. The outcome hinges on two independent but interacting events: each side finding the net. That makes it perfect terrain for a data-driven approach—if you choose the right indicators and combine them sensibly.

Why a simple goals tally isn’t enough

Counting recent matches where both sides scored gives a quick snapshot, but it misses context. Goals are low-frequency events and are heavily influenced by shot quality, tactical matchups, and sheer randomness.

Models that rely only on past BTTS outcomes will overfit fixtures with fluky scores. Modern analytics shift attention to underlying processes—how many quality chances a team creates and allows—so predictions reflect likelihood, not luck.

Core indicators that move the needle

When I built BTTS checks for pre-match screening, a small basket of well-chosen metrics consistently separated sensible bets from junk. These indicators capture offense, defense, and the interaction between styles.

IndicatorWhy it mattersHow to measure
Expected goals (xG) for and againstReflects the quality of chances created and conceded, reducing noise from finishing variance.Per-match or rolling average (3–10 matches) from sources like Understat/StatsBomb.
Shots on target (SOT) concededGood proxy for defensive frailty: more SOT faced usually means more goals conceded later.League per-match SOT conceded and shot location breakdowns.
Conversion and save ratesExtreme conversion or goalkeeper form can skew xG; adjust when rates diverge from long-term norms.Season and recent-window conversion % and keeper save %.
Tactical profile and intensityTeams that press aggressively or sit deep produce different goal profiles; both can lead to BTTS in different ways.PPDA, possession share, and open-play vs. set-piece chance splits from event data.
Home/away tendenciesMany teams score more at home and concede more away—context shifts BTTS odds substantially.Home and away xG and goals scored/conceded splits.
Lineups, injuries, and suspensionsMissing defensive leaders or a starting keeper changes the defensive baseline instantly.Pre-match lineup check and recovery of injured players; late absences matter.
Head-to-head patterns and matchup quirksCertain tactical mismatches (e.g., a high-pressing side vs. a slow-possession team) repeatedly produce BTTS.Recent meetings and stylistic contrasts; watch for systemic causes over single-game aberrations.

How to think about xG and defensive exposure together

xG gives you an expected goals baseline for each team, but the probability both teams score depends on the combination of their offensive and defensive profiles. Two mid-table teams with similar xG and xGA often produce BTTS more frequently than a dominant team vs. a defensive wall.

In practice I use separate features for attacking xG and defensive xG allowed, then include their interaction. That lets a model learn that two modest attack teams facing porous defenses produces higher BTTS chances than one strong attack vs. a stonewall defense.

Modeling approaches that work in practice

There are several sensible routes: a logistic regression predicting the binary BTTS outcome, or an approach that predicts expected goals for both sides and computes the BTTS probability from the goal distributions. Both can succeed when fed the right inputs.

A popular advanced route is a bivariate Poisson framework (or negative binomial if overdispersion shows up) where you model the two teams’ goal counts jointly and allow for correlation. That correlation term often captures shared match factors—game tempo, weather, or referee leniency—that influence both teams’ scoring.

Practical feature engineering tips

Small, careful transformations often beat fancy models. Use rolling averages that down-weight old matches, include separate home and away stats, and add binary flags for red cards or late lineup changes. Normalize features per league because scoring rates differ markedly across competitions.

Also tune how you treat extreme conversion or save rates: cap or regress them toward league average to avoid letting short-term hot streaks mislead the model. Finally, interaction terms—especially attack vs. opponent defense—often add explanatory power.

Validation and market calibration

Always backtest on unseen seasons or a time-forward split to avoid look-ahead bias. Use metrics that reflect probabilistic forecasts: Brier score for calibration and log loss for sharpness. AUC can help for ranking, but it doesn’t reveal calibration.

Even a well-calibrated model can lose to the market because bookmakers embed information beyond public data. Look for consistent edges—mispriced games in lower-liquidity leagues, or late lineup news that the market reacts to slowly.

Common pitfalls and when to walk away

Don’t trust models blindly in knockout competitions where teams may prioritize defense for a draw, or in games with extreme mismatches where the favorite may rest starters. Also be wary when a team deploys a drastically different tactical setup from its recent matches.

Weather and pitch conditions can matter, but they’re often second-order effects unless extreme. The biggest single cause of last-minute model failures is late lineup information—always check before committing money.

Quick pre-match checklist

  • Verify both teams’ rolling xG for and against (home/away splits).
  • Check shots on target conceded and goalkeeper status.
  • Confirm starting lineups and any defensive absences.
  • Assess stylistic matchup—high press vs. slow buildup, set-piece dependence.
  • Scan head-to-head and schedule congestion for fatigue or rotation risk.

A short example from my work

When I first built a BTTS filter I started with just xG features, then added SOT conceded and a lineup flag. That simple combination noticeably reduced false positives: games where a model predicted both teams but one side was unlikely to field its regular attack.

Over time I added an interaction between an away team’s attacking xG and the home team’s defensive xG allowed, which made the model more sensitive to matchups. The result was a more stable set of candidates worth further manual inspection.

Where to get reliable data and further reading

High-quality event-data providers are essential. Understat and StatsBomb publish xG data; FBref includes many advanced per-90 stats and is easy to scrape for historical work. Opta provides the industry standard dataset, often through partners and APIs.

For implementation, the Python stack—pandas for data manipulation, scikit-learn or statsmodels for modeling, and specialized libraries for Poisson likelihoods—covers most needs. Start small, validate carefully, and keep a clear record of each feature’s contribution.

Modeling both teams to score is as much art as science: pick indicators that reflect the true processes that generate goals, respect the limits of noisy data, and combine quantitative screening with a quick manual check for late news. Do that, and you’ll separate the plausible opportunities from the noise with far more confidence.

Sources and experts

Scroll to Top