Quant Memo
Core

Trade Condition Codes: Which Prints To Keep

Not every reported trade reflects a genuine, price-forming transaction — exchanges attach condition codes flagging late reports, corrections, and special-terms trades, and skipping them causes visible distortions in any analysis built on the raw tape.

Prerequisites: The NBBO And The Consolidated Tape

Pull a raw trade tape for a stock and it isn't just a clean list of prices where the market actually traded. It includes trades reported late from earlier in the day, corrections to earlier erroneous prints, trades executed away from the primary market with special settlement terms, and a handful of other categories that exchanges mark with a condition code attached to each print. Treating every row on the tape as an equally valid, real-time price observation is one of the most common data-quality mistakes in microstructure research.

The analogy: a corrected exam roster

Imagine a teacher posting exam scores as they're graded, then later discovering two scores were entered wrong and posting corrections, plus a few late submissions from students who were sick on exam day. If you print the roster at the end and just average every line you see — including the two now-superseded wrong scores and the late submissions dated as if they happened on exam day — your class average will be wrong twice over: some scores are stale duplicates, and some are timestamped in a way that misrepresents when they actually happened. Condition codes on a trade tape exist so a careful reader can tell which lines are the "final, correct, in-sequence" record and which are exceptions that need special handling.

The main categories of condition codes

  • Regular trades: the default, price-forming, in-sequence trades that belong in essentially any time-series or price analysis.
  • Late or out-of-sequence reports: trades that occurred earlier but were reported to the tape after a delay — including them at their reported timestamp, rather than their actual execution time, corrupts anything time-sensitive.
  • Corrections and cancellations: a code marking that a previous trade was erroneous and either cancelled outright or replaced with a corrected price; failing to net these out double-counts volume and can leave a phantom price spike in the data.
  • Odd-lot trades: trades below a standard round lot (traditionally under 100 shares), which in the US did not historically update the official last-sale price and behave differently in volume statistics.
  • Special-terms trades: trades with non-standard settlement, size, or pricing arrangements (for example, trades tied to a benchmark price rather than negotiated freely) that don't reflect where the continuous market was trading.

Worked example: how many trades survive filtering

A researcher pulls one trading day of tape for a mid-cap stock: 40,000 raw print records. Applying standard filtering — removing corrections and cancellations, out-of-sequence late reports, and non-standard settlement prints, following the same eligibility rules exchanges use to construct the official last-sale price — leaves 34,500 trades, a 14% reduction. Of the 5,500 removed, 3,200 were odd-lot prints (which many older studies exclude but modern research increasingly retains, since odd-lot trading now makes up a large and informative share of activity, especially from algorithmic order splitting), 1,600 were late reports, and 700 were corrections or special-terms trades. A volume-weighted average price computed on the unfiltered 40,000 rows differs from the price computed on the filtered 34,500 by several basis points — small, but exactly the kind of systematic bias that compounds across a large backtest.

Distribution · poisson
mean 4.0024681012outcomes (k) →
mean 4.00std dev 2.00peak at k = 3

Corrections and late reports don't arrive uniformly — they cluster around specific times, like the open, the close, and periods of high message-traffic congestion, in bursts more like the discrete counting-arrivals distribution above than a smooth drizzle across the day, which is why a filtering routine tested on a quiet sample can miss problems that only show up around the open or close.

What this means in practice

Any serious tick-by-tick analysis needs a documented filtering step before the tape is used for anything: define which condition codes are kept for price analysis, which for volume analysis (these can legitimately differ), and log what fraction of the raw tape gets dropped as a sanity check. Skipping this step doesn't usually produce an obviously broken result — it produces subtly wrong prices, phantom volume spikes, and misordered timestamps that quietly bias every downstream signal built on top of the tape.

Raw trade tape data includes late reports, corrections, cancellations, and special-terms trades marked by condition codes — filtering to the codes appropriate for your analysis (price versus volume) is a required data-cleaning step, not an optional refinement.

The common mistake is treating "more data" as strictly better and skipping condition-code filtering altogether. Unfiltered ticks include phantom price levels from corrected trades and mistimed prints from late reports — both of which can silently distort volatility, VWAP, and order-flow calculations without producing any obvious error message.

Related concepts

Practice in interviews

Further reading

  • CTA/UTP Plan, Consolidated Tape Data Feed Specification
ShareTwitterLinkedIn