Core Rating Model

Current standings use the official Mass Soccer table, including point deductions and league ordering. Projections use regular league fixtures; byes, cross-flight exhibitions, and playoff rounds are excluded. Promotion and relegation zones are model assumptions. Historical tables are reconstructed from match results and may omit administrative deductions.

Every team carries an ELO rating inside its age group. The rating is a compact summary of recent results: stronger teams rise, weaker teams fall, and the gap between two ratings determines the expected result before the match starts.

P(home result strength) = 1 / (1 + 10^((ELO_away - ELO_home) / 400))

Match results then update both teams with a K-factor of 32. A win moves rating more than a draw, and an upset moves rating more than an expected result. New or sparse teams naturally drift back toward the league middle because their rating history contains less evidence.

Season-Start Uncertainty

Early in a season, ratings are informative but still noisy. Rosters change, some teams play only a few carryover opponents, and a one-game sample can exaggerate strength. To reflect that, the pre-match expectation is pulled 65% toward a 50/50 baseline at the very start of the season.

That extra uncertainty fades linearly as the average team reaches 6 games played. This is the main reason the promotion and relegation outlook starts flatter at week 0 and sharpens as real results accumulate.

How Match Outcomes Are Simulated

For every remaining fixture, the simulator converts the two current ELO ratings into three outcomes: home win, draw, and away win. Draws use a fixed 22% baseline, and the remaining probability is split between the two teams according to the ELO gap.

The season outlook runs 10000 Monte Carlo trials in the server-side summaries and larger live batches in the browser for the interactive what-if table. In each trial, every remaining game is resolved, the standings are updated, tie-breakers are re-applied, and the final finishing place for each team is counted.

Goal Difference In The What-If Simulation

Goal difference is not frozen at today’s table. It continues to move throughout each simulated run, because tie-breakers should react to the simulated results, not just the current standings snapshot.

Simulated win

The winning team gains 3 points and +1 goal difference. The losing team gets 0 points and -1 goal difference.

Simulated draw

Each team gains 1 point and goal difference stays unchanged, so draws do not create fake tie-break movement.

Why this matters

If two teams finish level on points in a simulated world, the tiebreak uses the simulated goal-difference path, not the present-day table locked in place.

Forfeits And Card Points

Completed forfeits are already treated as official standings events. A normal forfeit is stored as a 3–0 result, the non-forfeiting team gets the win, and the forfeiting team also loses 2 standings points. If the data marks a result as forfeitNP, the 3–0 result still stands but the extra 2-point deduction is not applied.

Card-point deductions are also already baked into the current standings table when they exist. The simulator does not try to forecast future cards or future forfeits, so every remaining unsimulated match is treated as a normal win, draw, or loss.

In short: existing forfeits and existing card deductions affect the starting table, but future cards and future forfeits are not projected.

What The Summary Text Is Trying To Capture

The flight and team summaries are written from the same outlook engine that powers the what-if simulation. They are supposed to emphasize the most practically meaningful swing, not tiny numerical noise. If a possible result leaves a team at 0.0% before and after, that should not be the headline.

That is why the summaries focus on the single most meaningful promotion or relegation change for a given team, and why the flight-level summary focuses on the race-wide game with the strongest overall impact.