Every data source stops sometimes. A venue has an outage, a connection drops, a field comes back blank. A trading system that has no rule for that moment will make one up on the spot, and the made-up rule is usually to carry on as if nothing happened.

Three kinds of missing

Data can be missing in different ways and they call for different responses. The value can be absent: the source did not answer. It can be stale: the source answered with an old value. It can be present and untrustworthy: a quote so wide that its midpoint is meaningless. Absent is not empty and the difference between delayed and stale separate these in detail.

The dangerous cases are the quiet ones. A missing value announces itself. A stale value looks exactly like a fresh one unless it carries its age.

The bad defaults

Three defaults do most of the damage. Treating missing as zero turns an unread supply into a float that vanished. Carrying the last value forward draws a flat line across a period nobody measured. Filling the hole with a guess from a neighboring market invents a number. Each produces something that looks like data.

Small caps on a weekend are an example of the third. No liquid perp exists on the Russell 2000, so there is no weekend reading for IWM. Borrowing the S&P 500 perp’s move to fill that space would be making one up.

The rule to write

The rule is short. For each input the system depends on, state how old it may be and what happens if it is older or absent. The usual answer is to stand down: no new positions on that input until it returns. For positions already open, the rule should say whether to hold, reduce or close, and it should say so in advance.

Standing down is a decision, and it should be visible. A system that silently skips a check is running a different rule from the one on paper. Kill switches and fail-safes covers the automated version.

Checking age as well as presence

To apply the rule the system must know each reading’s age. That requires the source to publish it. A timestamp on every value, and a statement of whether the value was measured directly or passed along from somewhere else, turns the freshness question from a guess into a comparison.

It also requires the source to fail loudly. An empty result reads as nothing happening. An error reads as a failure to look. Those call for opposite responses, and a source that returns the first when it means the second defeats the rule.

When it comes back

Returning data deserves a moment of suspicion as well. The first reading after an outage may sit far from the last one before it. That jump is real movement that happened unobserved. A change computed across the gap should say that it spans a gap.

Where NoVo stands

On the MCP & API, every reading carries as_of, age_seconds and as_of_kind, which is measured, retrieved or unknown. A stopped feed answers with an error and a retry time, never an empty result. Dr. NoVo, a markets SI, says so when he does not have a reading. What a markets SI says when a feed stops covers his side of it.