روزانہ ایکوئٹیز فائل سے ایک قطار یہ رہی۔ NVDA، جمعہ 7 جون 2024، 10-for-1 split کے نافذ ہونے سے پہلے کا آخری سیشن۔
| کالم | قدر |
|---|---|
| date | 2024-06-07 |
| close | 1208.88 |
| volume | 42,800,000 (راؤنڈڈ) |
| split_factor | 1.0 |
| dividend | 0.00 |
| adj_close | 120.8781 |
میں نے اس منظر سے OHLC کالم جان بوجھ کر باہر رکھے ہیں۔ وہ آخر کے قریب واپس آتے ہیں، اور یہی خاموشی سے ٹوٹتے ہیں۔
اس قطار میں جو کچھ دلچسپ ہے وہ کالم دو اور کالم چھ کے درمیانی فاصلے میں رہتا ہے۔ 7 جون کی ٹیپ نے 1208.88 پرنٹ کیا۔ کوئی اس قیمت پر کبھی دوبارہ لین دین نہیں کرے گا، اس معنی میں کہ جس شیئر کی وہ بات تھی وہ اکائی کے طور پر اب موجود نہیں۔ 120.8781 ایک تعمیرِنو ہے، اور یہ محض 1208.88 کو دس سے تقسیم کرنا نہیں۔ چلیے کالم بہ کالم چلتے ہیں۔
date: 2024-06-07، اور وہ دو دیگر تاریخیں جو زیادہ اہم ہیں
Split کا اعلان 22 مئی 2024 کو earnings کے ساتھ ہوا۔ Record date 6 جون تھی۔ Split-adjusted بنیاد پر ٹریڈنگ پیر 10 جون کو شروع ہوئی۔ تین تاریخیں، اور آپ کے vendor کا split_factor کالم ان میں سے بالکل ایک پر بیٹھتا ہے، عام طور پر پہلے split-adjusted سیشن پر۔ یہاں off-by-one وہ واحد سب سے عام کارپوریٹ-ایکشن بگ ہے جو میں دیکھتا ہوں، اور مجموعی طور پر یہ پوشیدہ رہتا ہے: آپ کے ایکوئٹی وکر کو ایک ہی دن میں ایک 90% gap-down یا ایک 900% gap-up ملتا ہے، جسے 2,000 دنوں پر حساب شدہ Sharpe بمشکل رجسٹر کرتا ہے مگر max-drawdown یا stop-loss قاعدہ بالکل کرتا ہے۔
Dividend کا اپنا تاریخ کا مسئلہ ہے، اور 2024 میں یہ سب کے نیچے بدل گیا۔ NVDA کے post-split $0.01 سہ ماہی dividend کی record date 11 جون تھی۔ امریکی settlement 28 مئی 2024 کو T+1 پر منتقل ہو گیا، یعنی ex-date اور record date اب ایک ہی دن ہیں۔ کوئی بھی loader جو ex-date کو "record date minus ایک کاروباری دن" سے نکالتا ہے، جو دہائیوں تک درست تھا، جون 2024 میں خاموشی سے dividend ایڈجسٹمنٹس ایک سیشن پہلے پیدا کرنے لگا۔ کچھ throw نہیں ہوتا۔ فیکٹر بس غلط قطار پر جا گرتا ہے۔
کارپوریٹ-ایکشن کوڈ کا failure mode کبھی exception نہیں ہوتا۔ یہ ایک عدد ہوتا ہے جو ایک دن سے ہٹا ہوا ہے اور بالکل قابلِ یقین لگتا ہے۔
close: 1208.88 — وہ قیمت جو فائل میں نہیں ہے
یہ raw print ہے، اور زیادہ تر ریسرچ پائپ لائنز میں یہ صرف ایک کالم کے طور پر موجود ہوتا ہے جسے کوئی نہیں پڑھتا۔ Signals adj_close پر حساب ہوتے ہیں۔ اور کوئی بھی قاعدہ جو ڈالرز میں فی-شیئر قیمت کی سطح کا حوالہ دیتا ہے اب اس عدد کا حوالہ دے رہا ہے جو کسی مارکیٹ شریک نے کبھی نہیں دیکھا۔
2024 کی بہار میں NVDA کا $1,000 کی طرف آہستہ چڑھنا ایک حقیقی بات تھی جس کے پیچھے حقیقی آرڈر فلو تھا: گول-عدد کے مقناطیس، 950 اور 1000 پر جمع options strikes، ہر نزدیکی پر headline رسک۔ Adjusted ڈیٹا میں وہ پورا واقعہ $100 پر ہوتا ہے۔ اگر آپ نفسیاتی سطح کے رویے، گول اعداد کے قریب gap-fill لاجک، یا strike-proximity فیچر ٹیسٹ کر رہے ہیں، تو آپ اسے ایسی قیمتی سیریز کے خلاف ٹیسٹ کر رہے ہیں جسے ایک ایسے واقعے نے rescale کیا جو ابھی ہوا ہی نہیں تھا۔
یہی بات universe فلٹرز پر بھی لاگو ہوتی ہے۔ "$5 سے کم اسٹاک خارج کریں" مائیکرو سٹرکچر مسائل کے ایک حقیقی جھرمٹ کا جائز proxy ہے: وسیع نسبتی spreads، marginability قواعد، tick رجیمز۔ اسے adjusted تاریخ پر چلائیں تو آپ کمپنیوں کو ان ادوار کے لیے خارج کر دیتے ہیں جب وہ $30 پر ٹریڈ ہو رہی تھیں اور بعد میں reverse-split ہوئیں۔ "price over $500" چلائیں تو آپ جون 2024 سے پہلے کے ہر سال سے NVDA کو خاموشی سے گرا دیں گے۔ قیمت کے فلٹرز unadjusted prints پر لگنے چاہییں۔ بات ختم۔
split_factor: 1.0 — اور اگلی قطار پر 0.1
فیکٹر آج سے پیچھے چلتا ہوا ایک cumulative product ہے۔ 10 جون 2024 سے پہلے ہر قطار اس split سے 0.1 لیے ہوئے ہے، 2021 کے 4-for-1 سے 0.25 سے ضرب، اس سے پہلے جو کچھ آیا اس سے ضرب۔ NVDA کی pre-2021 تاریخ 0.025 سے scaled ہے، اس لیے 2019 میں $200 پر پرنٹ ہونے والی بار $5.00 کے طور پر دکھتی ہے۔
دو نتائج یاد رکھنے کے قابل ہیں۔ پہلا، adjusted تاریخ ہر بار نیا کارپوریٹ ایکشن آتے ہی بدل جاتی ہے۔ مئی 2024 میں چلایا گیا بیک ٹیسٹ اور آج چلایا گیا ایک ہی کوڈ پر ایک ہی تاریخوں پر مختلف اعداد پیدا کرتے ہیں، اور اگر آپ نے symbol اور date پر keyed فیچرز بغیر data-version stamp کے cache کیے، تو اب آپ کے پاس ایسا cache ہے جو دو پیمانوں کو ملا رہا ہے۔ ہم بالکل اسی وجہ سے adjustment epoch کو فیچر کی میں version کرتے ہیں؛ یہ سیکھنے میں ہمیں ایک بہت الجھاؤ والا سہ پہر لگا۔
دوسرا، 0.025 scaling پر، ایک اسٹاک جو $0.01 ticks میں ٹریڈ ہوتا تھا اب $0.00025 کے اضافوں میں حرکت کرتا ہے۔ آپ کی tick-rounding لاجک، آپ کے "کیا یہ نئی اونچائی ہے" موازنے، آپ کے float برابری چیک: یہ سب اب اس resolution سے کافی نیچے کام کر رہے ہیں جو مارکیٹ کے پاس حقیقت میں تھی۔
dividend: 0.01 — وہ عدد جو اپنے پیچھے ہر قیمت کی گرڈ توڑ دیتا ہے
ایک سینٹ۔ یہ شور لگتا ہے، اور یہی وجہ ہے کہ adj_close صاف 120.888 کی بجائے 120.8781 پڑھتا ہے۔
10 جون کا close 121.79 تھا۔ Ex-dividend فیکٹر (121.79 − 0.01) / 121.79 = 0.99991789 ہے۔ وہ فیکٹر 11 جون سے پہلے ہر قیمت کو ضرب دیتا ہے، اس لیے split-adjusted 120.888 بن جاتا ہے 120.878074۔ چھوٹا، اور مستقل، اور NVDA کی تاریخ میں پیچھے جاتے ہوئے ساٹھ کے قریب ہر ex-date پر دوبارہ لگایا گیا۔ Compounding ہی اہم ہے: جب آپ 2015 کو دیکھ رہے ہوتے ہیں، آپ ایسی قیمت دیکھ رہے ہوتے ہیں جسے درجنوں irrational-ish فیکٹرز سے ضرب دیا جا چکا ہے۔ کوئی بھی adjusted تاریخی قیمت پینی گرڈ پر نہیں بیٹھتی۔
جس کا مطلب ہے گول سطح کے خلاف ہر == موازنہ غلط ہے، ہر "کیا ہم نے limit price چھوا" چیک کو tolerance چاہیے، اور آپ کا reconstructed OHLC naive طور پر 4 decimals پر round کرنے کے بعد اس invariant کو پورا نہیں کرتا کہ low ≤ open ≤ high۔ اس کا یہ بھی مطلب ہے کہ adj_close ایک total-return سیریز ہے جبکہ close ایک price-return سیریز ہے، اور اگر آپ ایک سے returns اور دوسرے سے drawdowns نکالیں تو آپ نے جو ہوا اس کی دو مختلف تعریفیں ملا دی ہیں۔
volume: 42,800,000 — وہ divisor جسے کوئی مستقل طور پر نہیں لگاتا
Share volume کو post-split سیشنز سے موازنہ کے قابل بنانے کے لیے 10 سے ضرب دینی پڑتی ہے۔ کچھ vendors کرتے ہیں۔ کچھ نہیں کرتے۔ کچھ OHLC ایڈجسٹ کرتے ہیں اور volume raw چھوڑ دیتے ہیں، جو تینوں میں سب سے برا ہے کیونکہ فائل اندرونی طور پر مستقل نظر آتی ہے جب تک آپ قیمت کو volume سے ضرب نہ دیں۔
ایماندارانہ حرکت یہ ہے کہ share volume کو فیچر کے طور پر استعمال کرنا بند کریں اور dollar volume استعمال کریں، جو ساخت کے لحاظ سے splits سے invariant ہے۔ 20-day اوسط dollar volume لیکویڈیٹی فلٹر کو بالکل کوئی adjustment لاجک نہیں چاہیے اور کارپوریٹ ایکشن سے ٹوٹ نہیں سکتا۔ فیچر invariance درست adjustment کوڈ کو مات دیتی ہے، کیونکہ درست adjustment کوڈ وہ چیز ہے جس کے بارے میں آپ کو مسلسل درست رہنا پڑتا ہے۔
Vendor فائل کی تین شکلیں، تین failure modes۔
| کیا بھیجتے ہیں | کیا ٹوٹتا ہے |
|---|---|
| صرف adjusted close، raw OHLC | Gap اور intrabar لاجک دو قیمتی پیمانوں پر حساب کرتی ہے |
| Adjusted OHLC، raw volume | Dollar volume split ratio سے ہٹا ہوا؛ ADV فلٹرز misfire |
| Raw OHLCV جمع فیکٹر کالم | کچھ نہیں، اگر آپ انہیں لگائیں۔ سب کچھ، اگر آپ انہیں غلط قطار پر لگائیں |
وہ کالم جو یہاں نہیں ہیں: adj_open, adj_high, adj_low
اب OHLC واپس رکھیں۔ اگر کوئی feed صرف close ایڈجسٹ کرتا ہے اور آپ کی حکمت عملی overnight gap کو open / prev_adj_close − 1 کے طور پر حساب کرتی ہے، تو 10 جون 2024 کو یہ 120.37 / 120.8781 − 1 حساب کرتی ہے، جو ایک ٹھیک عدد ہے، تقریباً −0.4%۔ وہی کوڈ 7 جون 2024 پر پیچھے دھکیلیں تو یہ raw فائل سے open (تقریباً 1207) کو پرانے splits سے 0.025 سے adjusted close کے خلاف حساب کرتی ہے، اور کئی ہزار فیصد کا gap پیدا کرتی ہے۔
جو بھی raw کالم کو adjusted والے سے ملاتا ہے وہ دو coordinate systems پر ریاضی ہے۔ میں اب mixed-adjustment reads کو loader-level assertion سمجھتا ہوں بجائے اس چیز کے جسے محقق کو یاد رکھنا ہو، کیونکہ محقق نہیں رکھیں گے، بشمول میں۔
جو کوئی کالم نہیں بتاتا: آپ نے حقیقت میں کتنے shares خریدے ہوتے
یہی وہ ہے جو بیک ٹیسٹ کے cost model میں پیسے خرچ کرتا ہے، اور یہی وجہ ہے کہ میں اسٹاک split کے بارے میں لکھ ہی رہا ہوں۔
امریکی ایکوئٹی کمیشن اکثر فی share ہوتے ہیں۔ اسے $0.005 کہہ لیں $1.00 آرڈر کم از کم کے ساتھ، جو ایک عام retail-broker fixed tier ہے۔ اب split سے ایک سال پہلے $400,000 کی NVDA پوزیشن کا بیک ٹیسٹ کریں، جب raw قیمت $400 کے قریب تھی اور adjusted قیمت $40 دکھاتی ہے۔
| Shares | کمیشن | |
|---|---|---|
| حقیقت میں کیا ہوا (raw $400) | 1,000 | $5.00 |
| بیک ٹیسٹ کیا دیکھتا ہے (adjusted $40) | 10,000 | $50.00 |
وہی exposure، وہی ٹریڈ، 10x ماڈل شدہ لاگت۔ یہ فی leg $45 کا فریب ہے، فی round trip $90، اور روزانہ turnover کرنے والی حکمت عملی سال میں تقریباً $22,000 ایسے اخراجات کھا جاتی ہے جو کبھی موجود نہیں تھے۔ $400k بک پر، سالانہ ریٹرن کے 5.6 percentage points، مکمل طور پر ایک divisor سے تیار کردہ۔ یہاں یہ آپ کو حقیقت سے برا دکھاتا ہے، جو قابلِ برداشت ہے۔
Reverse splits دوسری طرف چلتے ہیں، اور وہ خطرناک سمت ہے۔ 1-for-10 reverse split کا مطلب ہے adjusted تاریخ قیمتیں 10x زیادہ اور share counts آپ کے ٹریڈ کیے ہوئے سے 10x کم دکھاتی ہے۔ آپ کا cost model خاموشی سے فی-share کمیشن کو دس سے تقسیم کر دیتا ہے۔ جہاں reverse splits عام ہیں وہ small-cap، sub-$5، وسیع-spread universe ہے جہاں فی-share فیس cost stack میں سب سے بڑی واحد لائن آئٹم ہیں۔ بیک ٹیسٹ بالکل انہی ناموں کی خوشامد کرتا ہے جنہیں اسے سزا دینی چاہیے۔
تو حل بورنگ اور structural ہے: پوزیشنز ڈالرز میں سائز کریں، اس تاریخ کی unadjusted قیمت سے shares میں تبدیل کریں، اور اس شمار پر فی-share فیس لگائیں۔ Loader میں raw قیمت کا کالم ہمیشہ رکھیں، audit artifact کے طور پر نہیں بلکہ fill engine کے live input کے طور پر۔
- Signals اور returns: adjusted سیریز۔
- Share counts، فی-share فیس، tick rounding، قیمت-سطح فلٹرز: unadjusted سیریز۔
- لیکویڈیٹی اور capacity: dollar volume، جسے دونوں میں سے کسی کی ضرورت نہیں۔
چھ کالم، ایک قطار، ایک کافی عام کارپوریٹ ایکشن جس کا اعلان تین ہفتے پہلے ہوا اور کسی کو حیران نہیں کیا۔ مارکیٹ نے اسے ایک صبح میں سنبھال لیا۔ ریسرچ پائپ لائن میں اسے وفاداری سے تعمیرِنو کرنا اس سے کافی زیادہ مشکل ہے، اور اس بات کی نشانی کہ پائپ لائن نے نہیں کیا تقریباً کبھی error message نہیں ہوتی۔
← تمام پوسٹس


