84,120 سے لانگ۔ اسٹاپ 84,036 پر، ٹارگٹ 84,271 پر۔ اگلے منٹ کا بار آتا ہے: اوپن 84,118، ہائی 84,290، لو 84,010، کلوز 84,240۔
دونوں سطحیں اس بار کے اندر ہیں۔ اسٹاپ بھی لگا اور ٹارگٹ بھی، اور OHLC کے 4 اعداد میں یہ جاننے کی بالکل کوئی معلومات نہیں کہ پہلے کون سا لگا۔ پھر بھی آپ کے بیک ٹیسٹ نے ایک عدد نکال دیا۔ لوپ میں کہیں ایک سطر نے فیصلہ کیا — غالباً وہ سطر جسے لکھتے وقت آپ نے ماڈلنگ کا مفروضہ نہیں سمجھا تھا۔
مختصر مدتی حکمتِ عملیوں میں جعلی کارکردگی کا یہ سب سے بڑا واحد سبب ہے جو مجھے نظر آتا ہے؛ فیس اور سلپیج سے بھی بڑا، کیونکہ یہ کسی مفروضے جیسا دکھائی نہیں دیتا۔ یہ تو محض کوڈ کی جوڑ توڑ لگتی ہے۔
غلط طریقہ نمبر 1: if-سلسلے کو فیصلہ کرنے دیں
عام طور پر کوڈ کچھ ایسا ہوتا ہے:
if bar.high >= target:
exit(target, "tp")
elif bar.low <= stop:
exit(stop, "sl")
کسی نے یہ نہیں چنا کہ "ٹارگٹ کا فیصلہ اسٹاپ سے پہلے ہوگا۔" ٹارگٹ کی جانچ پہلے لکھی گئی، کیونکہ وہ کامیابی والا راستہ ہے اور اسی کے بارے میں آپ سوچ رہے تھے۔ دونوں شاخوں کی ترتیب بدلیں تو ایکویٹی کرو بدل جاتی ہے؛ صرف یہی بات بتانے کے لیے کافی ہے کہ آپ کے strategy کا P&L جزوی طور پر آپ کے ایڈیٹر کی ترتیب کا نتیجہ ہے۔
میں نے BTCUSDT پرپ پر ایک جان بوجھ کر عام سی mean-reversion اسکیلپر چلائی: 1 منٹ کے بارز کے 3 مہینے، 4,812 ٹریڈز، انٹری سے 0.10% پر اسٹاپ اور 0.18% پر ٹارگٹ۔ سگنلز وہی، فیس وہی، صرف ٹائی بریک کا اصول بدلا۔
آٹھ میں سے ایک ٹریڈ پورے نتیجے کا بوجھ اٹھا رہی ہے۔ تنگ اسٹاپ اور ٹارگٹ کے جوڑے کا حساب یہی ہے: مبہم ٹریڈز وہ ہیں جن میں قیمت دونوں طرف گئی، یعنی زیادہ تر دلچسپ ٹریڈز، اور ہر ٹریڈ کی قدر اسٹاپ سے ٹارگٹ تک کے پورے فاصلے کے برابر ہے، جس کا دارومدار سکہ اچھالنے جیسے فیصلے پر ہے۔ 12.6% ٹریڈز × 0.28% فاصلہ، نمونے کی فی اکائی کے حساب سے مجموعی نوٹیشنل ٹرن اوور کا 3.5% بنتا ہے، جو حکمتِ عملی کے اصل edge سے کہیں زیادہ ہے۔
یہ شرح آپ کے بار کے دورانیے اور سطحوں کے فاصلے پر منحصر ہے، اور بارز کا دورانیہ بڑھانے پر تیزی سے بگڑتی ہے۔ اسٹاپ اور ٹارگٹ وہی، سگنلز وہی، صرف دوبارہ نمونہ بندی کی گئی:
| بار کا دورانیہ | ایک بار کے اندر دونوں سطحوں والی ٹریڈز | Sharpe (ٹارگٹ پہلے) |
|---|---|---|
| 1s | 0.3% | 0.91 |
| 1m | 12.6% | 2.31 |
| 5m | 34% | 3.60 |
| 15m | 49% | 4.42 |
| 1h | 71% | 5.88 |
ذرا دیکھیں کہ یہ جدول اصل میں کیا کہہ رہی ہے۔ موٹے بارز نے بیک ٹیسٹ کو بہتر بنا دیا۔ ہر محقق کا فطری خیال ہے کہ گھنٹہ وار بارز محتاط انتخاب ہیں: کم شور، مائیکرو اسٹرکچر کے مطابق کم اوورفٹنگ۔ لیکن اگر انٹرا بار کا اصول آپ کے حق میں فیصلہ کرتا ہو، تو موٹا بار بس ایک بڑا ڈبہ ہے جس کے اندر آپ فرض کر سکتے ہیں کہ قسمت نے ساتھ دیا۔ 1h بارز پر 10 میں سے 7 ٹریڈز محض اصول کے فیصلے ہیں۔ وہ بیک ٹیسٹ کسی حکمتِ عملی کو نہیں آزما رہا؛ وہ 3,400 بار `if` کے 2 بیانات کی ترتیب آزما رہا ہے۔
غلط طریقہ نمبر 2: فرض کریں کہ اسٹاپ اسٹاپ ہی کی قیمت پر بھرا
فرض کریں آپ ترتیب ٹھیک کر لیتے ہیں۔ پہلے اسٹاپ طے ہوتا ہے، آپ ٹھیک 0.10% کا نقصان اور taker فیس درج کرتے ہیں، اور خود کو سخت گیر سمجھتے ہیں۔ پھر بھی 2 الگ باتیں غلط ہیں۔
پہلی بات یہ کہ اسٹاپ ایک ٹرگر ہے، فل نہیں۔ Binance USDⓈ-M پر STOP_MARKET آرڈر ٹرگر کی شرط پوری ہوتے ہی مارکیٹ آرڈر بن جاتا ہے، پھر آرڈر بک میں جو بھی ہو اسے کھا جاتا ہے۔ پرسکون منٹ میں یہ ایک یا 2 ٹِک کا سلپیج ہوتا ہے۔ جس منٹ میں واقعی آپ کا اسٹاپ ٹرگر ہوا — 40 پوائنٹ کی کینڈل باڈی اور اس کے نیچے لیکویڈیشن کی لہر والے منٹ میں — عین اسی جانب آرڈر بک پتلی ہوتی ہے جس جانب آپ آرڈر لے جا رہے ہیں۔ اپنے نمونے میں ٹِک ٹیپ کے ساتھ اسٹاپ ٹرگرز ملانے پر، میڈین فل ٹرگر سے 1.4 bps آگے تھا اور 95واں پرسنٹائل 11 bps تھا۔ 10 bps کے اسٹاپ پر یہ انتہائی صورت اس خطرے میں مزید دسواں حصہ جوڑتی ہے جسے آپ نے متعین سمجھا تھا۔
دوسری بات زیادہ باریک ہے اور پرپس سے خاص تعلق رکھتی ہے: کون سی قیمت ٹرگر کرتی ہے۔ Binance میں اسٹاپ آرڈرز کی ڈیفالٹ قیمت مارک پرائس ہے، جو انڈیکس اور ہموار کیے گئے basis سے بنتی ہے، اس وینیو کی آخری ٹریڈ سے نہیں۔ آپ کی OHLC سیریز آخری قیمت ہے۔ یہ دونوں الگ سیریز ہیں، اور عین ان واقعات کے دوران سب سے زیادہ فرق دکھاتی ہیں جو اسٹاپ ٹرگر کرتے ہیں۔
| آخری قیمت (آپ کی klines) | مارک پرائس (ڈیفالٹ ٹرگر) | |
|---|---|---|
| ماخذ | اس وینیو کی ٹریڈز | کئی وینیوز کا انڈیکس + basis |
| وِک کا رویہ | پورا اتار چڑھاؤ | بہت حد تک دبا ہوا |
| عام فرق | پرسکون وقت میں 1–3 bps، لیکویڈیشن کی لہر والے منٹ میں 20–35 bps | |
| بیک ٹیسٹ کا نتیجہ | ایسے اسٹاپ جو ٹرگر ہوئے مگر نہیں ہونے چاہیے تھے، اور اس کے برعکس بھی | |
یوں آخری قیمت کے ٹیپ میں 25 bps کی وِک آپ کو بیک ٹیسٹ میں اسٹاپ آؤٹ کر دیتی ہے، حالاں کہ لائیو مارک پرائس آپ کے ٹرگر سے 10 bps کے اندر بھی نہیں آئی۔ یا اس کا الٹ، جب انڈیکس حرکت کرے اور آپ کا وینیو پیچھے رہ جائے۔ اگر آپ workingType کو CONTRACT_PRICE پر سیٹ کریں تو کم از کم لائیو رویے کو اپنے ڈیٹا کے مطابق کر لیتے ہیں؛ محقق کے لیے عموماً یہی درست انتخاب ہے، کیونکہ مارک پرائس ٹرگر کی دیانت دارانہ نقل کے لیے آپ کے پورے فل انجن میں ایک دوسری سیریز شامل کرنا پڑے گی۔
اس کی بہترین مثال مجھے یاد ہے: ہماری ٹیم کے کسی شخص نے take-profit کو 0.18% سے 0.21% کر کے ایک حکمتِ عملی "بہتر" بنائی۔ Sharpe 2.3 سے 3.1 ہو گیا۔ کوئی نیا edge نہیں تھا۔ ٹارگٹ بس 1 منٹ کی وِک کی تقسیم کے سب سے گھنے حصے سے باہر چلا گیا تھا، اس لیے کم ٹریڈز اس مبہم خانے میں پڑیں جہاں کوڈ خاموشی سے انہیں جیت دلا رہا تھا۔ انہوں نے ٹائی بریک کو بہتر بنایا تھا۔
غلط طریقہ نمبر 3: ہمیشہ بدترین صورت فرض کریں اور اسے محتاط رویہ کہیں
فوری حل بدگمانی ہے۔ اگر دونوں سطحیں لگیں، تو اسٹاپ لیں۔ بس، اب مزید خوش فہمی نہیں، کام مکمل۔
میں پہلے ایسا ہی کرتا تھا۔ یہ دوسرے طریقے سے بہتر ہے، مگر پھر بھی غلط ہے، 2 وجوہ سے۔
اس سے ٹھیک ٹھاک حکمتِ عملیاں ختم ہو جاتی ہیں۔ 12.6% ٹریڈز پر بدترین صورت کا فیصلہ اس حکمتِ عملی کے Sharpe سے، ٹِک کے مطابق طے شدہ 0.94 کے مقابلے میں، 2.1 پوائنٹ کم کر گیا۔ اگر اصل عدد 0.94 ہو اور آپ کا اصول 0.18 دکھائے، تو آپ خیال ترک کر کے اس سے بدتر کسی کام میں لگ جائیں گے۔ 2 Sharpe پوائنٹ کی غلطی والا محتاط انداز، احتیاط نہیں؛ اخلاقی لبادے میں شور ہے۔
اس سے بھی برا یہ کہ یہ آپٹیمائزیشن کو خراب کرتا ہے۔ پیرامیٹرز کی آزمائش کو بدترین ٹائی بریک دیں، تو آپٹیمائزر ابہام سے بچنا سیکھتا ہے، کیونکہ اب ابہام کی قیمت محض نقصان ہے۔ وہ چوڑے اسٹاپ اور قریب ٹارگٹ، یا ایسے سست بارز کی طرف بڑھے گا جن میں دونوں سطحیں شاذ ہی ایک ساتھ آتی ہیں، اور آپ کو ایسے پیرامیٹرز دے گا جو مارکیٹ کے بجائے آپ کے فل اصول کے مطابق چنے گئے ہوں گے۔ سخاوت والے طریقے جیسی ہی ناکامی، بس نشان الٹ؛ اور tearsheet میں اتنی ہی آسانی سے نظر نہیں آتی۔
کسی بھی چیز سے پہلے ہمارا سادہ اصول: اگر stop_distance + target_distance آپ کے بار کے دورانیے کی حد کے 75ویں پرسنٹائل سے کم ہو، تو P&L میں آپ کا انٹرا بار مفروضہ آپ کے سگنل سے بڑا عامل ہے۔ دونوں اعداد نکالیں۔ اس میں 4 سطریں لگتی ہیں، اور کسی بھی دوسرے ایک جانچ سے زیادہ مرتبہ اس نے حکمتِ عملی کے جائزے ختم کیے ہیں۔
عملی طور پر کیا کام آتا ہے
بار کے اندر کا راستہ بھی ڈیٹا ہے۔ اسے حاصل کریں، یا جو حاصل نہ کر سکیں اس کی حد مقرر کریں۔
- اپنی دستیاب سب سے باریک سیریز پر فیصلہ کریں۔ متعلقہ منٹوں کے لیے Binance aggTrades کی چند سو قطاریں کافی ہیں اور سوال کا سیدھا جواب دیتی ہیں: پہلے کون سی سطح لگی، اور جھٹکے کے دوران فل کس قیمت پر ہوا۔ پورے بیک ٹیسٹ کے لیے ٹِک ڈیٹا درکار نہیں، صرف مبہم بارز کے لیے چاہیے۔ میرے نمونے میں 129,600 میں سے 606 منٹ ایسے تھے۔ یہ چھوٹا سا ڈاؤن لوڈ ہے، بنیادی ڈھانچے کا منصوبہ نہیں۔
- اگر ٹِک ڈیٹا دستیاب نہ ہو تو صرف فیصلہ کرنے کے لیے ایک یا 2 ٹائم فریم درجے نیچے جائیں۔ سگنلز 15m پر، ایگزٹس کا فیصلہ 1s یا 1m بارز پر کریں۔ ابہام 49% سے گر کر ایک فیصد کے معمولی حصے تک آ جاتا ہے، اور باقی ماندہ اتنا کم ہوتا ہے کہ دیانت داری سے نظرانداز کیا جا سکتا ہے۔
- ہمیشہ حد کی رپورٹ دیں۔ ہر بیک ٹیسٹ 2 بار چلائیں: ایک بار خوش آئند اور ایک بار بدترین فیصلے کے ساتھ، اور دونوں Sharpe کو طے شدہ نتیجے کے ساتھ دکھائیں۔ یہ پھیلاؤ آپ کی انٹرا بار غیر یقینی ہے؛ اسے tearsheet میں Sharpe کے ساتھ دیے جانے والے اعتماد کے وقفے کے پہلو میں رکھیں۔ جب حد 0.2–2.3 ہو تو اس کے اندر کوئی نتیجہ حقیقی نہیں۔
- ابہام کی شرح کو بنیادی پیمانے کے طور پر ٹریک کریں۔ ہمارے ہاں یہ ہر حکمتِ عملی کے کارڈ کے سب سے اوپر، ٹریڈز کی تعداد اور ٹرن اوور کے ساتھ دکھائی جاتی ہے۔ تقریباً 5% سے زیادہ شرح کا مطلب ہے کہ آزمائش ایگزٹ لاجک کی ہو رہی ہے، انٹری لاجک کی نہیں۔
- ٹرگر کو فل سے الگ ماڈل کریں۔ اسی قیمت کی سیریز پر ٹرگر کریں جو وینیو حقیقتاً استعمال کرتا ہے؛ فل ٹرگر کی قیمت پر نہیں بلکہ ٹیپ سے حاصل کیے گئے سلپیج کے مطابق قرعے سے کریں۔
ایکویٹیز میں بھی یہی مسئلہ ہے، بس روپ بدل جاتا ہے۔ کسی شیئر کی قیمت رات بھر میں 62.00 سے گر کر 58.40 پر کھلے تو 62.00 کا اسٹاپ 62.00 پر نہیں بھرے گا؛ یہ اوپن پرنٹ سے نیچے کسی قیمت پر بھرے گا۔ روزانہ بارز کا بیک ٹیسٹ جو گیپ کے پار اسٹاپ لگنے پر −$0.00 سلپیج درج کرتا ہے، خوشی سے بتائے گا کہ اسٹاپ لاس اوورلے نے آپ کی ڈرا ڈاؤن بہتر کی۔ ایسا نہیں ہوا۔ بس اہم دنوں میں اس کی آزمائش ہی نہیں ہوئی۔ ٹریڈنگ ہالٹ میں بھی یہی ہوتا ہے: دوبارہ کھلنے کی نیلامی میں آپ کا اسٹاپ حقیقتاً کلیئر ہوتا ہے، ایسی قیمت پر جسے بار کا لو کبھی نہیں دکھاتا۔
یہ کوئی انوکھی بات نہیں۔ بس یہ سمجھنے کی بات ہے کہ بار ایک خلاصہ ہے، اور اسٹاپ و ٹارگٹ کی حکمتِ عملی ان واقعات کی ترتیب پر شرط لگاتی ہے جسے خلاصے نے حذف کر دیا۔ جب پیپر ٹریڈنگ انجن آخرکار اسے لائیو ٹیپ پر چلاتا ہے، تو ٹیپ اس ترتیب کے بارے میں اپنی رائے رکھتی ہے، اور اسے کبھی اس بات کی پروا نہیں رہی کہ آپ نے if-statement کی کون سی شاخ پہلے لکھی تھی۔
← تمام پوسٹس


