دخول شراء من 84,120. وقف الخسارة عند 84,036، والهدف عند 84,271. تظهر شمعة الدقيقة التالية: الافتتاح 84,118، والأعلى 84,290، والأدنى 84,010، والإغلاق 84,240.
كلا المستويين داخل هذه الشمعة. لُمِس وقف الخسارة ولُمِس الهدف، لكن أرقام OHLC الأربعة لا تحمل أي معلومة عن أيهما حدث أولًا. ومع ذلك أعاد اختبارك التاريخي رقمًا. ففي مكان ما من الحلقة، حسم سطرٌ الأمر — وعلى الأرجح سطر لم يخطر ببالك، حين كتبته، أنه افتراض نمذجة.
هذا أكبر مصدر منفرد للأداء الوهمي أراه في استراتيجيات الأفق الزمني القصير، متقدمًا على الرسوم والانزلاق السعري، لأنه لا يبدو كأنه افتراض. بل يبدو كأنه مجرد تفصيل تنفيذي.
الطريقة الخاطئة الأولى: اترك سلسلة if تحسم الأمر
الشكل المعتاد:
if bar.high >= target:
exit(target, "tp")
elif bar.low <= stop:
exit(stop, "sl")
لم يختر أحد أن «الأهداف تُحسم قبل أوامر الوقف». كُتب فحص الهدف أولًا فحسب لأنه المسار السهل، ولأنه ما كان يدور في ذهنك. بدّل ترتيب الفرعين، وسيتغير منحنى رأس المال؛ وهذا وحده يكفي لتعرف أن جزءًا من ربحية الاستراتيجية يتوقف على محررك البرمجي.
اختبرتُ استراتيجية عادية عمدًا للمضاربة على الارتداد نحو المتوسط على عقد BTCUSDT الدائم، باستخدام بيانات 1-minute لثلاثة أشهر، و4,812 صفقة، ووقف عند 0.10% وهدف عند 0.18% من سعر الدخول. الإشارات نفسها، والرسوم نفسها، ولم يتغير سوى أسلوب حسم التعادل.
ثُمن الصفقات يحمل النتيجة بأكملها. هذه هي حسابات زوج وقف وهدف ضيق: الصفقات الملتبسة هي التي تحرك فيها السعر في الاتجاهين، وهي غالبًا الأكثر أهمية، وكل واحدة منها تساوي المسافة الكاملة بين الوقف والهدف، بحسب رمية العملة. 12.6% من الصفقات × نطاق 0.28% تساوي 3.5% من إجمالي القيمة الاسمية المتداولة لكل وحدة من العينة، وهو ما يفوق كثيرًا الميزة الفعلية للاستراتيجية.
يتحدد المعدل بحجم الشمعة مقارنةً بالتباعد بين المستويين، ويتدهور بسرعة كلما أصبحت الشموع أبطأ. الوقف والهدف نفسيهما، والإشارات نفسها، لكن بعد إعادة أخذ العينات:
| الفاصل الزمني للشمعة | الصفقات التي وقع فيها المستويان داخل شمعة واحدة | Sharpe (الهدف أولًا) |
|---|---|---|
| 1s | 0.3% | 0.91 |
| 1m | 12.6% | 2.31 |
| 5m | 34% | 3.60 |
| 15m | 49% | 4.42 |
| 1h | 71% | 5.88 |
انظر إلى ما يقوله الجدول فعلًا. جعلت الشموع الأقل دقة الاختبار التاريخي أفضل. يظن كل باحث أن الشموع الساعية خيار أكثر تحفظًا، بضوضاء أقل وفرط ملاءمة أقل للبنية الدقيقة للسوق. لكن مع قاعدة لحسم ما يحدث داخل الشمعة لصالحك، لا تكون الشمعة الأكبر إلا صندوقًا أوسع يمكنك داخله افتراض أنك كنت محظوظًا. في الشموع ذات إطار 1h، 7 صفقات من كل 10 تحسمها قاعدة اعتباطية. هذا الاختبار لا يختبر استراتيجية؛ بل يختبر ترتيب عبارتي `if` عدد 3,400 مرة.
الطريقة الخاطئة الثانية: افترض دائمًا أن التنفيذ تم عند سعر الوقف
لنفترض أنك أصلحت الترتيب. يُحسم الأمر لمصلحة وقف الخسارة، وتسجل خسارة قدرها 0.10% بالضبط، إضافة إلى رسوم taker، وتشعر بأنك اتبعت منهجًا دقيقًا. لكن لا يزال هناك خطآن منفصلان.
الأول أن وقف الخسارة مُحفّز، لا سعر تنفيذ. على Binance USDⓈ-M يتحول أمر STOP_MARKET إلى أمر سوق فور تحقق شرط التحفيز، ثم يستهلك السيولة المتاحة في دفتر الأوامر. في دقيقة هادئة، يعني ذلك انزلاقًا بمقدار tick أو اثنين. أما في الدقيقة التي فعّلت وقفك فعلًا — ذات شمعة بجسم من 40 نقطة وتصفية متتالية أسفلها — فيكون دفتر الأوامر شحيحًا تحديدًا على الجانب الذي تعبره. في عينتي، عند مطابقة تفعيلات الوقف مع بيانات الصفقات اللحظية، كان وسيط سعر التنفيذ أسوأ من سعر التحفيز بمقدار 1.4 bps، وبلغت النسبة المئوية 95 مقدار 11 bps. مع وقف عند 10 bps، تكلّفك الحالات القصوى عُشرًا إضافيًا من المخاطر التي ظننت أنك حددتها.
أما الثاني فأدق، ويخص العقود الدائمة تحديدًا: أي سعر يفعّل الأمر. تضبط Binance أوامر الوقف افتراضيًا على سعر العلامة، ويُحتسب سعر العلامة من المؤشر مضافًا إليه أساس مُنعّم، لا من آخر صفقة على تلك المنصة. سلسلة OHLC لديك مبنية على آخر سعر. هاتان سلسلتان مختلفتان، ويبلغ تباعدهما ذروته أثناء الأحداث نفسها التي تفعّل أوامر الوقف.
| آخر سعر (بيانات الشموع لديك) | سعر العلامة (المحفّز الافتراضي) | |
|---|---|---|
| المصدر | الصفقات على هذه المنصة | مؤشر لعدة منصات + الأساس |
| سلوك الظلال | الحركة الكاملة للسعر | تخفيف كبير للتقلبات |
| التباعد المعتاد | 1–3 bps في الهدوء، و20–35 bps في دقيقة التصفية المتتالية | |
| أثره في الاختبار التاريخي | أوامر وقف تفعّلت دون أن ينبغي، والعكس صحيح | |
لذا قد يؤدي ظل بمقدار 25 bps في بيانات آخر سعر إلى تفعيل وقف الخسارة في الاختبار التاريخي، بينما لم يقترب سعر العلامة الحي قط من مسافة 10 bps عن سعرك المحفّز. أو قد يحدث العكس في يوم يتحرك فيه المؤشر وتتأخر منصتك. إذا ضبطت workingType على CONTRACT_PRICE، فستجعل السلوك الفعلي متوافقًا على الأقل مع بياناتك، وهذا غالبًا الخيار الصحيح للباحث؛ إذ إن محاكاة محفّز يعتمد على سعر العلامة بصدق تعني تمرير سلسلة ثانية عبر محرك التنفيذ بأكمله.
أوضح مثال أتذكره: حسّن أحد أفراد فريقنا استراتيجيةً بنقل جني الأرباح من 0.18% إلى 0.21%. ارتفع Sharpe من 2.3 إلى 3.1. لم تظهر أي ميزة جديدة. كل ما في الأمر أن الهدف انتقل إلى خارج الجزء الكثيف من توزيع ظلال شموع 1-minute، فقلّت الصفقات التي وقعت في الفئة الملتبسة، حيث كان الكود يمنحها الفوز من دون أن يلحظ أحد. لقد حسّنوا قاعدة حسم التعادل.
الطريقة الخاطئة الثالثة: افترض الأسوأ دائمًا وسمّه تحفظًا
الحل التلقائي هو التشاؤم. إذا لُمِس المستويان، فاحتسب وقف الخسارة. انتهى الأمر، لا مزيد من التفاؤل، وانطلق.
كنت أفعل ذلك. وهو أفضل من البديل، لكنه لا يزال خطأ، لسببين.
فهو يقضي على استراتيجيات سليمة. كلف الحسم المتشائم هذه الاستراتيجية 2.1 نقطة Sharpe في 12.6% من الصفقات، مقارنةً بنتيجة 0.94 عند الحسم ببيانات الصفقات اللحظية. إذا كانت القيمة الحقيقية 0.94، بينما أظهرها أسلوبك عند 0.18، فستتخلى عن الفكرة وتعمل على شيء أسوأ. التحفظ الذي يخطئ بمقدار نقطتين من Sharpe ليس تحفظًا، بل ضوضاء تتبنى موقفًا أخلاقيًا.
والأسوأ أنه يفسد التحسين. إذا زوّدتَ مسحًا للمعلمات بقاعدة متشائمة لحسم التعادل، فسيتعلم المحسّن تجنب الالتباس، لأنه أصبح عقوبة صافية. وسيتجه نحو أوامر وقف واسعة وأهداف قريبة، أو نحو شموع بطيئة نادرًا ما يقع فيها المستويان معًا، ثم يعرض عليك معلمات اختيرت وفق قاعدة التنفيذ لديك، لا وفق السوق. إنه الإخفاق نفسه الذي تسببه القاعدة المتساهلة، لكن بإشارة معاكسة، وبالقدر نفسه من الخفاء في تقرير الأداء.
قاعدة تقريبية نستخدمها قبل أي شيء آخر: إذا كان stop_distance + target_distance أصغر من النطاق عند المئين 75 لفاصل الشموع لديك، فإن افتراضك لما يحدث داخل الشمعة يؤثر في الربح والخسارة أكثر من إشارتك. احسب القيمتين. لن يستغرق ذلك سوى 4 أسطر، وقد أنهى مراجعات استراتيجيات أكثر من أي فحص منفرد آخر.
ما ينجح فعلًا
المسار داخل الشمعة بيانات. احصل عليها، أو ضع حدودًا لما لا تستطيع الحصول عليه.
- احسم باستخدام أدق سلسلة بيانات لديك. بيانات aggTrades من Binance للدقائق المعنية لا تتجاوز بضع مئات من الصفوف، وتحسم المسألة مباشرة: أي مستوى لُمِس أولًا، وبأي سعر نُفّذ الاجتياح. لا تحتاج إلى بيانات tick للاختبار التاريخي بأكمله، بل للشموع الملتبسة فقط. في عينتي، شمل ذلك 606 دقائق من أصل 129,600. هذا تنزيل صغير، وليس مشروع بنية تحتية.
- إذا لم تتوفر بيانات tick، فاخفض إطارًا زمنيًا أو إطارين عند الحسم فقط. استخدم إشارات 15m، واحسم الخروج باستخدام شموع 1s أو 1m. ينخفض الالتباس من 49% إلى جزء من الواحد بالمئة، ويصبح المتبقي ضئيلًا بما يكفي لتجاهله بصدق.
- اعرض النطاق دائمًا. شغّل كل اختبار تاريخي مرتين، بحسم متفائل ومتشائم، واطبع قيمتي Sharpe بجانب القيمة المحسومة بالبيانات. هذا الفارق هو مقدار عدم اليقين داخل الشمعة، وينبغي أن يظهر في تقرير الأداء إلى جانب فترة الثقة التي تعرضها لقيمة Sharpe نفسها. عندما يكون النطاق 0.2–2.3، لا يكون أي استنتاج ضمنه حقيقيًا.
- تعامل مع معدل الالتباس كمقياس أساسي. يظهر لدينا أعلى بطاقة كل استراتيجية، بجانب عدد الصفقات وحجم التداول. يعني تجاوز المعدل نحو 5% أن ما يخضع للاختبار هو منطق الخروج، لا منطق الدخول.
- نمذج المحفّز منفصلًا عن التنفيذ. استخدم سلسلة الأسعار التي تعتمد عليها المنصة فعليًا للتحفيز، ونفّذ عند سعر التحفيز مضافًا إليه انزلاق سعري مستمد من بيانات السوق، لا عند سعر التحفيز نفسه.
تواجه الأسهم المشكلة نفسها بملابس مختلفة. وقف عند 62.00 لسهم يهبط بفجوة إلى 58.40 ليلًا لا يُنفّذ عند 62.00، بل عند سعر أدنى من سعر الافتتاح. ومع ذلك، قد يخبرك اختبار تاريخي مبني على الشموع اليومية، ويحتسب انزلاقًا قدره −$0.00 عند تجاوز السعر للوقف بفجوة، بأن طبقة وقف الخسارة حسّنت التراجع. لكنها لم تفعل. ببساطة لم تُختبر في الأيام المهمة. وينطبق الأمر نفسه على تعليق التداول: يُنفّذ وقفك فعليًا عند مزاد استئناف التداول، بسعر لا يظهره أدنى سعر للشمعة قط.
لا شيء من هذا غريب. إنها مجرد إدراك أن الشمعة ملخص، وأن استراتيجية الوقف والهدف تراهن على ترتيب أحداث حذفها ذلك الملخص. وعندما يشغّل محرك التداول الورقي الاستراتيجية أخيرًا على بيانات السوق الحية، يكون لتلك البيانات رأي في ترتيب الأحداث، ولم يسبق لها قط أن اهتمت بأي فرع من عبارة if كتبته أولًا.
→ جميع المقالات

