DRAFT — rules take effect Nov 4, 2026

Method: how Rolling Loop forecasts are made, logged and scored

Draft. These rules take effect with the first published forecast on Wednesday, November 4, 2026, and will not be changed retroactively. Any future change applies only to forecasts made after the change is announced here, with its date.

Rolling Loop publishes forecasts before the outcome is known, keeps every one of them, and scores them in public. This page sets out the rules in advance so that nobody, including us, can move the goalposts later.

1. What we forecast

2. The slate is announced first

Every Monday, before any forecast is published, we post the list of films we will forecast that week. A film on the slate gets a forecast, whatever we expect it to do. We cannot quietly skip a film we feel unsure about.

3. When forecasts lock

We may also log earlier forecasts, 28 and 14 days before opening. They are scored the same way and shown separately; the headline scoreboard uses only the Wednesday forecast.

4. What a forecast contains

A forecast is a probability statement, not a promise. A single miss outside the range is expected about 2 times in 10. A pattern of misses is what matters, and the scoreboard shows the pattern.

For yes/no questions, such as whether a film will be nominated for an award, a forecast is a single probability instead of a range.

5. The forecast log is append-only

6. What we score against

7. How we score

For each forecast:

Across the season, the scoreboard shows:

Every forecast is scored, including the misses. We do not remove or hide forecasts that went badly.

8. Data sources

We do not use scraped data from sites that do not permit it.

9. Conflicts of interest

10. File formats

The public log uses two CSV files.

forecasts.csv (one row per forecast; append-only)

columnmeaning
forecast_idunique id, e.g. opening_weekend-2026-11-06-<tmdb_id>-h2-ow_v0_comps
created_utcwhen the forecast was logged (ISO 8601, UTC)
model_versione.g. ow_v0_comps
targetopening_weekend, or a yes/no target such as oscar_bp_nom
tmdb_idTMDB film id
titlefilm title
event_datethe date the outcome happens (Friday of the weekend, or the announcement date)
horizon_daysdays between created_utc and event_date
p10, p50, p90US dollars, for dollar targets only; empty otherwise
probprobability from 0 to 1, for yes/no targets only; empty otherwise
statusactive, or withdrawn
supersedesid of the row this corrects, or empty
inputsshort JSON of the model's main inputs
noteshort reason for a correction or withdrawal, or empty

scores.csv (one row per scored forecast)

columnmeaning
forecast_idmatches forecasts.csv
actual_usdMonday studio-reported weekend gross
outcome1 or 0 for yes/no targets; empty otherwise
actual_sourcewhere the actual came from
actual_logged_utcwhen we recorded the actual
p50_error_pct(P50 − actual) ÷ actual × 100
in_rangetrue if P10 ≤ actual ≤ P90
brier(prob − outcome)², for yes/no targets; empty otherwise
scored_utcwhen the score was written