Our forecasts are produced by a batch scan that runs on a schedule, not on the moment you load the page. Several tiles across the site tell you the state of that batch — how many tickers it covered, when it last ran, and whether it is considered current. Knowing what each one really checks is the difference between trusting a number and trusting a stale number.
A single forecast is expensive. Producing one means simulating a very large number of possible price paths for a stock, then re-running a truncated version of the whole exercise to score how the model would have done — see model quality. Doing that for every stock in the universe, on every page load, for every visitor, would be absurd.
So we do it once, in a scheduled batch scan, and serve the stored result. Everything you see on the movers tables, the sector aggregates and the ticker pages is read out of that stored scan. This is the right design, and it has one honest consequence: the numbers have an age, and you should know what it is.
Prices themselves are not the issue here — a forecast made on yesterday's close is not invalidated by this morning's tick. What matters is whether the scan has run recently enough that the model has seen the information you have. A scan that predates an earnings report is a scan that does not know about the earnings report.
"Universe scanned" is the number of tickers that came back from the last scan with a usable forecast at the horizon you have selected. It is not a fixed number, and it is not the size of the index. It moves — with the horizon, and with how many tickers happened to produce a valid curve that run. A ticker with a broken price history simply is not in the count.
"Generated" is the timestamp of the scan whose results you are reading. This is the tile that actually answers "how old is this?" — and on the movers page it is the one to trust.
"Cache status" on the movers page reads Fresh or Stale, and here is the part we would rather tell you plainly than have you discover: it is not an age check. It reports Stale when the scan returned no usable rows at all for the selected horizon, and Fresh whenever it returned at least one. A scan from three weeks ago that produced results will display "Fresh." The tile is really answering "do I have data?", not "is my data recent?". Read "Generated" for recency.
"Data freshness" on the market conditions page is the stricter one, and it does mean what you think: it compares the timestamp of the market-conditions snapshot against the clock and reports Stale once the snapshot is more than 24 hours old. The sub-label spells out the age in words — "as of 2 hours ago", "as of 3 days ago" — so you never have to do the arithmetic.
Example (illustrative — invented values chosen to show how the tiles interact, not a live reading). The movers page shows: Universe scanned 482, Generated "yesterday 02:14 UTC", Cache status "Fresh." That is the healthy case — a recent scan, broad coverage, data present.
Now suppose it shows: Universe scanned 486, Generated "9 days ago", Cache status "Fresh." Everything about that display looks reassuring and it is not. The scan ran, so the tile says Fresh; the scan ran nine days ago, so every forecast on the page predates over a week of market action, including possibly an earnings report. The only tile telling you the truth is "Generated," and it is the quiet one.
The habit worth building: on any scan-backed surface, read the timestamp first and the status word second. A status word is a summary someone else wrote. A timestamp is a fact.
The two "Fresh" labels are not the same test, as above. That inconsistency is a genuine wart in the product, and documenting it honestly is better than letting you assume a uniformity that does not exist. If you take one thing from this page: on movers, "Fresh" means "non-empty."
A large "Universe scanned" is not a quality signal. It says many tickers produced a number, not that the numbers are good. Coverage and accuracy are different axes, and a scan can be complete and wrong.
The market-conditions freshness check compares timestamps against your own device's clock. If your machine's clock is badly wrong, the freshness label will be wrong with it. This is rare and worth knowing.
And freshness says nothing at all about whether a forecast is any good. A scan produced ten minutes ago can be confidently mistaken, and an older scan can be perfectly sound. Recency is a necessary condition for trusting a number, never a sufficient one — for whether to trust the number itself, read our calibration and track record.
The number of tickers that produced a usable forecast at the selected horizon in the last batch scan. It is not the size of the index and it is not fixed — it changes with the horizon and with how many tickers returned a valid curve.
On the movers page, no. That tile reports Stale only when the scan returned no usable rows at all, and Fresh whenever it returned at least one — regardless of age. Read the "Generated" timestamp to find out how old the data actually is.
When it is more than 24 hours old. Unlike the movers cache tile, the market-conditions "Data freshness" indicator is a genuine age check, and its sub-label states the age in plain words.
Because each forecast requires simulating a large number of price paths plus a walk-forward re-run to score the model. Doing that per visitor per page load is not feasible, so the work happens once in a scheduled batch scan and the stored result is served.
Browse all S&P 500 tickers to see this metric applied to individual companies.
Educational research only — not investment advice.