إليكم شمعة واحدة. عقد Binance USDⓈ-M دائم، BTCUSDT، والدقيقة التي تبدأ عند 13:46:00 UTC. وصلت من نقطة نهاية klines كمصفوفة عارية من اثنتي عشرة قيمة، وهي وحدة الإدخال الأكثر شيوعاً بفارق كبير في أبحاث التداول الكمي لدى الأفراد والجهات القريبة منهم. تكاد كل استراتيجية نولّدها تتعامل مع شيء على هذه الشاكلة.
فلنحللها إذاً، فهرساً بعد فهرس، ونرَ كم خطأً يرتكبه الاختبار الخلفي في قراءتها.
| الفهرس | القيمة | الاسم |
|---|---|---|
| 0 | 1773495960000 | وقت الافتتاح (ms) |
| 1 | "84120.50" | الافتتاح |
| 2 | "84177.90" | الأعلى |
| 3 | "84098.10" | الأدنى |
| 4 | "84163.40" | الإغلاق |
| 5 | "38.417" | حجم الأصل الأساسي (BTC) |
| 6 | 1773496019999 | وقت الإغلاق (ms) |
| 7 | "3232108.94" | حجم عملة التسعير (USDT) |
| 8 | 1204 | عدد الصفقات |
| 9 | "21.883" | حجم شراء taker من الأصل الأساسي |
| 10 | "1841203.55" | حجم شراء taker بعملة التسعير |
| 11 | "0" | تجاهل |
[0] و[6]: أي دقيقة هذه، وساعة من؟
وقت الافتتاح 1773495960000، ووقت الإغلاق 1773496019999. انتبهوا إلى الرقم الثاني: ينتهي بـ19999، أي قبل افتتاح الشمعة التالية بمللي ثانية واحدة. النافذة نصف مفتوحة، والمنصة تخبرك بذلك صراحةً. نصف أخطاء البيانات التي تتبعتها بدأت عندما عامل أحدهم طرفي النافذة على أنهما مشمولان، فاحتسب الصفقة عند الحد مرتين، أو عندما ضبط إعادة أخذ العينات بحيث استعارت كل شمعة مدتها 5 دقائق مللي ثانية من الشمعة المجاورة.
هذه الطوابع الزمنية هي توقيت محرك المطابقة لدى المنصة. ليست توقيت ساعتك، ولا ساعة إدخال البيانات لدى مزودك، وليست الساعة نفسها التي تستخدمها لقطة التمويل. عندما تربط سلسلة klines بسلسلة معدل التمويل أو الفائدة المفتوحة المسحوبة من نقطة نهاية مختلفة، فأنت تربط مصادر يتفاوت توقيتها بنحو ثانية واحدة، في معظم الأحيان. بالنسبة إلى استراتيجية مدتها 1-minute، فهذا خطأ توقيت نسبته 1.7% في كل صف مربوط. أما لأي شيء دون الدقيقة، فهو كارثي.
وهذه الشمعة مؤرخة عند افتتاحها. لا يمكن معرفة المعلومات الواردة فيها حتى 13:46:59.999. كل سؤال عن اصطلاح الفهرسة — هل أزيح بمقدار واحد، وهل أستخدم توقيت إغلاق الشمعة أم افتتاحها كوقت الحدث — هو في جوهره سؤال النظر إلى المستقبل نفسه متنكراً.
[1] "84120.50": سعر الافتتاح الذي لا يمكنك التداول عليه
الافتتاح هو سعر أول صفقة نُفذت داخل النافذة. إنها معاملة مكتملة بين شخصين آخرين. وبحلول ظهور الشمعة كصف في إطار البيانات لديك، يكون قد مضى على هذا السعر ستون ثانية.
أغلقت الشمعة السابقة عند 84109.80، لذا هناك حركة سعرية بقيمة $10.70 في الفجوة بين شمعتين متجاورتين مدتهما 1-minute. هذا يعادل 1.3 نقطة أساس، لا يظهر على الرسم البياني، ويبلغ نحو ربع رسوم taker. لا بأس. لكن انظر إلى السلسلة نفسها على عقد دائم لعملة بديلة أثناء إعلان مؤشر أسعار المستهلك الأمريكي، وستجد أن فجوات ما بين الشموع تتراوح بين 15 و40 نقطة أساس. الاختبار الخلفي الذي يصدر إشارة عند إغلاق الشمعة وينفذ عند افتتاح الشمعة التالية يفترض ضمناً أن الفجوة تساوي صفراً، وتكون صفراً تحديداً حين لا تكون الفجوة كذلك.
[2] و[3]: الأعلى "84177.90"، والأدنى "84098.10"
هذان الحقلان هما المكان الذي تموت فيه معظم محركات التنفيذ، لذا سيكون هذا القسم طويلاً.
الأعلى والأدنى هما أقصى سعرين لامستهما السوق. ولا يحملان أي معلومة عن الكمية أو المدة. في سجل الصفقات الخام لهذه الدقيقة نفسها، بلغ إجمالي كل ما نُفذ بسعر 84100.00 أو أقل 0.62 BTC عبر تسع صفقات خلال نافذة مدتها 1.4 ثانية. لذا فإن أمر وقف الخسارة في اختبار خلفي عند 84100 «يُنفذ» — وإذا كان مركزك 3 BTC، تكون قد استهلكت كامل دفتر الأوامر الظاهر أثناء الهبوط، ونُفذ ما تبقى من كميتك في طريق الارتداد بين 84105 و84130. تقول الشمعة إن الأدنى كان 84098.10. لكنها لا تقول إن ما تم تداوله هناك لم يتجاوز 52000$ بالقيمة الاسمية.
الاتجاه الآخر أسوأ، لأنه يجعلك تبدو محظوظاً. لنفترض أن لديك أمراً محدداً للبيع بسعر 84175 في دفتر الأوامر. أعلى الشمعة هو 84177.90، لذا ينفذ محرك ساذج أمرك عند 84175 ويسجل خصم maker بدلاً من تكلفة taker. يتوقف حدوث التنفيذ فعلياً على موقعك في طابور ذلك المستوى السعري، وهو أمر لا تستطيع الشمعة معرفته، وعلى الأرجح لم تسجله أنت قط. ملامسة السعر لا تعني تنفيذ الأمر.
القاعدة التي اعتمدناها في محرك التنفيذ لدينا: لا يُنفذ الأمر المحدد القائم إلا إذا تجاوزت التداولات ذلك المستوى، لا إذا بلغته فحسب. أما التنفيذ عند سعر الحد الأقصى نفسه فيتطلب دليلاً على الحجم عند ذلك السعر من سجل الصفقات، وإلا نرفضه. أدى ذلك إلى حذف نحو 6% من الصفقات من دفتر تداول نموذجي قائم على الارتداد نحو المتوسط، وخفّض Sharpe المرشح من 1.9 إلى 1.1. لم يكن ذلك المرشح حقيقياً قط؛ كانت قاعدة التنفيذ أول من تحلّى بالصدق الكافي ليقول ذلك.
وهناك فخ مرتبط بذلك: المسار داخل الشمعة. إذا امتد نطاق شمعة عبر مستوى وقف الخسارة وهدف جني الأرباح معاً، فلا تستطيع بيانات OHLCV إخبارك أيهما جاء أولاً. على كل محرك أن يختار اصطلاحاً. نفترض نحن دائماً أن الوقف يأتي أولاً، وهو افتراض متشائم وخاطئ أحياناً، لكنه لا يولّد فوزاً زائفاً أبداً. إذا افترض محركك أن جني الأرباح يأتي أولاً، فستحوّل الشموع واسعة النطاق الغموض إلى أرباح مصطنعة، وهذه الشموع تحديداً هي التي تهيمن على توزيع أرباحك وخسائرك.
[4] "84163.40": أقل أرقام الشمعة ثباتاً
الإغلاق هو آخر صفقة نُفذت في النافذة. هذا كل ما في الأمر. قد يكون صفقة صغيرة جداً بحجم 0.002 BTC نفذها روبوت ليكمل تخفيض مركز عند 13:46:59.8. وهذه الحركة المنفردة الاعتباطية بطبيعتها هي ما تستخدمه معظم خطوط معالجة الأبحاث لحساب كل إشارة، وتقييم كل مركز، وتقييم كل خروج.
على عقود BTC الدائمة، يكاد الأمر لا يهم؛ أما على عقد دائم لعملة بديلة قليلة السيولة عند 04:00 UTC، فيهمّ كثيراً، وقد يتجاوز الفرق بين إغلاق منصتين للدقيقة نفسها كامل هامش الربح لكل صفقة لديك. عندما يعتمد ربح وخسارة استراتيجية على الإغلاق تحديداً، نعيد تشغيلها مع التقييم بسعر العلامة لدى المنصة بدلاً منه؛ فهذا السعر مشتق من المؤشر ويصعب التلاعب به بكثير. وإذا اختلفت النتائج، فهذا يعني أن الاستراتيجية كانت تتداول أثراً مصطنعاً في البيانات.
[5] و[7]: "38.417" و"3232108.94"، الحجم مقاساً بماذا؟
الحجم الأساسي مقاس بـBTC، وحجم عملة التسعير مقاس بـUSDT. كلاهما متاح هنا، وهذا تيسير لا تقدمه كل المنصات. سبب أهمية ذلك هو تجميع البيانات من منصات متعددة. العقود المقوّمة بالعملة تُسعّر بعدد عقود بقيمة اسمية قدرها $100. وبعض موجزات الأسهم تعرض الأحجام بوحدات التداول القياسية. أما منصات أسواق التنبؤ فتعرض عدد الأسهم، حيث يمثل السهم مطالبة ثنائية مقوّمة بالدولار. جمع «الأحجام» عبر مجموعة مختلطة من دون توحيدها إلى وحدة قيمة اسمية واحدة ينتج ترتيباً للسيولة محض هراء، وسيكون هراءً يبدو مستقراً بما يكفي ليمرّ من المراجعة.
وحّدوا كل شيء إلى القيمة الاسمية بعملة التسعير عند إدخال البيانات. احتفظوا بالحقل الخام أيضاً، لكن لا تسمحوا لأي استراتيجية بالاطلاع عليه.
[8] 1204: الحقل الذي ينبغي أن يحدد نموذج أثر السوق لديك
قسمة الحجم الأساسي على عدد الصفقات تعطينا متوسط حجم صفقة قدره 0.032 BTC، أي نحو $2,700. إذا أرادت استراتيجيتك المرشحة الدخول بقيمة $250,000 دفعة واحدة، فهي تطلب حجماً يعادل نحو 92 ضعف حجم الصفقة المعتادة في تلك الدقيقة. هذا الرقم، لا افتراض انزلاق عام بقيمة 5 نقاط أساس، هو ما ينبغي أن يقود حد أثر السوق ذي الجذر التربيعي. نحسب معدل المشاركة لكل شمعة كعمود أساسي، ونرفض الاستراتيجيات التي يتجاوز فيها متوسط الدخول بضعة بالمئة من القيمة الاسمية للشمعة، لأن كل ما يأتي بعدها محض خيال.
كما يكشف عدد الصفقات الدقائق الغريبة بتكلفة زهيدة. الحجم طبيعي، لكن عدد الصفقات هبط إلى 11؟ نفّذ أحدهم صفقة كتلية. الحجم طبيعي، وعدد الصفقات 9,000؟ إنها موجة تصفيات تُنفذ على دفعات صغيرة.
[9] و[10]: "21.883"، الحقل الذي يتخلص منه الجميع
حجم شراء taker من الأصل الأساسي. كان 21.883 من أصل 38.417 BTC في هذه الشمعة بمبادرة من المشترين، لذا فإن صافي حجم التداول الموقّع هو +5.349 BTC، وتوزيع الطرف المبادر 57/43 لصالح المشترين. تمنحك المنصة اختلال تدفق الأوامر مجاناً، في حقل لا يقرأه معظم الناس لأن pandas لم يسمّ العمود نيابةً عنهم.
لا أزعم أن هذا يتنبأ بالعوائد بمفرده؛ استراتيجيات صافي الحجم الساذجة من أضمن الطرق للتبرع لحساب الرسوم. لكنه مقياس مختلف فعلاً عن السعر، ومتاح في الطلب نفسه الذي كنت ترسله على أي حال، كما يتيح لك التمييز بين ارتفاع اشترى فيه المشترون وبين ارتفاع حدث لأن البائعين انسحبوا. يبدو الاثنان متطابقين في OHLC، لكن سلوكهما يختلف بعد عشر دقائق. يعتبر وكيل الأبحاث لدينا أن الفرضية التي تتجاهل توزيع taker على منصة تنشره تترك أدلة مهمة دون استغلال.
[11] "0": تجاهل — وكل ما لا يتضمنه هذا السجل
الفهرس 11 حقل متوقف، وقيمته صفر دائماً. والأهم هو قائمة الأشياء التي لا تحتويها هذه الشمعة: لا أفضل طلب شراء، ولا أفضل طلب بيع، ولا فارق سعري، ولا عمق دفتر أوامر، ولا معدل تمويل، ولا فائدة مفتوحة، ولا تصفيات، ولا سعر علامة، ولا سعر مؤشر. والأهم أن السجل لا يتيح معرفة ما إذا كان أمرك أنت سيُنفذ بصفة maker أم taker، وهذا هو الفرق بين دفع 0.045% وكسب 0.01% على هذه المنصة.
لذا فإن أي نموذج رسوم مبني على klines وحدها ليس إلا افتراضاً يرتدي ثوب رقم. نعالج ذلك بإلزام كل استراتيجية بالإفصاح عن أسلوب تنفيذها مسبقاً، ثم نفرض رسوم taker على كل ما لا يثبت خلاف ذلك.
الشمعة التي لم تظهر قط
النقطة الأخيرة، وهي الأشد تأثيراً خارج العملات الكبرى. الدقيقة التي لا تتضمن أي صفقات لا تنتج شمعة kline إطلاقاً. وغالباً ما تملأها الجهات المزودة والمكتبات بالاستعانة بالقيمة السابقة: الافتتاح = الأعلى = الأدنى = الإغلاق = الإغلاق السابق، والحجم 0. ويحسب مؤشرك بياناته بسلاسة. وترى استراتيجيتك صفاً صالحاً وتصدر إشارة في دقيقة لم يتداول فيها أحد في العالم ذلك الأصل.
في أحد العقود الدائمة متوسطة القيمة السوقية التي أدخلنا بياناتها، لم تتضمن 4.1% من شموع 1-minute خلال فترة اثني عشر شهراً أي صفقات. كانت استراتيجية مرشحة للارتداد نحو المتوسط على ذلك الرمز تضع 38% من أوامر دخولها على شموع اصطناعية، لأن الأسعار الاصطناعية المسطحة تغري كل ما يقيس الانحراف عن متوسط متحرك. وبدت نتائج اختبارها الخلفي رائعة. لكنها كانت تتداول فجوات البيانات.
ولهذا صار يحمل مستوى إدخال البيانات الآن قيمة منطقية synthetic لكل شمعة، وتنتقل هذه القيمة عبر كل إعادة أخذ عينات، ويُسقط اختبار التحقق الشامل أي استراتيجية تتجمع صفقاتها عليها. عمود بسيط، لكنه أسقط مرشحين أكثر من أي مؤشر كتبناه على الإطلاق.
اثنتا عشرة قيمة. أربع يُساء فهمها بانتظام، واثنتان يُتخلص منهما بانتظام، وفئة كاملة غائبة عن السجل ويتخيلها المحرك. قبل اختبارك الخلفي التالي، استخرج شمعة خاماً واحدة من مخزنك واقرأ كل حقل بصوت عالٍ، وقارنه بما تفترضه آلية التنفيذ لديك. يستغرق الأمر عشرين دقيقة، ولم أرَ أحداً يفعله من دون أن يكتشف شيئاً.
→ جميع المقالات

