Wat zijn trade condition codes voor aandelen
Begrijp waarom handelsplatformen verschillende dagkoersen tonen. Trade condition codes bepalen of een transactie meetelt voor de high, low, slotkoers en het totale volume.
Trade condition codes zijn de reden waarom drie platforms drie verschillende dagkoersen (highs) voor hetzelfde aandeel kunnen tonen, zonder dat een van hen ongelijk heeft. Elke print op de consolidated tape bevat deze labels; zij bepalen of een print de last price, de high en low van de dag, de officiële opening, de officiële slotkoers en het totale consolidated volume mag bijwerken. Een trade kan een legitieme uitvoering tegen een legitieme prijs zijn en toch worden uitgesloten van bijna al deze velden.
Wat zijn trade condition codes?
Een trade condition code, ook wel een sale condition genoemd, is een label dat de rapportageplaats toevoegt aan een trade report voordat dit op de tape verschijnt. Prijs en omvang geven aan wat er is verhandeld. De conditie geeft aan om wat voor soort rapportage het gaat: of deze op tijd was, of de prijs was berekend op basis van andere uitvoeringen in plaats van op dat moment overeengekomen, of de trade buiten de reguliere uren plaatsvond, of dat het om minder dan de honderd aandelen van een round lot ging.
Aan elke code is een reeks geschiktheidsvlaggen (eligibility flags) gekoppeld, en dat is het onderdeel dat bijna niemand ziet. Elke code is gemarkeerd als wel of niet geschikt voor de last price, de high en low, de opening, de slotkoers en het consolidated volume. Die vlaggen bewegen onafhankelijk van elkaar. Veel prints die de high of de low niet mogen beïnvloeden, tellen wel mee voor het volume. Daarom zijn het gerapporteerde aantal aandelen en de gerapporteerde prijsextremen van een aandeel opgebouwd uit overlappende, maar verschillende sets trades. Een tweede set vlaggen loopt parallel aan de eerste: de ene set beheert de consolidated tape, de andere beheert het individuele marktcentrum, aangezien de officiële slotkoers van een beurs alleen wordt berekend op basis van haar eigen prints.
Condition codes komen voor in families, en slechts één familie bepaalt wat een trade mag bijwerken.
De exacte SQL achter elk getal
SELECT
replaceAll(type, '_', ' ') AS condition_family,
countDistinct(id) AS codes
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
GROUP BY condition_family
ORDER BY codes DESCHet aandelenwoordenboek bevat 8 families. De grootste is de sale condition-familie, met 40 verschillende codes. Quote conditions beschrijven de bid en de offer in plaats van een trade. De indicatorfamilies markeren statussen zoals een short sale restriction die van kracht is. De sale condition-familie is de familie die de geschiktheidsvlaggen draagt, en het is de familie waaruit elk cijfer hieronder is getrokken.
Wat staat er daadwerkelijk op de tape
Het onderstaande paneel toont één vastgelegde sessie uit juni 2026: elke AAPL-print vanaf de opening van de premarket om 04:00 uur tot het einde van de post-market handel om 20:00 uur, gegroepeerd per sale condition die elke print droeg. Het venster is vastgelegd in de SQL, dus deze cijfers beschrijven die dag en geen andere. Een print kan meerdere codes tegelijk dragen en vele dragen er helemaal geen, wat de reden is dat de kolommen niet optellen tot honderd.
De exacte SQL achter elk getal
WITH
(SELECT count()
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')) AS day_prints,
(SELECT sum(size)
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')) AS day_shares
SELECT
multiIf(t.code = -1, 'Regular way (no code)',
c.code_name = '', concat('Unmapped code ', toString(t.code)),
c.code_name) AS condition_name,
round(100 * count() / day_prints, 2) AS pct_of_prints,
round(100 * sum(t.size) / day_shares, 2) AS pct_of_shares
FROM
(
SELECT
size,
arrayJoin(if(empty(conditions),
[toInt32(-1)],
arrayMap(x -> toInt32(x), conditions))) AS code
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')
) AS t
LEFT JOIN
(
SELECT toInt32(id) AS code_id, any(name) AS code_name
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
AND type = 'sale_condition'
GROUP BY code_id
) AS c ON c.code_id = t.code
GROUP BY condition_name
ORDER BY pct_of_prints DESC
LIMIT 12Het meest voorkomende label op die dag was Odd Lot Trade, op 65.83% van de prints van de sessie en 6.37% van de aandelen. Lees de twee kolommen rij voor rij tegen elkaar af. Waar het aandeel van de prints het aandeel in het volume overstijgt, markeert de code kleine uitvoeringen. Waar het andersom is, markeert de code een handvol zeer grote transacties. Het tellen van prints en het tellen van aandelen beantwoordt verschillende vragen, en de condition code is wat ze scheidt.
Waarom tonen twee platforms verschillende dagkoersen?
Vier soorten prints worden elk uitgesloten van een andere subset van velden.
- Te laat gerapporteerd en buiten volgorde. Een trade die om 10:14 uur werd overeengekomen en om 10:31 uur werd gerapporteerd, bereikt de tape met het label 'out of sequence', of geprijsd op basis van een eerdere referentie. Het telt mee voor het volume. Het kan de last price niet bepalen en het kan de high van de dag niet verhogen, zelfs niet als de prijs boven elke andere trade van de sessie ligt. Onderhandelde block trades en prints die via een trade reporting facility van dark pool trading-locaties komen, belanden hier vaak.
- Afgeleid geprijsd. Een trade tegen een gemiddelde prijs of een VWAP-fill heeft een prijs die is berekend op basis van vele andere uitvoeringen in plaats van op dat moment overeengekomen. Deze wordt buiten de last price en de extremen gehouden, aangezien de prijs die het toont nooit als een live quote heeft bestaan.
- Odd lot. Minder dan honderd aandelen. Odd lots komen niet in aanmerking voor de last price en voor de high en low, terwijl ze wel volledig meetellen in het consolidated volume. Ze werden tot eind 2013 helemaal niet gerapporteerd aan de consolidated tape. Elke volumevergelijking die verder teruggaat dan die grens, vergelijkt twee verschillende definities van het woord, wat onze gids over average daily volume in detail behandelt.
- Extended hours en form T. Prints van vóór de opening en na sluitingstijd worden gelabeld en buiten de opening, high, low en slotkoers van de reguliere sessie gehouden, terwijl ze wel meetellen in het consolidated volume. Een platform dat deze in kaart brengt, toont een ander dagbereik dan een platform dat dat niet doet, en dat is het mechanisme achter after-hours and premarket trading dat op de ene grafiek wel en op de andere niet verschijnt.
Hier is welk deel van een sessie elke categorie beslaat voor vijf bekende namen, op dezelfde vastgelegde dag.
De exacte SQL achter elk getal
WITH
(SELECT groupArray(toInt32(id))
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
AND type = 'sale_condition'
AND name ILIKE '%odd lot%') AS odd_lot_codes,
(SELECT groupArray(toInt32(id))
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
AND type = 'sale_condition'
AND multiSearchAnyCaseInsensitive(name,
['form t', 'extended trading hours'])) AS extended_codes,
(SELECT groupArray(toInt32(id))
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
AND type = 'sale_condition'
AND multiSearchAnyCaseInsensitive(name,
['out of sequence', 'prior reference', 'derivatively priced',
'average price', 'price variation', 'seller'])
AND NOT multiSearchAnyCaseInsensitive(name,
['form t', 'extended trading hours'])) AS late_or_derived_codes
SELECT
ticker,
round(100 * countIf(hasAny(conditions, odd_lot_codes)) / count(), 2) AS odd_lot_pct,
round(100 * countIf(hasAny(conditions, late_or_derived_codes)) / count(), 2) AS late_or_derived_pct,
round(100 * countIf(hasAny(conditions, extended_codes)) / count(), 2) AS extended_hours_pct
FROM global_markets.stocks_trades
WHERE ticker IN ('AAPL', 'KO', 'MSFT', 'NVDA', 'SPY')
AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')
GROUP BY ticker
ORDER BY odd_lot_pct DESCOdd lot-prints varieerden van 46.8% tot 85.14% van alle prints voor de vijf namen. Die kolom volgt de aandelenprijs nauwgezet, aangezien een order met een vast dollarbedrag minder aandelen koopt bij een naam met een hogere prijs. NVDA voerde de lijst aan, met 2.4% van de prints gelabeld als 'late' of 'derivatively priced' en 3.53% gelabeld als 'extended hours'. Elke print in alle drie de categorieën is een echte trade tegen een echte prijs, en elk ervan is uitgesloten van het bepalen van de high en de low.
Een print die de high niet verhoogt
Het volgende paneel neemt dezelfde vastgelegde AAPL-sessie, verdeelt het reguliere venster van 09:30 tot 16:00 uur in blokken van vijftien minuten en tekent twee highs voor elk blok. De ene lijn neemt de hoogste prijs van elke willekeurige print. De andere neemt de hoogste prijs onder prints waarvan de condities hen in staat stellen de high te bepalen.
De exacte SQL achter elk getal
WITH
(SELECT groupArray(toInt32(id))
FROM global_markets.stocks_condition_codes
WHERE asset_class = 'stocks'
AND type = 'sale_condition'
AND multiSearchAnyCaseInsensitive(name,
['odd lot', 'form t', 'extended trading hours', 'out of sequence',
'prior reference', 'derivatively priced', 'average price',
'price variation', 'seller'])) AS not_high_low_codes
SELECT
formatDateTime(toStartOfFifteenMinutes(toTimeZone(sip_timestamp, 'America/New_York')), '%H:%i') AS et_time,
round(toFloat64(max(price)), 2) AS tape_high,
round(toFloat64(maxIf(price, NOT hasAny(conditions, not_high_low_codes))), 2) AS eligible_high
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
AND sip_timestamp >= toDateTime('2026-06-17 08:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-18 00:00:00', 'UTC')
AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
+ toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) >= 570
AND (toHour(toTimeZone(sip_timestamp, 'America/New_York')) * 60
+ toMinute(toTimeZone(sip_timestamp, 'America/New_York'))) < 960
GROUP BY et_time
HAVING countIf(NOT hasAny(conditions, not_high_low_codes)) > 0
ORDER BY et_timeDe sessie opent om 09:30 met een tape-high van $302.07 tegenover een 'eligible' high van $302.07, en loopt 26 blokken door tot de sluiting. De 'eligible'-lijn kan nooit boven de tape-lijn liggen, aangezien 'eligible' prints een subset zijn van alle prints. Waar de twee op elkaar liggen, mocht elke print in dat kwartier de high bepalen. Waar de bovenste lijn afwijkt, handelde ten minste één print in dat venster boven de hoogste 'eligible' prijs, en geen enkele grafiek die is gebouwd volgens de geschiktheidsregels zal dit ooit tonen.
Dat gat is het eerlijke antwoord op de discrepantie. Een bron die de maximumprijs van elke print neemt, rapporteert de ene high. Een bron die de geschiktheidsvlaggen toepast, rapporteert een andere. Een bron die ook de premarket- en post-close-sessies weglaat, rapporteert een derde. Alle drie lezen ze dezelfde tape.
Hoe solide is de geschiktheidslaag?
Dun. De vlaggen zijn referentiedata, en referentiedata wordt gecorrigeerd. Eén commerciële aanbieder van marktdata verstuurde een correctie naar zijn eigen conditiewoordenboek die de geschiktheid van één sale condition om de officiële opening en de officiële slotkoers te bepalen, herclassificeerde. Er veranderde geen enkele trade. De tape voor elke getroffen dag was identiek vóór en na de correctie. Wat veranderde was één vlag in een opzoektabel, en daarmee de officiële opening en slotkoers die elke grafiek en backtest stroomafwaarts van dat woordenboek had getoond.
Beschouw de OHLC van een enkele leverancier als één lezing van de tape in plaats van als een feit daarover. Wanneer twee bronnen het oneens zijn, vraag dan welke geschiktheidsregels elk van hen heeft toegepast. Delayed and consolidated quote feeds stapelen een tweede versie van hetzelfde probleem erbovenop, op basis van timing in plaats van geschiktheid.
Waar de officiële lijst met trade condition codes zich bevindt
De tapes draaien onder twee nationale marktsysteemplannen, het CTA Plan voor aan de NYSE genoteerde effecten en het UTP Plan voor aan de Nasdaq genoteerde effecten, en elk publiceert de sale condition-specificatie voor de tape die het beheert. Die specificaties zijn de autoriteit. Alles stroomafwaarts, inclusief de ID-nummers achter de bovenstaande panelen, is de mapping van een leverancier naar zijn eigen nummering, en een code-ID van de ene aanbieder betekent niet noodzakelijkerwijs hetzelfde bij een andere. Leer de categorieën in plaats van de nummers. De categorieën zijn al jaren stabiel. De nummers zijn een opzoektabel, en opzoektabellen worden bewerkt.
Data-opmerkingen
De conditie-categorieën in de bovenstaande panelen zijn opgebouwd uit het woordenboek zelf in plaats van uit hardgecodeerde ID-nummers. Elke categorie is een naamovereenkomst binnen de sale condition-familie (odd lot, form T en extended trading hours, out of sequence, prior reference price, derivatively priced, average price, price variation, seller). Open de SQL onder een paneel om de exacte patronen te lezen. Codes sluiten elkaar niet uit en een enkele print kan er meerdere dragen, dus de percentages van de categorieën overlappen en tellen niet op tot de sessie. Zowel de AAPL-panelen als het paneel met vijf namen beslaan één vastgelegde sessie in juni 2026, vastgelegd in de SQL, dus niets op deze pagina beweegt naarmate er nieuwe sessies komen.
Veelgestelde vragen
Wat is een trade condition code?
Het is een label dat aan een trade report op de consolidated tape is bevestigd en beschrijft om wat voor soort rapportage het gaat, bijvoorbeeld te laat gerapporteerd, afgeleid geprijsd, odd lot of extended hours. Elke code bevat vlaggen die aangeven of die trade de last price, de high en low, de opening, de slotkoers en het consolidated volume mag bijwerken.
Waarom tonen twee websites verschillende dagkoersen voor hetzelfde aandeel?
Elke website past een andere set geschiktheidsregels toe op dezelfde prints. De een neemt wellicht de hoogste prijs van elke gerapporteerde trade, de ander sluit prints uit waarvan de condition codes hen beletten de high te bepalen, en een derde laat wellicht ook de premarket- en post-close-sessies weg. Ze lezen allemaal dezelfde tape.
Tellen odd lot-trades mee voor het volume?
Ja. Een odd lot, wat betekent minder dan honderd aandelen, telt mee in het consolidated volume terwijl het niet in aanmerking komt om de last price of de high en low van de dag te bepalen. Odd lots werden vóór eind 2013 helemaal niet gerapporteerd aan de consolidated tape, dus langetermijn-volumevergelijkingen kruisen op dat punt een definitiewijziging.
Tellen trades buiten de reguliere uren mee in de high en low van de dag?
Niet in de high en low van de reguliere sessie. Prints van vóór de opening en na sluitingstijd dragen een 'extended hours'- of 'form T'-conditie die hen buiten de opening, high, low en slotkoers van de reguliere sessie houdt, terwijl ze wel meetellen in het consolidated volume van de dag.
Waar is de officiële lijst met sale condition codes?
Het CTA Plan en het UTP Plan publiceren de sale condition-specificaties voor de tapes die zij beheren, en die documenten zijn de autoriteit. Feeds van leveranciers hernummeren de condities naar hun eigen ID-ruimte, dus een numerieke code van de ene aanbieder komt niet noodzakelijkerwijs overeen met hetzelfde nummer bij een andere.
Elk paneel hier wordt geleverd met de SQL die het heeft geproduceerd. Open er een, wissel de ticker of de datum om en voer dezelfde conditie-analyse uit voor elke sessie op de Strasmore-terminal.