fetch_fixtures.py
builds fixtures.json
and h2h_and_odds.json
.team_stats/*.json
.match_simulator.py
runs Poisson draws (20k) to estimate xG, corners, shots & probabilities.fixtures.json
with team IDs, names, and logos (prefer assets/logos/{id}.png|.svg
).h2h_and_odds.json
with home_{homeId}_{awayId}
keys.Each team inherits a coefficient from league_coefficients.json
. We apply a ratio
home_coef / away_coef
to nudge expected values.
Per-team multipliers (e.g., form/injuries) via team_boosters.json
.
Weighted average with cap. Example: w = min(0.40, 0.10 * num_matches)
. Then:
exp_home = exp_home*(1-w) + h_avg*w
, exp_away = exp_away*(1-w) + a_avg*w
.
Reproducibility: Poisson RNG is seeded by fixture_id
.
build.py
aggregates chosen leagues and derives per-team rates:
assets/logos/{id}.png
with SVG fallback on onerror
.fixtures.json → sim_stats.xg
.100 / pct
.Fixtures and odds daily (EST). Simulations re-run at fetch. Rankings are rebuilt when team stats update.
We use assets/logos/{id}.png
with an onerror
switch to .svg
. Add either format to fix.
Yes — edit match_simulator.py
and adjust the max_weight
and per-match slope.
© DataGaffer. For feedback or methods questions, ping us via the dashboard.