Trade Condition Code কী এবং কেন গুরুত্বপূর্ণ
একই স্টকের high, low, close ও volume কেন প্ল্যাটফর্মভেদে বদলায় তা জানুন। Trade condition code-এর উদাহরণ ও কোন print গণনায় আসে, তা বুঝুন।
Trade condition code-এর কারণেই একই স্টকের দৈনিক সর্বোচ্চ দামের জন্য তিনটি প্ল্যাটফর্মে তিনটি ভিন্ন সংখ্যা দেখা যেতে পারে, অথচ কোনোটিই ভুল নয়। Consolidated tape-এ প্রকাশিত প্রতিটি print-এর সঙ্গে এই tag থাকে। এগুলো নির্ধারণ করে কোনো print last price, দিনের high ও low, official open, official close এবং consolidated volume total আপডেট করতে পারবে কি না। কোনো trade প্রকৃত execution এবং প্রকৃত দামে সম্পন্ন হলেও এসব ক্ষেত্রের প্রায় সবকটিতে সেটি অযোগ্য হতে পারে।
Trade condition code কী?
Trade condition code, যাকে sale condition-ও বলা হয়, হলো এমন একটি tag যা reporting venue tape-এ পাঠানোর পথে trade report-এর সঙ্গে যুক্ত করে। Price এবং size বলে কী trade হয়েছে। Condition বলে report-টি কোন ধরনের: এটি সময়মতো এসেছে কি না, এর price ওই মুহূর্তে সম্মত হওয়া price নাকি অন্য execution থেকে গণনা করা, regular hours-এর বাইরে trade হয়েছে কি না, অথবা এতে round lot-এর 100 shares-এর কম ছিল কি না।
প্রতিটি code-এর সঙ্গে eligibility flag-এর একটি সেট যুক্ত থাকে। এই অংশটিই প্রায় কেউ দেখতে পান না। প্রতিটি code last price, high ও low, open, close এবং consolidated volume-এর জন্য eligible বা ineligible হিসেবে চিহ্নিত থাকে। এই flag-গুলো একে অন্যের থেকে স্বাধীনভাবে কাজ করে। এমন অনেক print আছে যেগুলো high বা low স্পর্শ করতে পারে না, কিন্তু volume-এ গণনা হয়। তাই কোনো স্টকের reported share count এবং reported price extremes গঠিত হয় আংশিকভাবে ওভারল্যাপ করা, কিন্তু আলাদা trade-সমষ্টি থেকে। এর পাশাপাশি আরেক সেট flag থাকে। এক সেট consolidated tape নিয়ন্ত্রণ করে, অন্য সেট individual market center নিয়ন্ত্রণ করে। কারণ কোনো exchange-এর নিজস্ব official close কেবল তার নিজস্ব print থেকে গণনা করা হয়।
Condition code বিভিন্ন family-তে বিভক্ত। এর মধ্যে একটি family-ই নির্ধারণ করে কোনো trade কী আপডেট করতে পারবে।
প্রতিটি সংখ্যার পেছনের সঠিক SQL
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 DESCStocks dictionary-তে 8টি family রয়েছে। সবচেয়ে বড় হলো sale condition family, যেখানে 40টি আলাদা code আছে। Quote condition trade নয়, bid ও offer-এর বর্ণনা দেয়। Indicator family এমন অবস্থা চিহ্নিত করে, যেমন short sale restriction কার্যকর থাকা। Sale condition family-তেই eligibility flag থাকে। নিচের প্রতিটি সংখ্যা এই family থেকেই নেওয়া হয়েছে।
Tape-এ প্রকৃতপক্ষে কী থাকে
নিচের panel-এ June 2026-এর একটি নির্দিষ্ট session নেওয়া হয়েছে। এতে 4:00 a.m. premarket open থেকে 8:00 p.m. post-market trading শেষ হওয়া পর্যন্ত প্রতিটি AAPL print-কে তার বহন করা sale condition অনুযায়ী group করা হয়েছে। SQL-এ window নির্দিষ্ট করে দেওয়া আছে। তাই এই figures কেবল ওই দিনটির জন্য প্রযোজ্য। একটি print একসঙ্গে একাধিক code বহন করতে পারে, আবার অনেক print-এর কোনো code-ই নাও থাকতে পারে। এই কারণেই column-গুলোর যোগফল 100 হয় না।
প্রতিটি সংখ্যার পেছনের সঠিক SQL
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 12ওই দিনের সবচেয়ে সাধারণ tag ছিল Odd Lot Trade। এটি session-এর 65.83% print এবং 6.37% share-এ দেখা গেছে। প্রতিটি row-তে দুইটি column পাশাপাশি পড়ুন। কোনো code-এ print-এর share যদি volume-এর share-এর তুলনায় অনেক বেশি হয়, তাহলে সেটি ছোট execution চিহ্নিত করে। বিপরীতে, volume-এর share বেশি হলে code-টি অল্প কয়েকটি বড় execution চিহ্নিত করে। Print গোনা এবং share গোনা ভিন্ন প্রশ্নের উত্তর দেয়। Condition code এই দুইটিকে আলাদা করে।
দুটি প্ল্যাটফর্মে ভিন্ন daily high দেখা যায় কেন?
চার ধরনের print বিভিন্ন field-এর আলাদা subset থেকে বাদ পড়ে।
- Late reported এবং out of sequence। 10:14-এ সম্মত হওয়া কোনো trade 10:31-এ report হলে tape-এ সেটি out of sequence অথবা prior reference অনুযায়ী priced হিসেবে tag পায়। এটি volume-এ গণনা হয়। কিন্তু last price নির্ধারণ করতে পারে না। এমনকি এর price session-এর অন্য সব trade-এর চেয়ে বেশি হলেও এটি দিনের high বাড়াতে পারে না। Negotiated block trade এবং dark pool trading venue থেকে trade reporting facility-এর মাধ্যমে পাঠানো print প্রায়ই এই শ্রেণিতে পড়ে।
- Derivatively priced। Average price trade বা VWAP fill-এ এমন price থাকে যা ওই মুহূর্তে সম্মত হওয়া নয়, বরং বহু execution থেকে গণনা করা। তাই এটি last price এবং extremes থেকে বাদ থাকে। কারণ দেখানো price-টি live quote হিসেবে কখনও বিদ্যমান ছিল না।
- Odd lot। 100 shares-এর কম। Odd lot last price এবং high ও low নির্ধারণের জন্য ineligible, কিন্তু consolidated volume-এ পুরোপুরি গণনা হয়। 2013 সালের শেষ দিক পর্যন্ত এগুলো consolidated tape-এ একেবারেই report করা হতো না। সেই সীমার আগের সময় পর্যন্ত কোনো volume comparison করলে একই শব্দের দুটি ভিন্ন সংজ্ঞা তুলনা করা হয়। আমাদের average daily volume guide-এ বিষয়টি বিস্তারিত রয়েছে।
- Extended hours এবং form T। Premarket এবং post-close print-এ এমন tag থাকে যার কারণে এগুলো regular session-এর open, high, low এবং close থেকে বাদ পড়ে। তবে consolidated volume-এ এগুলো গণনা হয়। যে platform এগুলো chart-এ দেখায়, তার daily range এমন platform-এর চেয়ে আলাদা হবে যে এগুলো দেখায় না। after-hours and premarket trading এক chart-এ দেখা যাওয়া এবং অন্য chart-এ না থাকার পেছনে এটাই কারণ।
একই নির্দিষ্ট দিনে পাঁচটি বহুল পরিচিত নামের ক্ষেত্রে প্রতিটি bucket session-এর কতটা অংশ তৈরি করেছে, তা নিচে দেখানো হয়েছে।
প্রতিটি সংখ্যার পেছনের সঠিক SQL
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 DESCপাঁচটি নামের মোট print-এর মধ্যে odd lot print-এর হার 46.8% থেকে 85.14%-এর মধ্যে ছিল। এই column share price-এর সঙ্গে ঘনিষ্ঠভাবে সম্পর্কিত। কারণ একই dollar order বেশি দামের নামের ক্ষেত্রে কম shares কেনে। NVDA ছিল শীর্ষে। এর 2.4% print late বা derivatively priced হিসেবে tag করা হয়েছিল এবং 3.53% print extended hours হিসেবে tag করা হয়েছিল। তিনটি bucket-এর প্রতিটি print প্রকৃত trade এবং প্রকৃত price-এ সম্পন্ন হয়েছে। তবু প্রতিটিই high ও low নির্ধারণের ক্ষেত্রে অযোগ্য।
যে print high বাড়ায় না
পরের panel-এ একই নির্দিষ্ট AAPL session নেওয়া হয়েছে। Regular 9:30 a.m. থেকে 4:00 p.m. window-কে 15 মিনিটের bucket-এ ভাগ করে প্রতিটি bucket-এর জন্য দুটি high দেখানো হয়েছে। একটি line সব print-এর মধ্যে সর্বোচ্চ price নেয়। অন্যটি কেবল সেই print-গুলোর মধ্যে সর্বোচ্চ price নেয়, যেগুলোর condition অনুযায়ী high নির্ধারণের যোগ্যতা আছে।
প্রতিটি সংখ্যার পেছনের সঠিক SQL
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_timeSession শুরু হয় 09:30-এ। তখন tape high ছিল $302.07, আর eligible high ছিল $302.07। Close পর্যন্ত মোট 26টি bucket রয়েছে। Eligible line কখনও tape line-এর ওপরে থাকতে পারে না, কারণ eligible print হলো সব print-এর একটি subset। দুই line যখন একটির ওপর আরেকটি থাকে, তখন ওই 15 মিনিটে প্রতিটি print high নির্ধারণের অনুমোদন পেয়েছিল। Upper line যখন দূরে সরে যায়, তখন ওই window-তে অন্তত একটি print সর্বোচ্চ eligible price-এর চেয়ে বেশি দামে trade করেছে। Eligibility rule মেনে তৈরি কোনো chart-এ সেই price কখনও দেখা যাবে না।
এই gap-ই পার্থক্যের প্রকৃত ব্যাখ্যা। যে source প্রতিটি print-এর সর্বোচ্চ price নেয়, সেটি একটি high report করে। যে source eligibility flag প্রয়োগ করে, সেটি অন্য high report করে। যে source premarket এবং post-close session-ও বাদ দেয়, সেটি তৃতীয় high report করে। তিনটিই একই tape পড়ছে।
Eligibility layer কতটা নির্ভরযোগ্য?
খুব বেশি নয়। Flag হলো reference data, আর reference data সংশোধন করা হয়। একটি commercial market data provider তার নিজস্ব condition dictionary-তে সংশোধন পাঠিয়ে একটি sale condition-এর official open এবং official close নির্ধারণের eligibility পুনঃশ্রেণিবদ্ধ করেছিল। কোনো trade পরিবর্তন হয়নি। সংশোধনের আগে এবং পরে প্রভাবিত প্রতিটি দিনের tape একই ছিল। পরিবর্তন হয়েছিল lookup table-এর একটি flag-এ। এর ফলে ওই dictionary-র ওপর নির্ভরশীল প্রতিটি chart এবং backtest যে official open ও close দেখাচ্ছিল, সেটিও পরিবর্তিত হয়েছিল।
কোনো একক vendor-এর OHLC-কে tape-এর একটি reading হিসেবে বিবেচনা করুন, tape সম্পর্কে চূড়ান্ত সত্য হিসেবে নয়। দুটি source-এর মধ্যে অমিল থাকলে জিজ্ঞেস করুন, প্রত্যেকটি কোন eligibility rule প্রয়োগ করেছে। Delayed and consolidated quote feeds একই সমস্যার দ্বিতীয় সংস্করণ তৈরি করে, তবে সেখানে বিষয়টি eligibility নয়, timing-সংক্রান্ত।
Authoritative trade condition code list কোথায় পাওয়া যায়
Tapes দুটি national market system plan-এর অধীনে পরিচালিত হয়। NYSE-listed securities-এর জন্য CTA Plan এবং Nasdaq-listed securities-এর জন্য UTP Plan প্রযোজ্য। প্রত্যেক plan তার পরিচালিত tape-এর sale condition specification প্রকাশ করে। এগুলোই authoritative source। উপরের panel-গুলোর পেছনের id number-সহ downstream সবকিছুই vendor-এর নিজস্ব numbering system-এ করা mapping। তাই একটি provider-এর code id অন্য provider-এর একই অর্থ নাও বহন করতে পারে। Number নয়, category শিখুন। Category বহু বছর ধরে স্থিতিশীল। Number হলো lookup table-এর অংশ, আর lookup table সংশোধন করা হয়।
Data notes
উপরের panel-গুলোর condition bucket hardcoded id number থেকে নয়, dictionary থেকেই তৈরি করা হয়েছে। প্রতিটি bucket sale condition family-এর মধ্যে name match ব্যবহার করে তৈরি: odd lot, form T এবং extended trading hours, out of sequence, prior reference price, derivatively priced, average price, price variation এবং seller। সঠিক pattern পড়তে যেকোনো panel-এর নিচের SQL খুলুন। Code-গুলো mutually exclusive নয়। একটি print একাধিক code বহন করতে পারে। তাই bucket percentage-গুলো overlap করে এবং session-এর মোটের সঙ্গে যোগ হয় না। AAPL-এর দুটি panel এবং পাঁচটি নামের panel-ই June 2026-এর একটি নির্দিষ্ট session নিয়ে তৈরি, যা SQL-এ pinned করা আছে। তাই নতুন session যুক্ত হলেও এই page-এর কোনো figure পরিবর্তিত হবে না।
FAQ
Trade condition code কী?
এটি consolidated tape-এ থাকা trade report-এর সঙ্গে যুক্ত একটি tag। এটি report-টি কোন ধরনের তা জানায়। উদাহরণ হলো late reported, derivatively priced, odd lot এবং extended hours। প্রতিটি code-এর সঙ্গে flag থাকে, যা নির্ধারণ করে trade-টি last price, high ও low, open, close এবং consolidated volume আপডেট করতে পারবে কি না।
একই স্টকের জন্য দুটি website-এ ভিন্ন daily high দেখা যায় কেন?
প্রতিটি website একই print-এর ওপর ভিন্ন eligibility rule প্রয়োগ করে। কোনোটি report করা সব trade-এর সর্বোচ্চ price নিতে পারে। অন্যটি এমন print বাদ দিতে পারে, যেগুলোর condition code high নির্ধারণে বাধা দেয়। তৃতীয়টি premarket এবং post-close session-ও বাদ দিতে পারে। সবগুলোই একই tape পড়ে।
Odd lot trade কি volume-এ গণনা হয়?
হ্যাঁ। Odd lot বলতে 100 shares-এর কম বোঝায়। এটি consolidated volume-এ গণনা হয়, কিন্তু last price বা দিনের high ও low নির্ধারণের জন্য eligible নয়। 2013 সালের শেষ দিকের আগে odd lot consolidated tape-এ report করা হতো না। তাই দীর্ঘমেয়াদি volume comparison-এ ওই সময়ে সংজ্ঞার পরিবর্তন অতিক্রম করতে হয়।
After-hours trade কি daily high এবং low-তে গণনা হয়?
Regular session-এর high এবং low-তে নয়। Premarket এবং post-close print-এ extended hours অথবা form T condition থাকে। এর ফলে এগুলো regular session-এর open, high, low এবং close থেকে বাদ পড়ে। তবে দিনের consolidated volume-এ এগুলো গণনা হয়।
Sale condition code-এর official list কোথায় পাওয়া যায়?
CTA Plan এবং UTP Plan তাদের পরিচালিত tape-এর sale condition specification প্রকাশ করে। ওই নথিগুলোই authoritative। Vendor feed-গুলো condition-কে নিজেদের id space-এ নতুন নম্বর দেয়। তাই একটি provider-এর numeric code অন্য provider-এর একই number-এর সঙ্গে নাও মিলতে পারে।
এখানে প্রতিটি panel তৈরির SQL-সহ প্রকাশিত হয়েছে। যেকোনো একটি খুলে ticker বা date বদলান। তারপর Strasmore terminal-এ যেকোনো session-এর জন্য একই condition breakdown চালান।