Call f1verse.championship_projection(year). It plays the remaining rounds out thousands of times, resampling each driver from the positions they have actually finished in, and returns a title probability with the evidence it stands on.
>>> f1verse.title_scenarios(2026)["max_points_available"]
283 # arithmetic: who is mathematically out
>>> f1verse.championship_projection(2026)["drivers"][0]
{'driver': 'ANT', 'title_probability': 0.954, 'points_now': 242.0,
'projected_points_median': 446, 'projected_points_p10': 390,
'projected_points_p90': 490, 'races_in_sample': 11,
'measured_dnf_rate': 0.08}
Two questions, kept apart on purpose. title_scenarios answers can this still happen — maximum points remaining is a fixed number, so that is arithmetic, not a forecast. championship_projection answers how likely. Printing one as the other is how a projection ends up implying somebody is eliminated when the maths says otherwise.
A simulated finish is resampled from that driver's own results, not drawn from a curve around their average. The difference decides championships: alternating wins and retirements is a different proposition from finishing fourth every weekend, and the mean cannot tell them apart. Retirements fire at each driver's measured rate and sprints score on their own table.
Every run re-draws the driver's level first, bootstrapping their results before playing the season against that version of them. Twelve races is a small sample, and treating it as settled is how a forecast becomes more confident than anyone should be.
f1verse.backtest_projection() replays the model on finished seasons and buckets the record by claimed confidence. At round 12 of 2019-2025 it went 5/5 when it claimed 90%+, and both misses were seasons it had itself called near 55% — the two that ran to the final round.