Methodology
How predictions are calculated.
This app uses statistical probability, historical data, recent form and news sentiment. Predictions are not betting advice and no outcome is ever guaranteed.
1. Team score
For each team in a match we compute a weighted team score:
team_score = 0.30 × recent_form + 0.20 × historical_performance + 0.15 × attack_strength + 0.15 × defense_strength + 0.10 × head_to_head + 0.05 × news_sentiment + 0.05 × ranking_score
2. Expected goals (xG)
Each team's expected goals come from their own score divided by the opponent's defense, normalized to a realistic 0.3 – 3.5 goal range.
xg_a = (team_a_score / team_b_defense) × 1.35 xg_b = (team_b_score / team_a_defense) × 1.35 clamp(0.3, 3.5)
3. Poisson distribution
We treat goals as Poisson-distributed events and enumerate every scoreline from 0-0 up to 5-5, summing probabilities for team-A wins, draws and team-B wins. The highest-probability cell becomes the predicted scoreline.
4. News sentiment
An hourly job classifies recent headlines per team into positive (+0.05), neutral (0) or negative (-0.05). Injuries or squad turmoil reduce a team's score; clean bills and momentum push it up.
5. Knockout adjustment
In knockout rounds, draw probability is compressed and reallocated toward the stronger team, reflecting that someone must advance.
6. Data sources
- football-data.org for fixtures and results
- TheSportsDB for team metadata and crests
- GNews / RSS feeds for news sentiment
- Manual CSV upload as MVP fallback when APIs are unavailable