Keshav Sundararaman

Case study

F1 Podium Predictions

Before each 2026 race I predict the podium from the qualifying result and publish it. There is one notebook per race, so every prediction can be traced and checked against what happened.

Podium drivers right per race (best model)
2.19 / 3
Baseline: top 3 on the grid
2.07 / 3
Races in the walk-forward test
43
Models compared
7

How it works

  1. 1

    Download

    Race results from Jolpica through fastf1; weather and practice times from OpenF1

  2. 2

    Build inputs

    Grid position, form over the last 5 races, podium rate, team points, circuit history

  3. 3

    Walk-forward test

    7 models, each race predicted using earlier races only

  4. 4

    Select

    Keep the model with the most podium drivers right per race

  5. 5

    Predict

    Apply it to the new grid, with penalties added by hand

  6. 6

    Publish

    Notebook, podium card and a public scorecard

Results

Scorecard
RacePredicted podiumActual podiumRight
Mexico City (1 Nov)Russell, Verstappen, HamiltonVerstappen, Hamilton, Antonelli2 of 3
Brazil (8 Nov), first versionRussell, Norris, VerstappenNorris, Verstappen, Hadjar2 of 3
Brazil (8 Nov), corrected versionRussell, Norris, LeclercNorris, Verstappen, Hadjar1 of 3

Mexico was re-run after the race using only pre-race data. The first Brazil version ignored grid penalties; the corrected run was committed during the race, so it is not a true pre-race prediction.

What I found

  • The edge over the grid rule is small (2.19 against 2.07) and I would not call it proven.
  • The models mostly agree with the grid, then move a few drivers up or down based on recent form.
  • Practice pace and how wet qualifying was did not help. Recent form without the grid was clearly worse.

Limitations

  • Penalties are entered by hand from news and race control messages.
  • The race-day weather forecast is not an input.
  • With about 43 test races, small differences between models are mostly luck.
  • Drivers starting far back with strong recent form are where the models disagree most.

Built with

Pythonscikit-learnXGBoostpandasOpenF1 API