The daily run and the lag rule

How old each number on the site is, which session it describes, and the checks a stage passes before its numbers are published.

The question

How old is each number on the site, and which data did it use? Every number belongs to one finished trading session, identified by its trade date. This page describes how a number is produced and which data it is allowed to use.

The method

The daily run

One run collects and computes all data. It starts at 00:15 UTC, Tuesday to Saturday, the evening of each session in New York (20:15 EDT, 19:15 EST). A retry starts at 00:30 New York time and overwrites the files with the same or newer data. Each run follows one weekday session. It stamps every file with the session date that the data vendor reports, never the clock time of the run. The run that starts at 00:15 UTC on Wednesday 21 October 2026 collects the Tuesday 20 October 2026 session, which closed the evening before. Its files have trade date 2026-10-20.

The stages

For each symbol the run fetches the option chain and its summaries, then computes in this order:

  1. The VIX-style index, the straddle and the volatility risk premium.
  2. The factor table, from the premium history.
  3. The forward curve.
  4. The vol surface.
  5. The distribution.
  6. The greeks.
  7. The Volatility Board row.

Steps 3 to 6 are the four statistical stages. The vol surface and the distribution use the forward curve, so the forward curve runs first. After every symbol is done, the run computes the cross-symbol correlations, then ingests the macro and Treasury series.

Self-heal

Before the daily poll, a scan assigns every symbol to one of three classes:

  • New: the symbol has no index history. The run backfills it in full.
  • Incomplete: the symbol has a gap in its raw data or in its index, straddle or premium history. The run fetches only the missing raw dates and recomputes those three histories.
  • Healthy: the symbol goes straight to the daily poll.

The heal step has its own cap on vendor calls per run.

The four statistical stages keep no history. Each stage writes one set of files per symbol from the newest raw data, and the next run overwrites them. Self-heal never recomputes them for a past session.

From file to page

Every API response includes the trade date of its numbers. The age of a value is measured from that trade date.

The browser keeps a copy of every response a widget uses. A widget reads that copy before it requests data from the server. The browser keeps each kind of data for a fixed time.

Data Copy kept for
Per-symbol data and the option cards 30 minutes
Cross-asset, correlations, macro, FRED, Volatility Board and dispatch 4 hours
The symbol list and each symbol's tenor list 12 hours
Saved dashboard layouts no limit

A page reload reads the kept copy and does not fetch newer numbers. Three events clear copies automatically:

  • The server announces new data. The copies for the endpoints it lists are cleared.
  • A version check runs when you return to the tab. It clears the copies the server has replaced.
  • A copy cleared in one tab is also cleared in the other open tabs of the site.

To clear every copy and fetch again, click the cache indicator in the top bar, then click Refresh.

Inputs and lag

ORATS supplies the end-of-day option chains, their daily summaries and the price history for the same symbols. FRED supplies the macro and rates series. The fiscal data service supplies Treasury auction and debt data.

Lag rule: every market feature is held back by at least one session before a model uses it. A model row for Tuesday 20 October 2026 uses features through Monday 19 October 2026, never Tuesday's own close.

A feature that contains the value it predicts makes a model appear accurate in testing and fail in use. This failure does not show in the output, so a look-ahead check enforces the lag rule for every feature.

How it was validated

Every computed stage has a written contract. The contract lists the columns, their types, the range of each value and the minimum row count. A contract also rejects a NaN, an infinite value or a zero in a column that forbids one.

After a statistical stage runs, the caller checks its output file against that contract. A line starting with ERROR: in the stage's own output also counts as a failure. Either failure marks the symbol incomplete in that run's tally. The flagged file remains until the next run writes the next session, and the failed session is never computed again.

The vol surface passes a second set of quality gates. A surface that fails a hard gate is not written, and the previous surface remains published. Each file is replaced whole, so a widget never loads a half-written file.

A health scan then checks every symbol's files for gaps between sessions and for data older than the schedule allows. It also flags a symbol whose data is older than that of the other symbols.

Limits

The site has no intraday view. The option data arrives at the end of the day, so every number describes the last finished session.

After a missed run, a symbol keeps its previous trade date. Two symbols on one page then show different dates. Each widget shows each symbol's own trade date.

The contract check reads a file that the stage has already written. Only the vol surface withholds a failed result. When the forward curve fails, the vol surface and the distribution still run, using the curve file on disk.

A symbol shows no number when its file never arrived or its surface was withheld. No stage writes a zero in place of a missing file. Inside a file, some missing inputs are stored as 0; the surface and the greeks lists them.

An absent value displays as a dash in a Volatility Board or Macro Board row. The Stats Panel, Dist Stats Panel and Greek Stats Panel also display a dash. A tile value row and a chart tooltip display N/A, and a Sheet cell displays #N/A. The Cross Asset widget sorts, plots and displays a missing value as 0.