Eugen Soloviov
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.
Articles
النتيجة السلبية الصادقة: عشرات الآلاف من الـ Backtests، خمس عملات كبرى، ولا ميزة متينة
ذروة سلسلة البحث والـ overfitting، وتنتهي بنتيجة سلبية — وهي النتيجة الصحيحة. بحث ثنائي الإطار الزمني على رمز واحد (ETHUSDT) وجد إعدادا يساوي +16.35% خارج العينة (out-of-sample) و+2.62% على عينة محجوزة (holdout) لم تُمس؛ لكن الـ Deflated Sharpe Ratio، بعد احتساب ~37,000 محاولة، قلّصه إلى 0.00. تمريرة عبر عدة أدوات على خمس عملات كبرى (ETH/BTC/SOL/BNB/XRP، بنحو 1.18M شمعة دقيقة واحدة لكل منها)، مع الاختيار وفق الوسيط خارج العينة، تقضي عليه نهائيا: النسخة الثنائية DSR 0.24 / PBO 0.264، والثلاثية DSR 0.14 / PBO 0.327 — كلتاهما تفشلان في اجتياز البوابات. البطل مربح على رمز واحد من أصل 5 وسلبي على البقية. هذا هو الغرض من منظومة مكافحة الـ overfitting: أن تمنعك من شحن أفضل ما في الضجيج على أنه alpha.
إثبات غياب التحيز الاستباقي في اختبارات الأداء الخلفي متعددة الأطر الزمنية: عبث بالمستقبل لتثبت أن الماضي لا يستطيع رؤيته
اختبارات الأداء الخلفي متعددة الأطر الزمنية تسرّب المستقبل عبر شمعة الإطار الزمني الأعلى التي لا تزال قيد التكوين ولم يُغلق سعرها النهائي بعد. لا يمكنك أن تطمئن بمجرد مراجعة الكود — يجب أن تختبره. نعيد إنتاج قاعدة "الشمعة المغلقة" الخاصة بالبوت الحي بدقة تامة، ثم نثبت غياب التسرب عبر فحص إزاحة المستقبل: نعبث بكل شمعة مستقبلية ونتأكد أن كل إشارة وصفقة في الماضي تبقى بلا تغيير حرفي (bitwise). النتيجة: 25 من 25 فحص تطابق، والفحص فعّال حقًا.
متى تؤتي وحدة معالجة الرسوميات ثمارها: نموذج roofline لمسح المعلمات، حيث رقم العنوان 167x هو في الحقيقة 27x خوارزمية × 6.2x عتاد
تقدم وحدة معالجة الرسوميات (GPU) على المعالج المركزي ينمو مع حجم الدفعة — من 54.5x عند توليفة واحدة لكل استدعاء حتى 359.6x عند 61 على الحساب المسبق لمؤشراتنا متعددة الأطر الزمنية — لأن المسح الصغير لا يستطيع استهلاك نفقات إطلاق النواة والنقل. نُفكك رقم عنوان بقيمة 167x إلى فوز خوارزمي بمقدار 27x يفيد المعالج المركزي أيضاً وفوز عتادي بمقدار 6.2x، ونُظهر أن التقدم الحقيقي لوحدة معالجة الرسوميات على أفضل معالج مركزي هو 3.2x فقط على إطار زمني واحد و6.2x على أطر متعددة، ونقدم دليل قرار حول مدى الاتساع الذي يجب أن يبلغه المسح قبل أن يستحق شراء وحدة معالجة رسوميات.
فخ الدقة العددية لـ GPU: كيف يُعيد اختبار خلفي بصيغة fp32 على Apple Metal نتائج عشوائية بصمت
وحدة معالجة الرسومات Metal من Apple لا تدعم float64 إطلاقاً. عند نقل اختبار خلفي متجهي (vectorized) إليها بصورة ساذجة، فإن صيغة WMA المغرية القائمة على المجموع التراكمي (prefix-sum) تفيض في fp32 — بخطأ نسبي أقصى يبلغ 211× — ومع ذلك يستمر التنفيذ ويُعيد أرقاماً تبدو معقولة. الحل ليس مزيداً من الدقة، بل صيغة مختلفة: التفاف مباشر ذو نافذة (direct windowed convolution) آمن في fp32 حتى دقة 8×10⁻⁷ وأسرع بـ 55.9 مرة من numba أحادي الخيط. هذا المقال يشرح الفخ، والحساب الكامن وراءه، وكيف تُثبت أنك لم تقع فيه.
بوابة الدقة: البحث من الخشن إلى الدقيق في الاختبار الرجعي يخدعك أسرع ما لم يُرتّب الوكيل الرخيص الإعدادات مثلما يفعل التقييم المكلف
البحث المتدرج / متعدد الدقة (drill-down) — مثل ASHA والتنصيف المتتالي (successive halving) و Hyperband — يفحص آلاف الإعدادات بتكلفة زهيدة ولا يرقّي إلى التقييم الكامل المكلف سوى الناجين منها. هذا تسريع حقيقي — لكنه ينهار بصمت إذا اختلف ترتيب الدقة المنخفضة عن ترتيب الدقة العالية. قسنا الارتباط بين ترتيب الطيّات: عند طيّة واحدة يمكن أن يبلغ معامل ارتباط الرتب لسبيرمان ρ قيمة 0.03 فقط (ترتيب شبه عشوائي)، ليرتفع إلى 0.43 ثم 0.67 ثم 0.78 ثم 0.91 مع تراكم الطيّات. الحل هو بوابة إلزامية واحدة — قِس ρ(الرخيص، الكامل) أولاً، وارفع تلقائياً الحد الأدنى للدقة إلى أول درجة يبلغ فيها ρ ≥ 0.5.
البحث العشوائي مقابل البحث الذكي: نقطة التقاطع هي تكلفة التقييم، لا الخوارزمية
عندما يكون الاختبار الخلفي الواحد رخيصًا، يفوز تسلسل Sobol العشوائي المخلوط الغبي بمعدل الإنتاجية الخام — بينما تدفع أدوات أخذ العينات "الذكية" (TPE وCMA-ES وASHA) ضريبة ask/tell في بايثون تُبطئها 20 مرة، فتقيّم نقاطًا أقل بكثير في نفس زمن التنفيذ الفعلي وتخسر. اجعل كل تقييم مكلفًا (أطر زمنية متعددة + طيات walk-forward) وتنقلب نقطة التقاطع. قسنا كلا النظامين، ولماذا تُعد دقة ترتيب الطيات (ρ@1 ترتفع من 0.03 إلى 0.43) الشرط المسبق لنجاح التقليم.
فضاء المعاملات ذو المحورين: لماذا ينبغي أن يكون معظم المسح لديك شبه مجاني
ليست كل المعاملات متساوية في تكلفة البحث. تنقسم معاملات الاستراتيجية إلى محور مكلف (المؤشرات — يعاد حسابها على السلسلة كلها) ومحور رخيص (عتبات القرار — تمريرة O(n) على إشارات محسوبة مسبقا). ولأن المؤشرات ثابتة تجاه العتبات، تحسبها مرة واحدة وتمسح آلاف تكوينات العتبات بمعدل ~5,600 تكوين/ثانية — أي أرخص بنحو 1,600x من إعادة الحساب لكل تكوين. إعادة تسعير للعنة الأبعاد.
ضريبة الإطار: عندما تكون مكتبة الاختبار الرجعي لديك أبطأ من حلقة pandas ساذجة
قِسنا أداء ثمانية محركات اختبار رجعي على عملية مسح معاملات واحدة متطابقة — 150k شمعة، و80 توليفة من تقاطعات HMA، مع تثبيت تكافؤ عدد الصفقات عند 2707. اثنان من أشهر الأطر المدفوعة بالأحداث جاءا أبطأ من حلقة pandas مكتوبة يدويا، بينما شغّل محرك متجهي/مُصرَّف العمل نفسه أسرع بنحو 13,000×. دراسة للعبء لكل شمعة الذي لم تُبنَ المكتبات الشائعة لتوزيعه على مدى الحساب.
احتمال الإفراط في تخصيص الاختبار الرجعي: هل تغلب بحثك على رمية عملة؟
نسبة Sharpe المخفّضة تُسعِّر الاستراتيجية الفائزة؛ وPBO تُسعِّر البحث الذي اختارها. يُشغّل التحقق المتقاطع المتماثل تركيبياً (CSCV) C(16,8) = 12,870 تقسيمة تدريب/اختبار عبر مصفوفة أداء 1000x200 ويسأل: هل يهبط الفائز داخل العينة إلى النصف السفلي خارج العينة؟ الفخ الذي يُخطئه الجميع تقريباً — قيمة العدم لـPBO هي 0.5، لا 1. على 200 استراتيجية بلا ميزة، ينهار أفضل Sharpe سنوية داخل العينة البالغة 1.98 إلى 0.06 خارج العينة وPBO = 0.476: رمية عملة، إفراط كامل في التخصيص. ازرع ميزة حقيقية (Sharpe سنوية 2.38) وتهبط PBO إلى 0.001، مع نجاة الـ3.73 داخل العينة إلى 2.34 خارج العينة. شبكة تقاطع متوسط متحرك على مسير عشوائي خالص لا تملك مهارة خارج العينة أيضاً — PBO تبلغ 0.463 بالمتوسط عبر 60 مصفوفة، لا تُميَّز إحصائياً عن حالة العدم — وعلى مصفوفة تمثيلية واحدة يكون السراب صارخاً: أفضل Sharpe داخل العينة تبلغ 2.33 تنهار إلى وسيط Sharpe خارج العينة قدره -0.22، PBO تبلغ 0.573، واحتمال خسارة 63%.
ضريبة IPC: ضع محرك الاختبار الرجعي خلف مقبس وتخسر 13% — لا يكاد أي منها بسبب المقبس
نقلنا نواة اختبار رجعي بلغة numba سطراً بسطر إلى Rust واستدعيناها عبر حدود العملية بأربع طرق مختلفة، مع بوابة تكافؤ تُؤكد تطابق PnL حتى آخر صفقة. شحن سلسلة الأسعار الكاملة (1.2 ميجابايت) عبر مقبس Unix يكلف ~2 مللي ثانية — حوالي 0.1% من المهمة. ترميز نفس الحمولة بصيغة JSON يكلف 1348x أكثر من البايتات الخام، والاستدعاءات الثرثارة لكل توليفة تُعيد شحن البيانات 80 مرة، ونمط استدعاء لكل شمعة سيدفع 2.1 ثانية من IPC خالص على مهمة مدتها 2.0 ثانية. الحد رخيص؛ الضريبة في كيفية عبوره.
نسبة Sharpe المخفّضة: كم عدد "الفائزين" في اختبارك الرجعي ينجون من الاختبار المتعدد؟
البحث عن المعلمات آلة لتصنيع الحظ. على ضوضاء خالصة — 1,000 استراتيجية بلا أي ميزة حقيقية — يبلغ متوسط أفضل Sharpe سنوية 1.63، ويُبلغ اختبار الدلالة الساذج عن اكتشاف بنسبة 100% من الوقت. نبني حقيقة أساسية مضبوطة ونُظهر أن نسبة Sharpe المخفّضة، وتشذيب Harvey-Liu، وReality Check لـWhite تستعيد الصدق: تنخفض الاكتشافات الكاذبة من 1.000 إلى 0.001-0.057، وتُحفظ الميزات الحقيقية فوق سقف الضوضاء بقوة اكتشاف ~1 — وفخ حقيقي واحد (الشبكات المترابطة) حيث تُفرط نسخة DSR الخام في التخفيض ويجب قراءة الحكم عبر نطاق كامل من مقدّرات عدد التجارب الفعّال، وليس مقدّراً واحداً.
تصميم دالة الهدف: المقياس الذي تُحسّنه يختار استراتيجيتك سراً
للبحث عن الاستراتيجية 'الأفضل' يجب أولاً تعريف 'الأفضل' — وذلك الرقم القياسي يختار الفائز خفية. على بيانات اصطناعية بميزة معروفة (600 بذرة، T=2000، 80 عتبة)، تُتوّج نسبة Sharpe الساذجة لكل صفقة فائزاً قماريا: تختار فائزاً بتعرض سوقي أقل من 5% في 56% من البذور وتتحلل في 57% منها — وفي أوضح بذرة، 8 صفقات تُسجّل نسبة Sharpe داخل العينة قدرها 21.09 تنهار إلى 0.13 خارج العينة. الإصلاح الصادق يكاد يكون مملاً: القياس على كامل الخط الزمني، الذي لا يتحلل أبداً (خارج العينة 1.71). يمكن لتقليص عدد الصفقات (conf_k) وحد أدنى للتعرض إصلاح مقياس لكل صفقة بأثر رجعي، لكن حتى بعد الإصلاح الكامل فإنهما فقط يُطابقان Sharpe كامل الخط الزمني (1.70 مقابل 1.71) — ولا يتفوقان عليه أبداً. قانون Goodhart، في اختبار رجعي، بحقيقة أساسية مضبوطة.