27 أغسطس 2026 · هندسة البيانات

كون رموزك آلة زمن: انحياز البقاء في الاختبارات التاريخية لعقود الكريبتو الدائمة

كون رموزك آلة زمن: انحياز البقاء في الاختبارات التاريخية لعقود الكريبتو الدائمة

أرسلت إليّ دفتر الملاحظات ليلة الأحد، ومنذ ذلك الحين وهو مفتوح على الشاشة الثانية. زخم مقطعي، أعلى 150 عقدًا دائمًا من Binance USDⓈ-M بحسب حجم التداول الدولاري خلال 30 يومًا، إعادة موازنة أسبوعية، شراء العُشر الأعلى وبيع العُشر الأدنى، من 2021-01 إلى 2026-06. Sharpe بقيمة 2.31، وأقصى تراجع 14.2%، ونموذج تكاليف بدا لي صادقًا: taker عند الدخول والخروج، احتساب التمويل لكل فترة، وحدّ انزلاق يتناسب مع حجمك مقارنةً بالسيولة المتاحة في دفتر الأوامر. أنجزت الأجزاء الصعبة كما ينبغي. ثم سألتني لماذا لم تحقق 6 أسابيع من التداول الورقي أي مكاسب، وهل تلاشت الميزة.

لم تتلاشَ. لم تكن موجودة أصلًا في الاختبار التاريخي. انظر إلى الخلية 4:

info = requests.get(BASE + "/fapi/v1/exchangeInfo").json()
symbols = [s["symbol"] for s in info["symbols"]
           if s["status"] == "TRADING" and s["quoteAsset"] == "USDT"]

استدعيت نقطة النهاية تلك في يونيو 2026، واستخدمت الإجابة لتحديد ما كان قابلًا للتداول في مارس 2021. كل رمز في تلك القائمة ظل موجودًا حتى يونيو 2026، بحكم طريقة إنشائها. هذا هو الخلل كله، وأثره يفوق أثر بقية نموذج التكاليف مجتمعةً.

2.31 → 0.74Sharpe: قائمة الناجين مقابل البيانات وفق نقطة زمنية
نحو 1 من 5من كونك في 2021 لم يعد موجودًا
380 KBلقطة يومية من exchangeInfo، مضغوطة بصيغة gzip

ما لن تخبرك به نقطة النهاية

لا يحتوي exchangeInfo على أي سجل تاريخي. لا مُعامل asOf ولا أرشيف ولا سجل تغييرات. إنه صورة للحظة الحالية، ولم تعدك Binance يومًا بأكثر من ذلك. عند شطب عقد، يُحذف مدخله من الاستجابة ويتوقف الرمز عن الوجود من منظور API. أدرجت Binance أكثر من 600 عقد دائم USDⓈ-M منذ 2019، وأوقفت أكثر من 100 منها بكثير. BTS وCOCOS وTOMO وRAY وFTT وSC، وذيل طويل من عقود موسم العملات البديلة في 2021، عاشت كل منها ربعًا مجيدًا ثم تلاشى تداولها حتى سحبتها المنصة.

اسأل نفسك: أي الرموز تحبها شاشة زخم مدتها 30 يومًا؟ ليس BTC. إنها تحب العملة التي تضاعف سعرها 3 مرات للتو بفعل قفزة الإدراج ودورة على تويتر. هناك تداخل كبير بين هذه المجموعة ومجموعة الرموز التي ستُشطب لاحقًا، وقد أزال مرشح الكون هذا التداخل.

أعدت تشغيل استراتيجيتك باستخدام أرشيف اللقطات لدينا، وكون وفق نقطة زمنية، والإشارة نفسها، والتكاليف نفسها، فكانت النتيجة Sharpe بقيمة 0.74 وتراجعًا بنسبة 31%. نحو خُمسي الفجوة سببهما رموز مشطوبة لم يكن مسموحًا لك بحيازتها أصلًا. وربع آخر سببه المشكلة المعاكسة، وهي أدقّ، وأظن أنها ستعجبك أقل.

الطرف الآخر من آلة الزمن: رموز لم تكن موجودة بعد

ميزتك هي العائد خلال 90 يومًا. لكن نافذتك المتحركة فيها min_periods=20، لأنك ضبطتها مرة واحدة كي لا ينسف الإحماء الربع الأول من العينة، ثم لم تراجعها. وهكذا يحصل عقد أُدرج منذ 21 يومًا على درجة زخم محسوبة من حركة سعرية امتدت 3 أسابيع بعد الإدراج، فيصنّف ضمن العُشر الأعلى كلما كان الإدراج ناجحًا تقريبًا، ثم يدخل محفظتك.

يمكن القول إن هذا الجزء مشروع. لكن هذا ليس كذلك: أعاد مزوّدك ملء بيانات بعض هذه الرموز ببيانات السوق الفوري أو المؤشر من فترة سبقت وجود العقد الدائم، لذا يسبق سجل الشموع لبعض العقود تاريخ onboardDate الخاص بها. يمكنك التحقق من ذلك في نحو دقيقة. اربط جدول الأسعار بتواريخ الإدراج، واحسب الصفوف السابقة للإدراج. في بياناتك 41 رمزًا لها شموع سابقة للإدراج، وأحدها يضيف، في صيف 2023، مكسبًا أسبوعيًا منفردًا قدره 6% إلى منحنى رأس المال، من مركز في عقد لن يوجد إلا بعد 9 أيام أخرى.

سلسلة الرمز ليست معرّفًا. إنها تسمية تؤجرها المنصة، وأحيانًا تؤجرها مرتين.

وهذا يقودنا إلى تغييرات الأسماء. أصبح MATICUSDT هو POLUSDT. وأصبح FTMUSDT هو SUSDT بعد تحويل بنسبة 1:1. أما وضع LUNA في مايو 2022 فأنتج LUNCUSDT، ثم LUNAUSDT جديدًا يشترك في جذر الرمز مع شيء فقد كل قيمته تقريبًا. إذا كان محمّل بياناتك يستخدم سلسلة الرمز كمفتاح ويُلحق بها أي ملفات يعثر عليها، فلديك على الأقل سلسلة واحدة فيها انقطاع لا يمثل حركة سعرية، وستقرأ ميزة الزخم ذلك الانقطاع بوصفه أقوى إشارة في المقطع العرضي.

وكل ما عدا ذلك يتغير من تحت قدميك

ما إن تقبل بأن قائمة الرموز تتغير بمرور الزمن، ينطبق المنطق نفسه على كل حقل آخر في تلك الاستجابة. أنت تستخدم قيم اليوم لكل هذه الحقول.

الحقلكيف يتغيرما الذي يتعطل
statusTRADING → SETTLING → اختفاءانحياز البقاء؛ مخارج وهمية بسعر إغلاق لم يُتداول قط
onboardDateإدراجات جديدة كل أسبوع؛ غائب عن الرموز المشطوبةتداول عقود قبل وجودها
tickSize / stepSizeتُعدّل مع تغير مستويات الأسعارتقريب الأوامر، وأسعار أوامر محددة كان سيُرفض قبولها
minNotionalترتفع مع الوقت في دفاتر الأوامر قليلة السيولةمراكز صغيرة كان موجّه التداول المباشر سيرفضها
fundingIntervalHours8h لسنوات، ثم 4h أو 1h لكثير من الرموزتكلفة الاحتفاظ منحرفة بمقدار 2–3× بالضبط في العملات البديلة التي تحتفظ بها شاشتك
شرائح الرافعة الماليةتُراجع المستويات وهامش الصيانةنمذجة التصفية والقدرة على استخدام الهامش

مشكلة التمويل هي الأشد في حالتك. تفترض حلقة احتسابك 3 دفعات يوميًا طوال السجل التاريخي. انتقلت نسبة معتبرة من محفظة العملات البديلة إلى التمويل كل 4 ساعات، وتقع المراكز القصيرة في العملات ذات التمويل المرتفع ضمن مصادر قدر كبير من PnL المحاكى. هذا ليس خطأ تقريب بسيطًا؛ بل خطأ بمقدار عامل كامل.

الشطب حدث بحد ذاته، وأنت لا تحاكيه

في إعادة التشغيل وفق نقطة زمنية، منحت الاستراتيجية مخرجًا سخيًا. عمليات الشطب الحقيقية تسير وفق جدول محدد: إعلان، عادةً قبل 7 إلى 14 يومًا، ثم فترة تقتصر فيها الأوامر على تقليل المركز، ثم تسوية إجبارية بسعر العلامة. الإعلان معلومة عامة ويمكنك التصرف بناءً عليها، لذا المحاكاة النزيهة تخرج عند إغلاق يوم الإعلان. لكن هذا الإغلاق يكون بالفعل أقل بنسبة 10-20% من الأسبوع السابق في شطب عملة بديلة اعتيادي، ويكون دفتر الأوامر قليل السيولة، لذا ينبغي لمكوّن الانزلاق أن يعرف أنه يعمل في ظروف مختلفة. إذا أعطاك محرّك التنفيذ سعر التسوية بلا أي أثر سعري، فأنت تجعل الأصول المحتضرة قابلة للتداول بقيمتها العادلة من دون أن تلاحظ ذلك.

إذا لم تكن قد أرشفت exchangeInfo، فالأمر لم يفت. لا يزال التفريغ العام على data.binance.vision/data/futures/um/monthly/klines/ يحتفظ بمجلدات الرموز المشطوبة بعد أن تنساها API بوقت طويل. استخرج قائمة المجلدات، وسيمنحك أول ملف شهري وآخر ملف لكل رمز نافذة إدراج وشطب عملية من دون أي مزوّد بيانات. هذا استنتاج، لا سجل موثق، ولن يستعيد أحجام الخطوة أو فترات التمويل. لكنه سيخبرك ما الذي كان موجودًا ومتى، وهذا يوفّر 80% مما تحتاجه يوم الاثنين.

ما أريدك أن تبنيه قبل أن تعود إلى الإشارة

  1. مهمة cron تسحب exchangeInfo يوميًا من كل منصة تبحث فيها، وتكتبها إلى تخزين الكائنات مع مفتاح حسب التاريخ. حجمها بعد ضغط gzip أقل من نصف ميغابايت. كلفة 10 سنوات لا تكاد تُذكر في S3، وتمنحك قدرة بحثية لا يمكنك شراؤها لاحقًا.
  2. سجل أصول مشتق من تلك اللقطات: صف واحد لكل (venue, symbol, valid_from, valid_to) مع مجموعة الحقول كاملة. قارن اللقطات المتعاقبة لإنشائه، وتعامل مع أي تغيير في حقل على أنه صف جديد.
  3. دالة للكون تتطلب طابعًا زمنيًا إلزاميًا. universe(ts)، وليس universe(). اجعل الإعداد الافتراضي يستحيل معه على أي شخص، بمن فيهم أنت مستقبلًا عند الساعة 1am، اختيار قائمة الناجين عن طريق الخطأ.
  4. تحققًا مسبقًا من الإدراج في محمّل البيانات: يجب ألا توجد أي شمعة قبل onboard_ts بيوم واحد. أوقف التشغيل عند الإخفاق، ولا تكتفِ بالتحذير.
  5. معرّف داخلي ثابت للأداة المالية يصمد أمام تغييرات الاسم، مع جعل الرمز مجرد سمة. اربط POL وMATIC بمعرّف واحد، وضع علامة على إعادة تسمية الوحدات كي يمنع منطق الاستمرارية ضمّ السلاسل عبرها.

نفّذ ذلك وأعد الاختبار. أتوقع أن تصل إلى نتيجة قريبة من 0.74 التي حصلت عليها، وعندها يصبح السؤال المثير هو: هل في نتيجة 0.74 التي تشمل الرموز الميتة ما يستحق التداول الورقي؟ ربما. فالزخم المقطعي في العقود الدائمة ليس بلا جدوى، وجزء مما يتبقى بعد إصلاح الكون هو عائد احتفاظ حقيقي من جانب البيع. وستجد أيضًا أن نتائج تداولك الورقي واختبارك التاريخي تبدآن بالتوافق، لأن التداول الورقي كان يعمل دائمًا على كون وفق نقطة زمنية. لم يكن لديه خيار آخر.

ملاحظة أخيرة: هذه ليست خصوصية في الكريبتو، لكنها أوضح فيه. ظل باحثو الأسهم يكافحون عوائد الشطب والرموز المعاد استخدامها منذ أن بدأت CRSP بتوفيرها، وتصل أسواق التنبؤ بالأمر إلى أقصاه: كل عقد ينتهي بحكم تصميمه، لذا لا يتكون الكون إلا من إدراجات وحالات انتهاء. إذا نقلت هذه الشاشة يومًا إلى Kalshi، فأنشئ سجل الأصول أولًا. ليس هناك نوع آخر من السجلات التاريخية.

انحياز البقاء، بيانات وفق نقطة زمنية، عقود الكريبتو الآجلة، الاختبار التاريخي، هندسة البيانات
→ جميع المقالات