أرسلتَ إليّ دفتر الملاحظات الأسبوع الماضي: الإشارة نفسها، والسوق نفسه، وبيانات BTCUSDT perp نفسها على مدى 14 شهرًا. التغيير الوحيد كان في التنفيذ. توقفت عن عبور الفارق السعري وبدأت تضع أوامر شراء معروضة على بُعد tick واحد، فارتفع Sharpe من 0.42 إلى 2.14. وسألتني إن كان ذلك حقيقيًا أم أنك أفسدت شيئًا.
لقد أفسدت شيئًا. أريد أن أوضح لك موضع الخطأ بالضبط، لأن العلة في سطر واحد، والدرس الكامن وراءه أكبر بكثير من ذلك السطر.
هذه قاعدة التنفيذ لديك، نقلتها من محركك:
if bar.low <= limit_price: fill(limit_price)
معناها: إذا سُجّلت صفقة في السوق عند سعري أو أدنى منه خلال هذه الدقيقة، فقد نُفِّذ أمري بسعري. أما ما ترمّزه فعليًا فهو أن السعر لامس مستواك. الملامسة لا تعني التنفيذ. بين الأمرين طابور، وقد نمذجتَ الطابور على أنه فارغ.
ما الذي يقف أمامك؟
عندما تضع أمر شراء معروضًا عند 84,120.0 على BTCUSDT perp، فإنك تنضم إلى آخر الطابور القائم هناك. عند أفضل سعر في دفتر أوامر ذلك العقد، يتراوح الحجم عادةً بين 4 و30 BTC بحسب الوقت من اليوم؛ والوسيط في نافذة عينتك يقارب 12 BTC. حجم أمرك 0.4 BTC. لكي تتم صفقتك، على البائعين أن يضربوا ذلك المستوى بحجم إجمالي يكفي لتجاوز كل من سبقك إليه، وأن يفعلوا ذلك قبل إلغاء المستوى من تحت أمرك أو ابتعاد السوق صعودًا عنه.
لذا فالسؤال الذي ينبغي أن يطرحه اختبارك الخلفي ليس «هل بلغ السعر 84,120.0؟» بل «هل نُفِّذ ما لا يقل عن 12.4 BTC من أوامر البيع السوقية عند 84,120.0 بينما كان أمري معروضًا هناك؟». هذان حدثان مختلفان تمامًا. وفي بياناتك، يختلفان بنحو ثلاثة أضعاف.
3 قواعد تنفيذ، و3 استراتيجيات مختلفة
أعدت تشغيل إشارتك باستخدام الإدخالات نفسها و3 نماذج تنفيذ. الاستراتيجية نفسها، والرسوم نفسها، والتمويل نفسه. التغيير الوحيد كان منطق التنفيذ.
| قاعدة التنفيذ | التنفيذات | متوسط الحافة بعد 60s من التنفيذ | Sharpe |
|---|---|---|---|
الملامسة: low <= limit | 4,180 | +2.6 bp | 2.14 |
تجاوز صارم: low < limit - 1 tick | 1,712 | +0.4 bp | 0.61 |
| محاكاة طابور بحجم التداول عند المستوى | 1,306 | +0.9 bp | 0.77 |
الصف الأوسط هو الإصلاح البدائي الذي يلجأ إليه الجميع أولًا: لا تحتسب التنفيذ إلا إذا تداول السوق بسعر يتجاوز سعرك تجاوزًا فعليًا، على أساس أنه إذا تخطاه فلا بد أنه استهلك أمرك. هذا صحيح من حيث الاتجاه ويقضي على معظم الأوهام. لكنه ينطوي أيضًا على انحياز سيئ، وسأعود إليه.
الصف الأخير هو النموذج الذي ينبغي أن تبنيه. لا يحتاج إلى موجز L3 ولا إلى إعادة بناء لكل أمر على حدة. ومعظم ما يلزمك متوفر لديك أصلًا.
محاكاة طابور يمكنك بناؤها من aggTrades
اجلب تدفق الصفقات المجمّعة بدلًا من بيانات الشموع. كل صفقة مسجلة تتضمن السعر والكمية والطابع الزمني وعلامة جهة maker، التي تخبرك إن كان الطرف المبادر بالشراء أم البيع. وهذا يكفي لمحاكاة عملية لأمرك السلبي:
- عند وضع أمرك، التقط حجم الأوامر المعروضة عند سعرك. وإذا لم يكن لديك سوى موجز لدفتر الأوامر كل 100ms، فاستخدم آخر لقطة؛ فالخطأ صغير مقارنة بالخطأ الذي تحاول إصلاحه.
- عيّن
queue_ahead = resting_size. كن متشائمًا وافترض أنك في آخر الطابور. وهذا هو موقعك فعلًا، إلا إذا كنت أنت من أنشأ المستوى. - تتبّع تدفق الصفقات. كل صفقة ينفذها بائع مبادر عند سعرك أو أدنى منه تخفّض
queue_aheadبمقدار كميتها. وعندما يصبح الرقم سالبًا، يكون أمرك قد نُفِّذ بسعرك وفي ذلك الطابع الزمني. - إذا تحرك السعر بمقدار tick مبتعدًا عنك، فلا تُعِد الطابور إلى الصفر. خفّضه تدريجيًا. بعض الأوامر التي تسبقك تُلغى عندما يصبح المستوى قديمًا، وبعضها لا يُلغى. وقد طابقت نسبة تراجع قدرها 30-40% عن كل ثانية كاملة بعيدًا عن السعر المعروض عمليات إعادة البناء لدي أفضل من أي من الطرفين المتطرفين.
- إذا كانت استراتيجيتك ستلغي الأمر وتعيد وضعه، فنمذج إعادة وضعه كأمر جديد في آخر المستوى الجديد. هذه هي الخطوة التي يتجاوزها الناس، وفيها يختبئ الوهم المتبقي.
ستعترض على الخطوة 2. أجل، أحيانًا تكون قريبًا من مقدمة الطابور لأنك وضعت أمرك لحظة تكوّن المستوى. لا بأس — قِس ذلك، ولا تفترضه. سجّل حجم الأوامر المعروضة وقت وضع الأمر، ودع البيانات تكشف نسبة أوامرك التي جاءت فعلًا مبكرًا. في استراتيجيتك بلغت 11%، لأن إشارتك تصدر بعد حركة سعرية، ما يعني أن المستوى الذي تنضم إليه موجود مسبقًا وعليه حشد بالفعل.
التنفيذات التي تحصل عليها هي التي تتمنى لو أنك لم تحصل عليها
والآن إلى الجزء الأهم فعلًا، وسبب انحياز قاعدة التجاوز الصارم.
فكّر في اللحظة التي يُستهلك فيها أمر الشراء المعروض بالكامل. يحدث ذلك عندما يكون ضغط البيع كبيرًا بما يكفي لالتهام المستوى كله. وبحكم التعريف، تكون هذه هي اللحظة التي يهبط فيها السوق متجاوزًا سعرك. أكثر التنفيذات التي تتيقن منها هي التنفيذات التي تجعلك فورًا في الجانب الخاسر من السوق.
قسّم تنفيذاتك بحسب كيفية حدوثها، واحسب mark-out بعد 60 ثانية:
| نوع التنفيذ | نسبة التنفيذات | Mark-out بعد 60s |
|---|---|---|
| تداول عند المستوى ثم ارتد السعر صعودًا | 38% | +3.1 bp |
| تداول عند المستوى وظل السعر ثابتًا | 21% | +0.2 bp |
| تجاوز السعر المستوى بمقدار 2+ ticks | 41% | −2.4 bp |
احتسب اختبارك الخلفي الساذج الفئات الثلاث كلها وسعّرها جميعًا كما لو كانت مجانية. أما قاعدة التجاوز الصارم فتمنحك الفئة الثالثة وحدها تقريبًا، ولهذا تراجعت حافتها أكثر مما تراجعت في محاكاة الطابور. لا واحدة منهما صحيحة. تمنحك محاكاة الطابور مزيجًا واقعيًا، وهذا المزيج هو جوهر اللعبة كلها: يكسبك تنفيذ الأوامر السلبية الفارق السعري، ثم يكلّفك الاختيار المعاكس، والنسبة بينهما هي استراتيجيتك الفعلية.
وما زال التصوير الذي استخدمه قسم الأسهم قديمًا صالحًا: أمر maker خيار مجاني كتبته للسوق. يمارسه الطرف الآخر حين يصبح ذلك مجديًا له. كان اختبارك الخلفي يجمع العلاوة وينسى أن للخيار جانبًا آخر له ثمن.
الصفقات التي لم تحصل عليها تغيّر الاستراتيجية، لا التكلفة فحسب
هذا هو الجانب الذي أريدك أن تتأمله أكثر من غيره. عندما تنمذج تنفيذ taker على نحو سيئ، تحصل على الصفقات الصحيحة بسعر خاطئ، ويعالج تصحيح الرسوم معظم المشكلة. أما عندما تنمذج تنفيذ maker على نحو سيئ، فتحصل على مجموعة صفقات خاطئة بالكامل. نحو 2,900 من أصل 4,180 إدخالًا لم تحدث قط. كان بعضها من أفضل إشاراتك، على شموع قفزت ثم انعكست، وهو بالضبط الشكل الذي يهرب فيه السوق من دونك.
لذا يحتاج مسار عدم التنفيذ في استراتيجيتك إلى منطق حقيقي. ماذا تفعل الاستراتيجية عندما لا يُنفَّذ الإدخال قبل أن تصبح الإشارة قديمة؟ هل تلاحق السعر بأمر taker وتدفع الفارق السعري إضافة إلى أثر التنفيذ؟ هل تعيد وضع الأمر بسعر أدنى وتقبل أساس دخول مختلفًا؟ أم تتجاوز الصفقة وتبقى خارج السوق؟ ينتج عن كل خيار منحنى رأسمال مختلف جوهريًا، ولا يعني أي منها «افترض أن الأمر نُفِّذ». في تجاربنا، أعادت إضافة قاعدة ملاحقة واقعية (العبور بعد 20 ثانية من دون تنفيذ، مع سقف انزلاق قدره 3 bp) نحو ثلث الصفقات المفقودة ونحو نصف الفجوة بين Sharpe الساذج وSharpe محاكاة الطابور. وهذه نتيجة مثيرة للاهتمام فعلًا، ولا تظهر إلا حين يكون نموذج التنفيذ واقعيًا بما يكفي لجعل السؤال ذا معنى.
اختبار سريع للتأكد من سلامة المنطق، في 10 دقائق: خذ سجل التداول الورقي المباشر واختبارك الخلفي للفترة نفسها. قارن معدل التنفيذ، لا PnL. إذا نفّذ الاختبار الخلفي 100% من الأوامر المعروضة بينما لم ينفذ التداول الورقي سوى 34%، فليس لديك مقارنة بين استراتيجيتين، بل خلل في نموذج التنفيذ. أصلح ذلك قبل أن تنظر إلى رقم عائد واحد.
وملاحظتان أصغر قبل أن أنهي
رفض أوامر post-only. إذا كنت تستخدم post-only لضمان فئة رسوم maker وتحرك دفتر الأوامر بين قرارك وإقرار المنصة، فسيُرفض الأمر بدلًا من أن يظل معروضًا. في سجلات التداول الورقي لدينا، تبلغ نسبة ذلك 3-6% من المحاولات على BTCUSDT خلال الساعات العادية، وتتجاوز 15% في الدقيقة التي تلي صدور مؤشر أسعار المستهلك الأمريكي. الأمر المرفوض ليس أمرًا نُفِّذ ولا أمرًا معروضًا لم يُنفذ؛ إنه صفقة لم توجد قط. وإذا لم يتضمن اختبارك الخلفي هذه الحالة، فسيكون عدد صفقاتك مبالغًا فيه تحديدًا في الظروف الأهم لك.
منع التداول الذاتي والبصمة التي تتركها أوامرك. بحجم 0.4 BTC لن تحرك BTCUSDT، فتجاوز هذه النقطة. لكنك ذكرت رغبتك في تشغيل ذلك على عقد perp لعملة بديلة متوسطة القيمة السوقية، حيث تقل القيمة الاسمية عند أفضل سعر في دفتر الأوامر غالبًا عن $15k. هناك، يشكّل أمرك بالفعل حصة مؤثرة من الطابور، ويشمل تقدير الحجم المتقدم عليك أثر وجود أمرك السابق. عندما يتجاوز حجمك نحو 10% من المستوى المعروض، يجب أن تراعي المحاكاة أن المشاركين الآخرين يستجيبون لوجودك. وبصراحة، عندها سأثق بالتداول الورقي أكثر من أي محاكاة يمكنني أو يمكنك كتابتها.
أعد تشغيله بمحاكاة الطابور وأرسل إليّ جدول mark-out مقسّمًا حسب نوع التنفيذ. إذا ظلت فئة الارتداد تحمل معظم الحافة ولم تلتهم فئة التجاوز كلّها، فقد يكون لديك شيء يستحق اختباره ورقيًا. أما إذا كان كل ما رأيته ناتجًا عن 2,900 تنفيذ لم تكن لتحصل عليها قط، فمن الأفضل أن تعرف ذلك الآن بدلًا من أن تمضي 4 أسابيع تراقب حسابًا ورقيًا لا يفعل ما وعد به دفتر الملاحظات.
→ جميع المقالات

