यह दैनिक इक्विटी फ़ाइल की एक पंक्ति है। NVDA, शुक्रवार 7 जून 2024, 10-for-1 स्प्लिट लागू होने से पहले का आख़िरी सत्र।
| कॉलम | मान |
|---|---|
| तारीख | 2024-06-07 |
| क्लोज़ | 1208.88 |
| वॉल्यूम | 42,800,000 (गोल किया हुआ) |
| स्प्लिट_फैक्टर | 1.0 |
| डिविडेंड | 0.00 |
| समायोजित_क्लोज़ | 120.8781 |
मैंने इस दृश्य से OHLC कॉलम जानबूझकर हटाए हैं। वे लेख के अंत के पास फिर आएँगे, और वही चुपचाप गड़बड़ी पैदा करते हैं।
इस पंक्ति की दिलचस्प बात दूसरे और छठे कॉलम के बीच के अंतर में है। 7 जून को टेप पर 1208.88 छपा था। उस कीमत पर अब कोई लेन-देन नहीं कर पाएगा, क्योंकि जिस शेयर की वह इकाई थी, वह अब मौजूद नहीं है। 120.8781 एक पुनर्निर्माण है, और यह केवल 1208.88 को दस से भाग देने भर से नहीं निकला। आइए, कॉलम-दर-कॉलम देखें।
तारीख: 2024-06-07, और दो दूसरी तारीखें जो इससे ज़्यादा मायने रखती हैं
स्प्लिट की घोषणा 22 मई 2024 को कमाई के नतीजों के साथ हुई थी। रिकॉर्ड तारीख 6
जून थी। सोमवार 10 जून से ट्रेडिंग स्प्लिट-समायोजित आधार पर शुरू हुई। तीन
तारीखें, और आपके वेंडर का split_factor कॉलम इनमें से ठीक एक तारीख
से जुड़ा होता है, आम तौर पर स्प्लिट-समायोजन वाले पहले सत्र से। यहाँ एक दिन का
फ़र्क कॉर्पोरेट-एक्शन से जुड़ी सबसे आम गड़बड़ी है जो मुझे दिखती है, और कुल
आँकड़ों में यह छिपी रहती है: आपकी इक्विटी कर्व में एक दिन 90% की गिरावट या
900% की उछाल दिखती है। 2,000 दिनों पर निकला Sharpe इसे मुश्किल से पकड़ता है,
लेकिन अधिकतम गिरावट या स्टॉप-लॉस नियम इसे ज़रूर पकड़ते हैं।
डिविडेंड की तारीख की अपनी समस्या है, और 2024 में यह सबके लिए बदल गई। NVDA के स्प्लिट के बाद के $0.01 तिमाही डिविडेंड की रिकॉर्ड तारीख 11 जून थी। अमेरिका में सेटलमेंट 28 मई 2024 को T+1 हुआ, यानी अब एक्स-तारीख और रिकॉर्ड तारीख एक ही दिन हैं। जो भी लोडर एक्स-तारीख को "रिकॉर्ड तारीख से एक कारोबारी दिन पहले" निकालता है — जो दशकों तक सही था — वह जून 2024 में चुपचाप एक सत्र पहले डिविडेंड समायोजन देने लगा। कोई त्रुटि नहीं आती। बस फैक्टर गलत पंक्ति पर दर्ज हो जाता है।
कॉर्पोरेट-एक्शन कोड की नाकामी कभी अपवाद के रूप में नहीं दिखती। यह एक दिन से चूकी हुई ऐसी संख्या होती है जो पूरी तरह विश्वसनीय लगती है।
क्लोज़: 1208.88 — वह कीमत जो फ़ाइल में नहीं है
यह कच्चा प्रिंट है, और ज़्यादातर रिसर्च पाइपलाइन में यह बस ऐसा कॉलम है जिसे
कोई नहीं पढ़ता। सिग्नल adj_close पर निकाले जाते हैं। और डॉलर में
प्रति-शेयर कीमत के किसी स्तर का संदर्भ देने वाला हर नियम अब ऐसी संख्या देख रहा
है जिसे बाज़ार के किसी प्रतिभागी ने कभी नहीं देखा।
2024 के वसंत में NVDA का $1,000 की ओर बढ़ना हक़ीक़त थी, जिसके पीछे असली ऑर्डर फ़्लो था: गोल संख्याओं का खिंचाव, 950 और 1000 पर जमा ऑप्शंस स्ट्राइक, और हर बार उस स्तर के पास पहुँचने पर खबरों का जोखिम। समायोजित डेटा में यह पूरा दौर $100 पर घटता दिखता है। अगर आप मनोवैज्ञानिक स्तरों का व्यवहार, गोल संख्याओं के पास गैप-फिल लॉजिक, या स्ट्राइक से निकटता वाली फ़ीचर जाँच रहे हैं, तो आप ऐसी कीमत शृंखला पर उसे परख रहे हैं जिसे उस घटना ने फिर से पैमाने पर रखा था जो तब तक हुई ही नहीं थी।
यही बात यूनिवर्स फ़िल्टर पर भी लागू होती है। "$5 से कम कीमत वाले शेयर हटाएँ" बाज़ार की सूक्ष्म-संरचना से जुड़ी असली समस्याओं के समूह का एक जायज़ प्रॉक्सी है: बड़े सापेक्ष स्प्रेड, मार्जिन की पात्रता के नियम, और टिक व्यवस्थाएँ। इसे समायोजित इतिहास पर चलाएँ तो उन अवधियों में कंपनियाँ हट जाएँगी जब वे $30 पर ट्रेड हो रही थीं और बाद में उनका रिवर्स स्प्लिट हुआ। "$500 से ज़्यादा कीमत" चलाएँ तो जून 2024 से पहले के हर साल में NVDA चुपचाप छँट जाएगा। कीमत के फ़िल्टर बिना समायोजित प्रिंट पर होने चाहिए। बस।
स्प्लिट_फैक्टर: 1.0 — और अगली पंक्ति पर 0.1
यह फैक्टर आज से पीछे की ओर चलने वाला संचयी गुणनफल है। 10 जून 2024 से पहले की हर पंक्ति में इस स्प्लिट का 0.1 होता है, जिसे 2021 के 4-for-1 स्प्लिट के 0.25 से और उससे पहले के हर स्प्लिट से गुणा किया जाता है। 2021 से पहले NVDA का इतिहास 0.025 से स्केल होता है, इसलिए 2019 में $200 पर छपा बार $5.00 दिखता है।
दो नतीजे याद रखने लायक हैं। पहला, नया कॉर्पोरेट-एक्शन आते ही समायोजित इतिहास बदलता है। मई 2024 में चलाया गया बैकटेस्ट और आज चलाया गया बैकटेस्ट, एक ही कोड को उन्हीं तारीखों पर चलाने के बावजूद, अलग संख्याएँ देते हैं। और अगर आपने डेटा संस्करण का स्टैम्प लगाए बिना सिंबल और तारीख के आधार पर फ़ीचर कैश किए थे, तो अब उस कैश में दो अलग स्केल मिले हुए हैं। इसी वजह से हम समायोजन के युग का संस्करण फ़ीचर की कुंजी में रखते हैं; यह बात समझने में हमारी एक बेहद उलझन भरी दोपहर लगी थी।
दूसरा, 0.025 स्केलिंग पर, $0.01 के टिक में ट्रेड होने वाला शेयर अब $0.00025 की बढ़तों में चलता है। आपकी टिक-राउंडिंग लॉजिक, "क्या यह नया उच्च स्तर है" वाली तुलना, और फ़्लोट समानता की जाँच — ये सब अब बाज़ार में मौजूद वास्तविक रिज़ॉल्यूशन से बहुत नीचे काम कर रहे हैं।
डिविडेंड: 0.01 — वह संख्या जो उससे पहले की हर कीमत को पैनी ग्रिड से बाहर कर देती है
एक सेंट। यह मामूली शोर लगता है, लेकिन इसी वजह से adj_close साफ़
120.888 के बजाय 120.8781 दिखाता है।
10 जून का क्लोज़ 121.79 था। एक्स-डिविडेंड फैक्टर (121.79 − 0.01) / 121.79 = 0.99991789 है। यह फैक्टर 11 जून से पहले की हर कीमत को गुणा करता है, इसलिए स्प्लिट-समायोजित 120.888, 120.878074 बन जाता है। अंतर छोटा है, हमेशा के लिए रहता है, और NVDA के इतिहास में पीछे तक जाने वाली साठ से कुछ ज़्यादा एक्स-तारीखों में हर बार लागू होता है। असली बात इनका चक्रवृद्धि असर है: 2015 तक पहुँचते-पहुँचते आप ऐसी कीमत देख रहे होते हैं जिसे दर्जनों कुछ-कुछ अपरिमेय फैक्टरों से गुणा किया गया है। कोई भी समायोजित ऐतिहासिक कीमत पैनी ग्रिड पर नहीं बैठती।
इसका मतलब है कि गोल स्तर के साथ हर == तुलना गलत है, "क्या कीमत
लिमिट तक पहुँची" वाली हर जाँच में टॉलरेंस चाहिए, और 4 दशमलव तक सीधे राउंड करने
के बाद आपके पुनर्निर्मित OHLC में अब low ≤ open ≤ high वाला नियम पूरा नहीं
होता। इसका यह भी मतलब है कि adj_close कुल रिटर्न की शृंखला है,
जबकि close कीमत-रिटर्न की शृंखला है। अगर आप एक से रिटर्न निकालें
और दूसरी से गिरावट, तो आपने क्या हुआ इसकी दो अलग परिभाषाएँ मिला दी हैं।
वॉल्यूम: 42,800,000 — वह भाजक जिसे हर कोई एक ही तरह से लागू नहीं करता
स्प्लिट के बाद के सत्रों से तुलना करने के लिए शेयर वॉल्यूम को 10 से गुणा करना चाहिए। कुछ वेंडर ऐसा करते हैं। कुछ नहीं करते। कुछ OHLC समायोजित करते हैं, लेकिन वॉल्यूम कच्चा छोड़ देते हैं। इन तीनों में यह सबसे बुरा है, क्योंकि कीमत को वॉल्यूम से गुणा करने तक फ़ाइल भीतर से एकसार दिखती है।
समझदारी का रास्ता है कि फ़ीचर के तौर पर शेयर वॉल्यूम का इस्तेमाल बंद करें और डॉलर वॉल्यूम लें, जो बनावट से ही स्प्लिट के प्रति अपरिवर्तित रहता है। 20-दिन के औसत डॉलर वॉल्यूम वाला लिक्विडिटी फ़िल्टर किसी समायोजन लॉजिक के बिना काम करता है और कॉर्पोरेट-एक्शन से टूट नहीं सकता। फ़ीचर का अपरिवर्तित रहना सही समायोजन कोड से बेहतर है, क्योंकि सही समायोजन कोड ऐसी चीज़ है जिसमें आपको लगातार सही रहना पड़ता है।
वेंडर फ़ाइल के 3 रूप, नाकामी के 3 तरीके।
| क्या मिलता है | क्या बिगड़ता है |
|---|---|
| केवल समायोजित क्लोज़, कच्चा OHLC | गैप और इंट्राबार लॉजिक दो कीमत स्केल के बीच गणना करता है |
| समायोजित OHLC, कच्चा वॉल्यूम | डॉलर वॉल्यूम स्प्लिट अनुपात के हिसाब से गलत; ADV फ़िल्टर चूक जाते हैं |
| कच्चा OHLCV और फैक्टर कॉलम | कुछ नहीं, अगर आप फैक्टर लागू करें। सब कुछ, अगर गलत पंक्ति पर लागू करें |
जो कॉलम यहाँ नहीं हैं: adj_open, adj_high, adj_low
अब OHLC को वापस रखें। अगर कोई फ़ीड केवल क्लोज़ समायोजित करती है और आपकी रणनीति
रातोंरात गैप की गणना open / prev_adj_close − 1 के रूप में करती
है, तो 10 जून 2024 को वह 120.37 / 120.8781 − 1 निकालेगी, जो ठीक संख्या है —
लगभग −0.4%। यही कोड 7 जून 2024 तक पीछे चलाएँ तो यह कच्ची फ़ाइल से ओपन (लगभग
1207) लेगा और पुराने स्प्लिट से 0.025 पर समायोजित क्लोज़ के साथ रखेगा। नतीजा
होगा कई हज़ार प्रतिशत का गैप।
कच्चे और समायोजित कॉलम को मिलाने वाली कोई भी गणना दो अलग निर्देशांक प्रणालियों के बीच अंकगणित है। अब मैं मिले-जुले समायोजन वाले रीड को लोडर-स्तर की जाँच मानता हूँ, ऐसी बात नहीं जिसे शोधकर्ता को याद रखना पड़े, क्योंकि वे याद नहीं रखेंगे — मैं भी नहीं।
कोई कॉलम यह नहीं बताता: आपने असल में कितने शेयर खरीदे होते
बैकटेस्ट के लागत मॉडल में यही चीज़ पैसा खर्च कराती है, और इसी वजह से मैं स्टॉक स्प्लिट पर लिख रहा हूँ।
अमेरिकी इक्विटी में कमीशन अक्सर प्रति शेयर लिया जाता है। मान लीजिए $0.005, और ऑर्डर पर न्यूनतम $1.00 — यह रिटेल ब्रोकरों का एक आम निश्चित शुल्क स्तर है। अब स्प्लिट से एक साल पहले की $400,000 की NVDA पोज़िशन का बैकटेस्ट करें, जब कच्ची कीमत लगभग $400 थी और समायोजित कीमत $40 दिखती है।
| शेयर | कमीशन | |
|---|---|---|
| असल में हुआ क्या (कच्चा $400) | 1,000 | $5.00 |
| बैकटेस्ट क्या देखता है (समायोजित $40) | 10,000 | $50.00 |
एक्सपोज़र वही, ट्रेड वही, मॉडल की लागत 10 गुना। हर लेग पर $45 की काल्पनिक लागत, एक राउंड ट्रिप पर $90, और रोज़ टर्नओवर करने वाली रणनीति सालाना करीब $22,000 ऐसी लागत खा जाती है जो कभी थी ही नहीं। $400k की बुक पर सालाना रिटर्न के 5.6 प्रतिशत अंक, पूरी तरह एक भाजक की देन। यहाँ यह आपको हक़ीक़त से बदतर दिखाता है, जिसे झेला जा सकता है।
रिवर्स स्प्लिट में दिशा उलटी होती है, और यही ख़तरनाक है। 1-for-10 रिवर्स स्प्लिट का मतलब है कि समायोजित इतिहास कीमतें 10 गुना ऊँची और शेयर संख्या ट्रेड की गई वास्तविक संख्या से 10 गुना कम दिखाता है। आपका लागत मॉडल चुपचाप प्रति-शेयर कमीशन को दस से भाग देता है। जहाँ रिवर्स स्प्लिट आम हैं, वह यूनिवर्स छोटे-कैप, $5 से कम कीमत और बड़े स्प्रेड वाले शेयरों का है, जहाँ प्रति-शेयर फ़ीस लागत के कुल जोड़ की सबसे बड़ी मद होती है। बैकटेस्ट उन्हीं शेयरों को बेहतर दिखाता है जिन्हें सबसे ज़्यादा दंडित करना चाहिए।
तो समाधान सीधा और ढाँचे से जुड़ा है: पोज़िशन का आकार डॉलर में तय करें, उस तारीख की बिना समायोजित कीमत से शेयर संख्या निकालें, और उसी संख्या पर प्रति-शेयर फ़ीस लें। लोडर में कच्चे कीमत कॉलम को हमेशा रखें — ऑडिट के लिए नहीं, बल्कि फ़िल इंजन के सक्रिय इनपुट के तौर पर।
- सिग्नल और रिटर्न: समायोजित शृंखला।
- शेयर संख्या, प्रति-शेयर फ़ीस, टिक राउंडिंग, कीमत-स्तर फ़िल्टर: बिना समायोजित शृंखला।
- लिक्विडिटी और क्षमता: डॉलर वॉल्यूम, जिसे इनमें से किसी की ज़रूरत नहीं।
छह कॉलम, एक पंक्ति, और एक काफ़ी सामान्य कॉर्पोरेट-एक्शन जिसकी घोषणा तीन हफ़्ते पहले हुई थी और जिसने किसी को चौंकाया नहीं। बाज़ार ने इसे एक सुबह में संभाल लिया। रिसर्च पाइपलाइन में इसे सही-सही दोबारा बनाना इससे कहीं कठिन है, और पाइपलाइन में यह काम नहीं हुआ है — इसका संकेत लगभग कभी त्रुटि संदेश नहीं होता।
← सभी पोस्ट


