Spoiler-Free Race Quality Scoring for Formula 1
A Data-Driven Approach to Viewer Recommendation
Vishal Soni
shalliwatchtherace.com
Technical Report · v1.0 · May 2026
Abstract
We present a lightweight scoring system that classifies completed Formula 1 race sessions as either Watch (worth viewing in full) or Highlights (adequately summarised by a short package), without revealing finishing positions, driver names, or any other spoiler-bearing information. Four telemetry-derived signals—race incident severity, ambient weather conditions, on-track position dynamics, and pit strategy variance—are combined into a normalised composite score from which a binary verdict is derived. An optional personalisation layer upgrades a Highlights verdict to Watch for users who follow a driver or constructor that was notably active in a session, but never downgrades a Watch verdict. All data are sourced from the public OpenF1 telemetry API.
1. Introduction
Formula 1 race broadcasts run for approximately two hours. Many viewers are unable or unwilling to commit this time without prior knowledge of whether a race was competitive. However, consulting conventional reviews or social media invariably reveals results, creating a binary choice between spoilers and blind viewing.
This report describes the scoring algorithm underpinning Shall I Watch The Race?, a tool that resolves this tension by producing a verdict derived exclusively from process signals: how many times the safety car was deployed, whether it rained, how much movement occurred in the running order, and how varied the pit stop strategies were. None of these signals encodes a result. Positions are treated as anonymous integers; finishing order is never queried.
The system is intentionally simple. Complex machine-learning approaches would require labelled training data (subjective viewer ratings) and would be less interpretable. The rule-based approach described here is fully auditable: every point awarded maps directly to a specific, observable race event.
2. Data Sources
All race telemetry is retrieved from the OpenF1 public API (openf1.org). Four endpoints are consumed per session:
| Endpoint | Data provided |
|---|---|
| /race_control | Safety car, virtual safety car, and red flag events with timestamps |
| /weather | Rainfall (mm), track temperature, and humidity at 1-minute intervals |
| /position | Per-driver position values sampled every few seconds throughout the session |
| /pit | Individual pit stop records with driver number and lap number |
Session metadata (calendar round, official race name) is sourced from the Jolpica/Ergast compatibility API. This is used solely for display purposes and does not influence scoring.
3. Scoring Methodology
The total raw score is the sum of four independent sub-scores, each capped at a fixed maximum:
| Signal | Cap (pts) | % of ceiling |
|---|---|---|
| Race incidents | 25 | 38% |
| Weather | 15 | 23% |
| Position dynamics | 40 | 62% |
| Pit strategy | 10 | 15% |
| Theoretical maximum | 90 | — |
3.1 Race Control Events
Interruptions to normal racing—safety car (SC) deployments, virtual safety car (VSC) periods, and red flags—reliably indicate incidents that reshape the field. SC deployments occurring within a 10-minute window are merged into a single incident: an immediate re-deployment after a failed restart is the same disruption, not new drama. Let denote the merged incident count, with and the raw counts of the other two event types observed in the race control feed:
Safety cars are deliberately weighted below the on-track signals of Section 3.3: a deployment bunches the field and creates pit-stop divergence, but an interrupted race is not automatically an exciting one. Red flags carry the highest per-event weight, as a stoppage almost always reflects a major incident. The combined cap at 25 ensures on-track action must also be present for a high score.
3.2 Weather Conditions
Let denote the total number of weather readings for a session and define the wet-readings fraction:
A piecewise function maps to a rainfall score :
The 10% lower bound prevents a brief shower—common at circuits such as Interlagos—from receiving the same score as a genuinely wet race. An additional 5-point bonus is awarded when track temperature swings exceed 12°C under dry conditions, capturing races where a cooling track changes tyre behaviour mid-race (an ordinary afternoon drifts ~10°C at some circuits without affecting the racing):
3.3 On-Track Position Dynamics
The position telemetry stream is a time-ordered sequence of triples where is a driver number, a timestamp, and a position integer. For each driver , define:
- — first recorded position (grid position proxy)
- — last recorded position (finishing position proxy)
- — maximum position value reached (worst point in race)
A driver is a forward mover if they finished at least 5 places higher than they started (net gain only; retirements, which drop drivers to the back, do not qualify):
A driver is a recovery drive if they fell 10 or more positions from their grid slot yet finished within 2 places of where they started—indicating a dramatic mid-race comeback that the forward-mover signal misses (net change ≈ 0):
Let be the total mover count and the number of sustained leaders: drivers whose cumulative time at P1 after the race start, , reaches at least 5 minutes. The threshold matters — a momentary P1 during a lap-1 scramble or a pit-stop cycle is a timing artifact, not a lead battle, and counting it systematically inflated scores at strategy-dominated circuits:
Lead changes () are weighted four times higher than mover counts () because a contested lead is the strongest indicator of a race worth watching in full.
3.4 Pit Strategy Variance
Let be the number of pit stops recorded for driver and the set of drivers with at least one recorded stop:
This signal captures races where genuinely varied strategy—some drivers taking two stops while others extend on one—creates diverging storylines. Only the field average is considered: a single driver making three or more stops is far more often evidence of damage or a penalty than of a strategic race, so per-driver maxima are ignored.
4. Score Normalisation and Verdict Assignment
The raw score is normalised against a calibration ceiling (rather than the theoretical maximum of 90) and rounded to one decimal place:
The ceiling of 65 was calibrated so that a genuinely exciting race—containing a safety car deployment, multiple lead changes, and solid overtaking—scores approximately 6–8 out of 10. Setting (the theoretical maximum) compressed scores into a narrow range and made separation between races difficult. The binary verdict is then:
The threshold of 5.0 was chosen empirically. At this level a race needs genuine on-track action—a sustained lead battle, strong overtaking, or varied strategy—on top of any interruptions. Races whose points come mostly from safety cars land below the line: an interrupted race is not automatically an exciting one.
5. Personalisation Layer
During scoring, the algorithm maintains a notable driver set :
For a user following driver set (which may contain a single driver number or all driver numbers belonging to a followed constructor), the personalised verdict is:
Personalisation is strictly one-directional: a Highlights verdict may be upgraded to Watch, but a Watch verdict is never downgraded. The rationale is asymmetric: the cost of missing a race your favourite driver featured in is higher than the cost of watching an unremarkable race. An upgraded verdict is labelled for you in the interface to communicate that it reflects personal preference rather than general race quality.
6. Data Quality and Cancelled Race Detection
The OpenF1 session feed occasionally contains phantom sessions—test entries or sessions that were created administratively but never ran. Two independent filters are applied before a session is eligible for scoring:
- Jolpica calendar gate. Each session must match a round in the official Jolpica/Ergast calendar for the requested year. Matching uses a closest-date approach with an 8-day window; sessions outside this window are dropped.
- Lap-data check (current season). For every completed race of the current season, the scoring system verifies that at least 10 drivers have a recorded lap-1 entry. A cancelled session that still appears in the calendar (e.g., the 2026 Bahrain and Saudi Arabian rounds, called off for geopolitical reasons) has zero lap records and is therefore excluded. Historical seasons are deliberately not filtered: OpenF1 has genuine data gaps for races that did take place, and hiding them would be worse than showing them without a verdict.
All API responses are cached at the infrastructure layer: session lists for 2 minutes, telemetry for 1 hour, and driver grids for 1 hour with a 24-hour stale-while-revalidate window.
7. Limitations and Future Work
Several aspects of race excitement are not captured by the current scoring system:
- Championship context. A last-lap overtake between title contenders carries more significance than the same move between mid-field runners. The algorithm has no awareness of standings.
- Close battles without overtakes. Wheel-to-wheel racing in the final laps that does not result in a position change goes undetected.
- Grid-position signal quality. First-recorded position is used as a grid-position proxy. Drivers who start from the pit lane or are penalised before lap 1 may have an inaccurate starting reference, slightly over-reporting forward movement.
- Strategy interpretation. The pit-strategy signal rewards high stop counts but does not model undercut/overcut sequences or tyre-compound divergence, which require additional telemetry not currently in scope.
- Sprint sessions. The same algorithm is applied to sprint races, which are shorter and structurally different. No scoring adjustments are made for session length.
Future iterations may incorporate a continuous-overtake count (if made available through the OpenF1 API) and a proximity signal to address the close-battle limitation. Raw time-within-one-second is not a viable form of that signal—under the 2026 regulations cars run in close formation by default, so proximity alone detects trains rather than battles; it must be paired with a subsequent position change to count.
References
- OpenF1 Project. OpenF1 — Free and Open-Source F1 Data. openf1.org, 2024.
- Jolpica. Jolpica-F1 API — Ergast Compatibility Layer. api.jolpi.ca/ergast, 2024.
- Fédération Internationale de l'Automobile. 2025 Formula One Sporting Regulations. FIA, Geneva, 2025.