Nexus deep diveStep 2 · Validate and cleanCompanion to the case study
Raw data kept as delivered, every check result recorded, every fix reversible, and a series promoted only when it passes.
Bad data rarely announces itself. It shows up as a strategy that looks too good, or as a live book trading on a stale price. Nexus checks history in batch and the live feed as it arrives, and records what each check found. Every correction is a logged operation that can be reversed. Each control below is marked with what runs today, including the checks that have stopped running.
Read on 2026-10-15 from the validation, dataset, disposition and cleaning tables, and from the checks' own code. The dataset battery last ran on 23 September 2026.
The Nexus overview shows validation and cleaning as one picture. Here is each step: what Nexus does, and whether it runs today.
As delivered, tagged with its source
Every vendor bar lands tagged with its source and feed. A unique key allows one row per bar per source, so a duplicate cannot be stored. Hourly and daily bars are insert-only: a bar delivered again never overwrites the stored one. Each live broker bar is written once.
Minute bars from vendors accept a re-delivered bar in place. Some raw repairs have set corrupt zero or missing fields to empty in place.
25 checks per dataset, plus nightly futures checks
The dataset battery runs 25 checks and records one result per dataset per check: pass, warn, fail, skip or too little history. A failed bar-level check, such as an outlier or a duplicate, can send the dataset to quarantine. A failed series-level check, such as a flat range or a crushed adjustment, puts the whole series under review for a person to confirm. The rest only warn. Separately, 11 futures checks run every night on the front and next contract pairs and the contract symbols.
The battery last ran in full on 23 September 2026, across about 3,200 datasets. Putting it back on a schedule is the first open item. The nightly futures checks ran last night.
One logged operation per fix
Each fix is one operation in a log, with statistics before and after. A dropped bar moves to a quarantine table, from which it can be restored. The clean copy of a dataset is a pure function of its raw bars and its operation log, so it can be rebuilt from scratch at any time.
6,632 operations logged.
Clean only when the checks pass
A dataset moves from unclean to validating, then to cleaning, and then to clean, or else to quarantined. Today 6,432 datasets are clean, 45 are quarantined and 21,868 have not been through promotion.
Most datasets have not been promoted, so research does not require clean.
One data API for research and trading
Research and trading read through the data API. At the start of a research run, a series marked corrupt or misderived is dropped, with its reason recorded, and a run left with no series is refused. A stale series raises an alert and is noted on the run, which continues.
Reads return raw bars by default. The clean layer is read only when asked for.
Each check is aimed at a failure that has happened somewhere: a flat range from a stale feed, a timestamp shifted by an hour, a roll that looks like a crash, a currency quoted upside down. A failure quarantines the dataset or puts the series under review, as in step 2; advisory checks only warn.
| Family | What is checked | Rule |
|---|---|---|
| Bar integrity | High, low, open and close agree; flat ranges | Fails if more than 0.1 % of the last 1,000 daily bars break the high and low, or more than 20 % have a flat range. |
| Repeated prices | Runs of identical closes, the mark of a frozen feed | On daily bars, fails on five or more runs of at least five identical closes, or any run of 20. Rates and volatility, which can sit unchanged for days, only warn. |
| Gaps and timing | Gaps and duplicates, missing bars, bars outside trading hours, alignment, and timestamps shifted against peer markets | Gaps, duplicates and misalignment can quarantine a dataset, and a shift against peers puts the series under review. Missing and out-of-hours bars are recorded. |
| Outliers | Single prints far from their neighbours | Hampel filter (Hampel 1974). By default, a rolling median with a robust z of 5, over 7 bars either side for daily data and 30 for intraday, with a tighter, minute-specific noise floor on 1-minute bars. A deviation of 10 % in log terms is flagged for review, and above 18 % it fails and can be cleaned automatically. Daily equities and ETFs, whose real moves can reach 20 to 60 %, use a z of 8, with review at 25 % and failure at 50 %. Rates and volatility only warn. Difference-adjusted series are checked in price levels and only flagged for review. |
| Futures adjustment | The adjusted series against the raw contracts | Fails if the latest adjusted level does not anchor to the raw price, if adjustment crushes the size of price moves, or if the declared method does not suit the data. Warns on roll returns far beyond the market's own and on long-run drift from raw. |
| Peers and references | Correlation with its peer group; the sign against its nearest sibling; a short-rate future's implied rate against the published short rate; a future against its cash or rate reference; two vendors' constructions of the same market | Warns, for example, when a peer group's median correlation is at least 0.40 but the series' best peer is below 0.35. |
| Conventions and specs | Which way a price is quoted, measured not assumed; prices on the declared tick grid; volume against the series' peer group | Advisory. A wrong declaration is a reference-data fault, not a bad price, so it never quarantines a series. |
| Recency and revisions | Age of the latest bar; history changed after the fact | Warns after five trading days. A year whose bar count is unchanged but whose content hash has changed fails. |
| Nightly futures | Eight checks on front and next contract pairs; three on contract symbols for collisions, coverage and staleness | Runs Nightly, across 41 and 47 series. |
For your firmWhen a result looks too good, every bar behind it can be traced to the vendor's delivery, to the checks it passed or failed, and to every change made to it.
Cleaning never edits raw data. It writes an operation to a log and rebuilds the clean copy from raw plus the log. Removing an operation and rebuilding restores the data as it was.
Every operation recorded to date.
A judgement on a whole series, with its reason.
A series under review is flagged for a person to look at. It is not dropped.
A bar removed by cleaning is moved to a quarantine table with the operation that removed it. Undoing the operation puts the bar back.
When a continuous series picks up a bar from the wrong contract, the correction is its own operation, with the bars it touched, rather than a quiet edit.
The simulation stores each nightly forecast once. If the data under a stored forecast later changes, the nightly job refuses to overwrite it and fails, so the change is investigated instead of quietly absorbed. In October 2026 this caught a restatement of two soft-commodity series.
History can be checked at leisure, but a live price has to be judged before the book trades on it. These guards run on the live capture and on the series the live book reads.
Ticks are stamped on arrival and each bar is written once. A late tick is dropped and a gap is never filled with a made-up bar. Watchdogs reconnect a silent feed. The rules are set out in Capture.
Each weekday night, gaps of 30 minutes or more are fetched again from the broker. The minutes that should exist are learned from each market's own last four weeks, not assumed from a timetable.
Each morning, any hour that has minute bars but no hourly bar pages operations.
The series the live book reads refuses a first broker return of more than about 5 %. It reports a market stale after six refusals in a row, and it times the broker tail in open-market hours. The join is described in History meets live.
Open, closed and holiday status is recomputed every five minutes for 47 calendars, so a closed market is not mistaken for a dead feed.
The trader's console shows each market's data as fresh or stale by the age of its newest bar: up to 16 hours is fresh for exchange data and 48 hours is stale, while for the blended series the limits are 4 and 18 hours. Age alone misses thin data. One coffee series showed fresh for three months while it held about one bar a day instead of ten.
A backtest should see only what was known on the day. For prices that means bars that had closed. For reference data it means the version that had been published.
The freshness panel judges age alone, and the dataset battery has stalled. The planned panel covers every tradeable market in three tiers: downloaded history, the broker-blended series and the live stream. A single green, amber or red banner sits at the top of the trading screen.
Put the dataset battery and the store's coverage summary back on a schedule, and show that both run.
Density against each market's own baseline over the last 5 and 20 sessions, gaps and overdue bars by the market's calendar, bad bars, roll agreement, and how far the broker's returns stray from the exchange's after the handoff.
Tick age, quote delay, 1-second coverage, and crossed or zero spreads, rolled up into the banner on the trading screen.
StatusPlanned. The work is scoped and its design is under review. Nothing on this list runs yet.
A data-quality page that hides its own gaps would undercut its point. Each line here was checked against the database or the code on 15 October 2026.
Sources, read 2026-10-15: the validation results, dataset states, dispositions and cleaning operation log in the market-data store; the check registry and the cleaning, splice and capture code on the services' main branches; the data gate at the start of a research run; and the work board for the stalled and planned items.
I can put these checks around your data, or audit the series your strategy already depends on.