← العودة إلى قائمة المقالات
March 10, 2026
5 دقائق للقراءة

التحقق متعدد الرموز: اختبر استراتيجيتك على جميع الأزواج

التحقق متعدد الرموز: اختبر استراتيجيتك على جميع الأزواج
#algotrading
#backtest
#validation
#multi-symbol
#diversification
#crypto

مقال من سلسلة "اختبارات رجعية بلا أوهام"

لقد حسّنت استراتيجية على ETHUSDT. بيانات 25 شهرًا، أكثر من 12 معاملاً. يُظهر الاختبار الرجعي PnL بنسبة +55%، و500 صفقة، وMaxDD بنسبة -0.9%، ووقت فتح المركز 15%. منحنى رأس المال يرتفع بسلاسة. المعاملات اجتازت تحليل الهضبة — يبدو الحد الأمثل واسعًا. التحليل الأمامي يعطي WFER > 0.6. محاكاة مونتي كارلو تُظهر المئوية الخامسة إيجابية.

كل شيء مثالي. باستثناء شيء واحد: لقد اختبرت الاستراتيجية على أداة واحدة فقط.

تُطلق نفس الخوارزمية بنفس المعاملات على BTCUSDT — PnL بنسبة +8%. على SOLUSDT — PnL بنسبة -12%. على DOGEUSDT — PnL بنسبة -34%. الاستراتيجية التي اجتازت جميع الفحوصات على ETH تتضح أنها غير مربحة على معظم الأزواج الأخرى.

هذا ليس خطأ برمجيًا. هذا هو فخ الرمز الواحد — أحد أكثر أشكال الإفراط في التكيف شيوعًا وخبثًا في التداول الخوارزمي.

فخ الأداة الواحدة

فخ الرمز الواحد: منحنى رأس مال واحد مشرق محاط باستراتيجيات فاشلة على أصول أخرى

تحسين استراتيجية على رمز واحد هو في الأساس ملاءمتها لديناميكيات أسعار أصل معين. حتى لو أجريت تحليلًا أماميًا، حتى لو أظهرت محاكاة مونتي كارلو فترات ثقة واسعة — فقد تم إجراء كل هذه الفحوصات ضمن سلسلة زمنية واحدة.

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

إذا كانت الاستراتيجية مربحة فقط على ETHUSDT — فقد التقطت ليس عدم كفاءة السوق، بل البنية المحددة لسلسلة أسعار ETH:

  • أنماط شموع مميزة خاصة بـ ETH
  • مستويات تقلب محددة تم ضبط العتبات عليها
  • خصائص السيولة والبنية المجهرية لهذا الزوج بالذات
  • الارتباط مع BTC المميز لفترة معينة

هذه ليست ميزة تنافسية. هذا ملاءمة منحنى على مستوى الأداة.

مجموعات الرموز (المستويات) في سوق العملات المشفرة

مصفوفة خصائص مستويات الرموز

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

المستوى 1: الرقائق الزرقاء (BTC، ETH)

سيولة عالية، تقلب منخفض نسبيًا، تدفق مؤسسي. ارتباط مع الماكرو (S&P 500، DXY، أسعار الفيدرالي). دفاتر أوامر عميقة، فروق أسعار ضيقة، معدلات تمويل مستقرة. التقلب اليومي النموذجي: 2-4%.

المستوى 2: القيمة السوقية الكبيرة (SOL، BNB، ADA، XRP، AVAX)

سيولة متوسطة، تقلب مرتفع. غالبًا ما تكون التحركات مدفوعة بديناميكيات القطاع (L1 مقابل L2، DeFi مقابل البنية التحتية). معدلات التمويل أكثر تقلبًا. الفروق أوسع. التقلب اليومي النموذجي: 4-6%.

المستوى 3: القيمة السوقية المتوسطة (DOGE، SHIB، PEPE، ARB، OP)

عملات الميم ورموز السرديات. تقلب عالٍ، ارتباط منخفض مع العوامل الأساسية. التحركات تحددها وسائل التواصل الاجتماعي والإدراجات والسرديات. دفاتر أوامر رقيقة على بعض المنصات. التقلب اليومي النموذجي: 6-10%.

المستوى 4: القيمة السوقية الصغيرة (إدراجات جديدة)

تقلب شديد، دفاتر أوامر رقيقة، خطر التلاعب. غالبًا ما يكون التاريخ غير كافٍ لاختبار رجعي كامل. التقلب اليومي النموذجي: 10-20%+.

جدول ملخص الخصائص

الخاصية المستوى 1 المستوى 2 المستوى 3 المستوى 4
التقلب اليومي 2-4% 4-6% 6-10% 10-20%+
متوسط الفرق (العقود الدائمة) 0.01-0.02% 0.02-0.05% 0.05-0.15% 0.1-0.5%+
عمق دفتر الأوامر (أعلى 5 نقاط أساس) $5-50M $1-10M $100K-2M $10K-200K
معدل التمويل (متوسط القيمة المطلقة) 0.005-0.01% 0.01-0.03% 0.02-0.08% 0.05-0.2%+
الارتباط مع BTC 0.85-0.95 0.6-0.85 0.3-0.7 0.1-0.5
الحد الأدنى للتاريخ 5+ سنوات 2-5 سنوات 6 أشهر - 3 سنوات أقل من 6 أشهر

كل مستوى هو "عالم" منفصل ببنيته المجهرية الخاصة. الاستراتيجية المضبوطة للمستوى 1 تدخل بيئة غريبة عند الانتقال إلى المستوى 3.

منهجية التحقق متعدد الرموز

منهجية التحقق متعدد الرموز: التحسين، اختبار نفس المستوى، اختبار مستويات أخرى، تحليل النتائج

الخطوة 1: التحسين على رمز واحد

اختر رمزًا للتحسين — مثلاً ETHUSDT. شغّل خط الأنابيب الكامل: تحسين Optuna، تحليل الهضبة، التحليل الأمامي. ثبّت المعاملات.

الخطوة 2: الاختبار على رموز من نفس المستوى

شغّل الاستراتيجية بنفس المعاملات على 5-10 رموز من نفس المستوى. بالنسبة للمستوى 1 هذا محدود (BTC + ETH)، لكن للمستوى 2 والمستوى 3 هناك رموز كافية.

الخطوة 3: الاختبار على رموز من مستويات أخرى

شغّل الاستراتيجية على 3-5 رموز من كل مستوى آخر. هذا أصعب اختبار: إذا عملت الاستراتيجية على ETHUSDT (المستوى 1) وعلى DOGEUSDT (المستوى 3)، فإن احتمال ملاءمة المنحنى يكون أقل ما يمكن.

الخطوة 4: تحليل النتائج حسب المجموعة

اجمع المقاييس حسب المستوى وقيّم المتانة عبر الرموز.

المقاييس لكل رمز

لكل رمز، سجّل:

  • PnL — العائد الإجمالي
  • MaxDD — الحد الأقصى للتراجع
  • N trades — عدد الصفقات
  • Win rate — نسبة الصفقات المربحة
  • PnL/active day — العائد لكل وحدة زمن نشط (المزيد من التفاصيل في PnL حسب الوقت النشط)

معايير النجاح

تجتاز الاستراتيجية التحقق متعدد الرموز إذا:

  1. مربحة على 60% أو أكثر من رموز نفس المستوى
  2. متوسط PnL عبر المجموعة إيجابي
  3. MaxDD لا يزداد بشكل كبير (لا يزيد عن 2-3 أضعاف مقارنة برمز التحسين)
  4. إذا كانت الاستراتيجية مربحة فقط على رمز التحسين — ارفضها

مثال: ثلاث استراتيجيات، ثلاث نتائج

مقارنة ثلاث استراتيجيات: A (أخضر، نجاح جزئي)، B (سماوي، متين)، C (أحمر، مفرط التكيف)

لنتأمل مثالاً ملموسًا. ثلاث استراتيجيات (الاستراتيجية A، الاستراتيجية B، الاستراتيجية C)، مُحسَّنة على ETHUSDT، مُختبَرة على 12 رمزًا عبر أربعة مستويات.

الاستراتيجية A (مُحسَّنة على ETHUSDT)

المعاملات: PnL بنسبة +55%، حوالي 500 صفقة، حوالي 15% وقت نشط، MaxDD حوالي 0.9%.

الرمز المستوى PnL MaxDD عدد الصفقات معدل الفوز PnL/يوم نشط
ETHUSDT* 1 +55.2% -0.9% 491 52.1% 0.48%
BTCUSDT 1 +31.4% -1.8% 478 50.8% 0.27%
SOLUSDT 2 +22.7% -3.1% 512 49.2% 0.18%
BNBUSDT 2 +18.3% -2.7% 467 48.9% 0.16%
AVAXUSDT 2 +8.1% -4.5% 498 47.6% 0.07%
ADAUSDT 2 -3.2% -6.1% 445 46.1% -0.03%
DOGEUSDT 3 -12.8% -9.4% 531 44.3% -0.10%
SHIBUSDT 3 -18.7% -12.1% 487 43.1% -0.16%
PEPEUSDT 3 -24.3% -14.8% 556 42.7% -0.18%
ARBUSDT 3 -7.4% -7.2% 419 45.8% -0.07%
OPUSDT 3 -5.1% -6.8% 402 46.2% -0.05%

* — رمز التحسين

النتائج حسب المستوى:

المستوى الرموز المربحة متوسط PnL متوسط MaxDD
المستوى 1 2 2 (100%) +43.3% -1.4%
المستوى 2 4 3 (75%) +11.5% -4.1%
المستوى 3 5 0 (0%) -13.7% -10.1%

الحكم: الاستراتيجية A تعمل على المستوى 1-2 لكنها تفشل تمامًا على المستوى 3. هذه استراتيجية نموذجية مضبوطة لبيئة منخفضة التقلب. لمحفظة الرقائق الزرقاء والقيمة السوقية الكبيرة — مقبولة. للاستخدام العام — لا.

الاستراتيجية B (مُحسَّنة على ETHUSDT)

المعاملات: PnL بنسبة +25%، حوالي 40 صفقة، حوالي 5% وقت نشط.

الرمز المستوى PnL MaxDD عدد الصفقات معدل الفوز
ETHUSDT* 1 +25.1% -2.3% 38 57.9%
BTCUSDT 1 +21.8% -2.8% 41 56.1%
SOLUSDT 2 +19.4% -3.5% 44 54.5%
BNBUSDT 2 +16.7% -3.1% 37 54.1%
AVAXUSDT 2 +12.3% -4.2% 42 52.4%
ADAUSDT 2 +8.9% -4.8% 39 51.3%
DOGEUSDT 3 +4.2% -6.7% 48 47.9%
SHIBUSDT 3 -1.3% -8.4% 45 46.7%
PEPEUSDT 3 -3.8% -9.1% 52 46.2%
ARBUSDT 3 +6.1% -5.8% 40 50.0%
OPUSDT 3 +3.7% -6.2% 38 50.0%

النتائج حسب المستوى:

المستوى الرموز المربحة متوسط PnL متوسط MaxDD
المستوى 1 2 2 (100%) +23.5% -2.6%
المستوى 2 4 4 (100%) +14.3% -3.9%
المستوى 3 5 3 (60%) +1.8% -7.2%

الحكم: الاستراتيجية B مربحة على 9 من 11 رمزًا (82%). متوسط PnL إيجابي عبر جميع المستويات. MaxDD يزداد بشكل متوقع مع المستوى. هذه استراتيجية متينة بميزة سوقية حقيقية. على الرغم من PnL الأكثر تواضعًا على رمز التحسين (+25% مقابل +55%)، فإن الاستراتيجية B أكثر موثوقية بكثير من الاستراتيجية A.

الاستراتيجية C (مُحسَّنة على ETHUSDT)

المعاملات: PnL بنسبة +300%، حوالي 400 صفقة، حوالي 45% وقت نشط، MaxDD حوالي 17%.

الرمز المستوى PnL MaxDD عدد الصفقات معدل الفوز
ETHUSDT* 1 +301.2% -17.1% 418 53.8%
BTCUSDT 1 +42.7% -28.4% 395 48.6%
SOLUSDT 2 -18.3% -41.2% 456 44.1%
BNBUSDT 2 +12.1% -33.7% 387 46.8%
AVAXUSDT 2 -31.4% -52.8% 471 42.3%
ADAUSDT 2 -44.7% -58.1% 412 40.5%
DOGEUSDT 3 -67.2% -74.3% 528 38.1%
PEPEUSDT 3 -72.1% -81.6% 574 37.4%

الحكم: الاستراتيجية C هي حالة كلاسيكية من الإفراط في التكيف. +301% على ETHUSDT، لكن خسائر كارثية على معظم الأزواج الأخرى. MaxDD على المستوى 3 يتجاوز 70% — هذا تدمير لرأس المال. الاستراتيجية التقطت أنماطًا فريدة لـ ETH، وليس عدم كفاءة السوق. مرفوضة.

لماذا تنهار الاستراتيجيات على رموز أخرى

أربعة عوامل تكسر الاستراتيجيات: التقلب، السيولة، البنية المجهرية، وتحولات النظام

1. عدم تطابق التقلب

السبب الأكثر شيوعًا. معاملات الاستراتيجية مضبوطة على مستوى تقلب محدد. إذا كانت الاستراتيجية تستخدم عتبة دخول 2% — بالنسبة لـ ETH بتقلب يومي 3%، هذا فلتر معقول. بالنسبة لـ DOGE بتقلب يومي 8% — هذه العتبة تُفعَّل كثيرًا جدًا، مما يولّد كتلة من الإشارات الكاذبة.

بالمثل، وقف خسارة بنسبة 1% مناسب لـ ETH، لكن بالنسبة لـ PEPE فهو "ضوضاء" طبيعية، والوقف يُضرب عشرات المرات يوميًا.

2. اختلافات السيولة

الاستراتيجية تفترض تنفيذ فوري للأوامر بالسعر الحالي. على BTCUSDT بعمق دفتر أوامر 50Mضمن5نقاطأساس—هذاواقعي.علىARBUSDTبعمق50M ضمن 5 نقاط أساس — هذا واقعي. على ARBUSDT بعمق 200K — أمرك بقيمة $10K سيحرك السعر، والتنفيذ الفعلي سيكون أسوأ بنسبة 0.05-0.2%. عبر 500 صفقة، هذا 25-100% مفقودة من الانزلاق وحده.

3. البنية المجهرية للسوق

لكل أداة بنيتها المجهرية الخاصة:

  • معدلات التمويل: على BTC، التمويل إيجابي باستمرار في السوق الصاعدة (+0.01% كل 8 ساعات). على عملات الميم، يمكن أن يقفز التمويل من -0.3% إلى +0.5%. المزيد من التفاصيل — في معدلات التمويل تقتل رافعتك المالية.
  • الفرق: على المستوى 1 الفرق 0.01%، على المستوى 4 — 0.5%. استراتيجية بأخذ أرباح صغير لا يمكن أن تكون مربحة عندما يتجاوز الفرق حجم الأخذ.
  • أنماط التلاعب: الفتائل، التلاعب بالأوامر، التداول الوهمي — تتجلى بشكل مختلف على كل مستوى.

4. حساسية النظام

العملات البديلة تتصرف بشكل مختلف في مراحل السوق المختلفة:

  • في الاتجاه الصاعد، العملات البديلة تتفوق على BTC (بيتا > 1)
  • في الاتجاه الهابط، العملات البديلة تنخفض أكثر من BTC
  • في السوق الجانبي، قد ترتبط العملات البديلة مع BTC أو تتحرك وفق سردياتها الخاصة

استراتيجية مُحسَّنة في مرحلة واحدة على رمز واحد قد تكون مضبوطة بشكل مثالي على التأخر/التقدم لذلك الرمز المحدد بالنسبة لـ BTC — وهذا التأخر/التقدم سيتغير عند تحول النظام.

تحجيم المعاملات التكيفي

تحجيم المعاملات التكيفي: مقياس نسبة التقلب مع شرائح المعاملات تتحول من عتبات ضيقة إلى واسعة

تشغيل استراتيجية بمعاملات متطابقة على جميع الرموز غير صحيح. لكن إعادة التحسين الكامل على كل رمز يُبطل الغرض من التحقق متعدد الرموز (تصبح المعاملات "أصلية" لكل رمز).

الحل الوسط هو تطبيع المعاملات حسب التقلب:

import numpy as np

def scale_params_by_volatility(
    base_params: dict,
    optimization_symbol_vol: float,
    target_symbol_vol: float,
    vol_sensitive_params: list[str],
) -> dict:
    """
    Scale strategy parameters by target symbol volatility.

    Args:
        base_params: parameters optimized on the original symbol
        optimization_symbol_vol: daily volatility of the optimization symbol
        target_symbol_vol: daily volatility of the target symbol
        vol_sensitive_params: list of volatility-sensitive parameters
    """
    vol_ratio = target_symbol_vol / optimization_symbol_vol
    adjusted = base_params.copy()

    for param in vol_sensitive_params:
        if param in adjusted:
            adjusted[param] = adjusted[param] * vol_ratio

    return adjusted

base_params = {
    "entry_threshold": 0.02,     # 2% — entry threshold
    "stop_loss": 0.01,           # 1% — stop loss
    "take_profit": 0.03,         # 3% — take profit
    "trailing_stop": 0.008,      # 0.8% — trailing stop
    "atr_multiplier": 2.5,       # ATR multiplier (not scaled)
    "rsi_period": 14,            # RSI period (not scaled)
    "ma_fast": 10,               # fast MA (not scaled)
    "ma_slow": 50,               # slow MA (not scaled)
}

vol_sensitive = ["entry_threshold", "stop_loss", "take_profit", "trailing_stop"]

eth_vol = 0.032     # 3.2%
doge_vol = 0.081    # 8.1%

doge_params = scale_params_by_volatility(
    base_params, eth_vol, doge_vol, vol_sensitive
)

print("ETH params:", {k: f"{v:.4f}" for k, v in base_params.items() if k in vol_sensitive})
print("DOGE params:", {k: f"{v:.4f}" for k, v in doge_params.items() if k in vol_sensitive})

المخرجات:

ETH params:  {'entry_threshold': '0.0200', 'stop_loss': '0.0100', 'take_profit': '0.0300', 'trailing_stop': '0.0080'}
DOGE params: {'entry_threshold': '0.0506', 'stop_loss': '0.0253', 'take_profit': '0.0759', 'trailing_stop': '0.0203'}

زاد وقف الخسارة من 1% إلى 2.53% — مناسب لتقلب DOGE اليومي البالغ 8.1%. بدون التحجيم، سيُضرب وقف 1% بـ"الضوضاء" عشرات المرات.

مهم: حجّم فقط عتبات السعر (الدخول، الأوقاف، الأخذ). فترات المؤشرات (RSI، MA) والمضاعفات (مضاعف ATR) عادةً لا تُحجَّم — فهي مُطبَّعة بالفعل بالتقلب من خلال المؤشر نفسه.

وضعان للتحقق

  1. الوضع الصارم (بدون تحجيم): التشغيل بمعاملات متطابقة. اختبار المتانة المطلقة. إذا كانت الاستراتيجية مربحة — فالميزة قوية.

  2. الوضع التكيفي (مع تحجيم): التشغيل بمعاملات مُطبَّعة. اختبار متانة منطق الاستراتيجية، مع مراعاة اختلاف مستويات التقلب.

نوصي بتشغيل كلا الاختبارين. الوضع الصارم — لتقييم "قوة" الميزة. الوضع التكيفي — للتطبيق العملي.

درجة المتانة عبر الرموز

رادار المتانة متعدد الرموز

للتقييم الكمي للمتانة متعددة الرموز، نقدم مقياسًا مركبًا — Cross-Symbol Robustness Score (CSRS).

الصيغة

CSRS=w1Rprofit+w2Rpnl+w3Pconsistencyw4Pvariance\text{CSRS} = w_1 \cdot R_{profit} + w_2 \cdot R_{pnl} + w_3 \cdot P_{consistency} - w_4 \cdot P_{variance}

حيث:

  • RprofitR_{profit} — نسبة الرموز المربحة:

Rprofit=NprofitableNtotalR_{profit} = \frac{N_{profitable}}{N_{total}}

  • RpnlR_{pnl} — متوسط PnL المرجح بالسيولة المُطبَّع:

Rpnl=i=1NliPnLii=1NliR_{pnl} = \frac{\sum_{i=1}^{N} l_i \cdot \text{PnL}_i}{\sum_{i=1}^{N} l_i}

حيث lil_i هي سيولة الرمز ii (متوسط الحجم اليومي).

  • PconsistencyP_{consistency} — مكافأة الاتساق عبر المستويات:

Pconsistency=Nprofitable_tiersNtotal_tiersP_{consistency} = \frac{N_{profitable\_tiers}}{N_{total\_tiers}}

  • PvarianceP_{variance} — عقوبة التباين العالي في PnL بين الرموز:

Pvariance=σ(PnL1,,PnLN)max(PnLˉ,0.01)P_{variance} = \frac{\sigma(\text{PnL}_1, \ldots, \text{PnL}_N)}{\max(|\bar{\text{PnL}}|, 0.01)}

الأوزان الافتراضية

المكوّن الوزن المبرر
w1w_1 (نسبة الربحية) 0.35 الأهم: يجب أن تعمل الاستراتيجية على الأغلبية
w2w_2 (متوسط PnL) 0.25 العوائد المطلقة
w3w_3 (عبر المستويات) 0.25 مكافأة للشمولية
w4w_4 (عقوبة التباين) 0.15 عقوبة لعدم الاستقرار

تفسير CSRS

CSRS التفسير
> 0.7 متانة ممتازة. الاستراتيجية تعمل على معظم الأدوات.
0.5 — 0.7 متانة جيدة. الاستراتيجية تعمل في مستواها وجزئيًا في مستويات أخرى.
0.3 — 0.5 حدية. الاستراتيجية تعمل على مجموعة ضيقة من الرموز.
< 0.3 متانة منخفضة. ملاءمة المنحنى على مستوى الأداة محتملة.

التنفيذ الكامل: خط أنابيب التحقق متعدد الرموز

خط أنابيب معالجة البيانات ثلاثي الأبعاد للتحقق من استراتيجية متعددة الرموز

import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import Callable, Optional

@dataclass
class SymbolResult:
    """Strategy result on a single symbol."""
    symbol: str
    tier: int
    pnl: float
    max_dd: float
    n_trades: int
    win_rate: float
    pnl_per_active_day: float
    avg_daily_volume: float  # liquidity

@dataclass
class TierResult:
    """Aggregated result by tier."""
    tier: int
    symbols: list[SymbolResult]
    n_symbols: int
    n_profitable: int
    profit_ratio: float
    avg_pnl: float
    avg_max_dd: float
    pnl_std: float

@dataclass
class MultiSymbolResult:
    """Full multi-symbol validation result."""
    symbol_results: list[SymbolResult]
    tier_results: list[TierResult]
    csrs: float
    passed: bool
    optimization_symbol: str
    report: str

SYMBOL_TIERS = {
    1: ["BTCUSDT", "ETHUSDT"],
    2: ["SOLUSDT", "BNBUSDT", "ADAUSDT", "XRPUSDT", "AVAXUSDT"],
    3: ["DOGEUSDT", "SHIBUSDT", "PEPEUSDT", "ARBUSDT", "OPUSDT"],
}

SYMBOL_VOLATILITY = {
    "BTCUSDT": 0.028, "ETHUSDT": 0.032,
    "SOLUSDT": 0.052, "BNBUSDT": 0.038, "ADAUSDT": 0.048,
    "XRPUSDT": 0.045, "AVAXUSDT": 0.055,
    "DOGEUSDT": 0.081, "SHIBUSDT": 0.092, "PEPEUSDT": 0.105,
    "ARBUSDT": 0.068, "OPUSDT": 0.063,
}

SYMBOL_VOLUME = {
    "BTCUSDT": 15e9, "ETHUSDT": 8e9,
    "SOLUSDT": 2e9, "BNBUSDT": 1.5e9, "ADAUSDT": 800e6,
    "XRPUSDT": 1.2e9, "AVAXUSDT": 500e6,
    "DOGEUSDT": 1e9, "SHIBUSDT": 400e6, "PEPEUSDT": 600e6,
    "ARBUSDT": 300e6, "OPUSDT": 250e6,
}


def run_multi_symbol_validation(
    strategy_fn: Callable,
    base_params: dict,
    optimization_symbol: str,
    data_loader: Callable,
    vol_sensitive_params: list[str],
    adaptive: bool = True,
    csrs_weights: tuple = (0.35, 0.25, 0.25, 0.15),
    min_profit_ratio: float = 0.6,
) -> MultiSymbolResult:
    """
    Full multi-symbol validation pipeline.

    Args:
        strategy_fn: strategy function (data, params) -> (pnl, max_dd, n_trades, win_rate, returns)
        base_params: parameters optimized on optimization_symbol
        optimization_symbol: optimization symbol
        data_loader: data loading function (symbol) -> np.ndarray
        vol_sensitive_params: parameters to scale by volatility
        adaptive: use volatility scaling
        csrs_weights: weights (w1, w2, w3, w4) for CSRS
        min_profit_ratio: minimum fraction of profitable symbols in a tier
    """
    w1, w2, w3, w4 = csrs_weights
    opt_vol = SYMBOL_VOLATILITY.get(optimization_symbol, 0.03)

    symbol_results = []

    for tier, symbols in SYMBOL_TIERS.items():
        for symbol in symbols:
            data = data_loader(symbol)
            if data is None or len(data) < 100:
                continue

            if adaptive and symbol != optimization_symbol:
                sym_vol = SYMBOL_VOLATILITY.get(symbol, 0.05)
                params = scale_params_by_volatility(
                    base_params, opt_vol, sym_vol, vol_sensitive_params
                )
            else:
                params = base_params.copy()

            pnl, max_dd, n_trades, win_rate, returns = strategy_fn(data, params)

            active_days = max(n_trades * 0.5, 1)  # rough estimate
            pnl_per_day = pnl / active_days

            symbol_results.append(SymbolResult(
                symbol=symbol,
                tier=tier,
                pnl=pnl,
                max_dd=max_dd,
                n_trades=n_trades,
                win_rate=win_rate,
                pnl_per_active_day=pnl_per_day,
                avg_daily_volume=SYMBOL_VOLUME.get(symbol, 1e6),
            ))

    tier_results = []
    tiers_present = sorted(set(r.tier for r in symbol_results))

    for tier in tiers_present:
        tier_symbols = [r for r in symbol_results if r.tier == tier]
        n_profitable = sum(1 for r in tier_symbols if r.pnl > 0)
        pnls = [r.pnl for r in tier_symbols]

        tier_results.append(TierResult(
            tier=tier,
            symbols=tier_symbols,
            n_symbols=len(tier_symbols),
            n_profitable=n_profitable,
            profit_ratio=n_profitable / len(tier_symbols) if tier_symbols else 0,
            avg_pnl=np.mean(pnls),
            avg_max_dd=np.mean([r.max_dd for r in tier_symbols]),
            pnl_std=np.std(pnls),
        ))

    all_pnls = [r.pnl for r in symbol_results]
    all_volumes = [r.avg_daily_volume for r in symbol_results]
    n_total = len(symbol_results)
    n_profitable = sum(1 for r in symbol_results if r.pnl > 0)

    r_profit = n_profitable / n_total if n_total > 0 else 0

    total_vol = sum(all_volumes)
    r_pnl_raw = sum(r.pnl * r.avg_daily_volume for r in symbol_results) / total_vol
    r_pnl = 1 / (1 + np.exp(-r_pnl_raw * 5))

    profitable_tiers = sum(1 for tr in tier_results if tr.avg_pnl > 0)
    p_consistency = profitable_tiers / len(tier_results) if tier_results else 0

    pnl_std = np.std(all_pnls) if len(all_pnls) > 1 else 0
    pnl_mean = np.mean(all_pnls) if all_pnls else 0.01
    p_variance = pnl_std / max(abs(pnl_mean), 0.01)
    p_variance = min(p_variance, 5.0)  # cap the penalty

    csrs = w1 * r_profit + w2 * r_pnl + w3 * p_consistency - w4 * (p_variance / 5.0)
    csrs = max(0, min(1, csrs))  # clamp to [0, 1]

    opt_tier = None
    for tier, symbols in SYMBOL_TIERS.items():
        if optimization_symbol in symbols:
            opt_tier = tier
            break

    same_tier_result = next((tr for tr in tier_results if tr.tier == opt_tier), None)
    passed = (
        csrs >= 0.5
        and (same_tier_result is None or same_tier_result.profit_ratio >= min_profit_ratio)
        and np.mean(all_pnls) > 0
    )

    report = _generate_report(
        symbol_results, tier_results, csrs, passed,
        optimization_symbol, adaptive
    )

    return MultiSymbolResult(
        symbol_results=symbol_results,
        tier_results=tier_results,
        csrs=csrs,
        passed=passed,
        optimization_symbol=optimization_symbol,
        report=report,
    )


def _generate_report(
    symbol_results, tier_results, csrs, passed,
    opt_symbol, adaptive
) -> str:
    """Generate text report."""
    lines = []
    lines.append("=" * 60)
    lines.append("MULTI-SYMBOL VALIDATION REPORT")
    lines.append(f"Optimization symbol: {opt_symbol}")
    lines.append(f"Mode: {'adaptive' if adaptive else 'strict'}")
    lines.append(f"CSRS: {csrs:.3f}")
    lines.append(f"Passed: {'YES' if passed else 'NO'}")
    lines.append("=" * 60)

    for tr in tier_results:
        lines.append(f"\n--- Tier {tr.tier} ---")
        lines.append(f"  Symbols: {tr.n_symbols}, Profitable: {tr.n_profitable} "
                      f"({tr.profit_ratio:.0%})")
        lines.append(f"  Avg PnL: {tr.avg_pnl:.2%}, Avg MaxDD: {tr.avg_max_dd:.2%}")
        lines.append(f"  PnL StdDev: {tr.pnl_std:.2%}")

        for sr in tr.symbols:
            marker = "*" if sr.symbol == opt_symbol else " "
            status = "+" if sr.pnl > 0 else "-"
            lines.append(
                f"  {marker} [{status}] {sr.symbol:12s} "
                f"PnL={sr.pnl:+.2%}  MaxDD={sr.max_dd:.2%}  "
                f"Trades={sr.n_trades:4d}  WR={sr.win_rate:.1%}"
            )

    lines.append("\n" + "=" * 60)
    return "\n".join(lines)

مثال على استخدام خط الأنابيب

def my_strategy(data, params):
    """Your strategy. Returns (pnl, max_dd, n_trades, win_rate, returns)."""
    pass

def load_ohlcv(symbol):
    """Load OHLCV data for a symbol."""
    pass

base_params = {
    "entry_threshold": 0.02,
    "stop_loss": 0.01,
    "take_profit": 0.03,
    "trailing_stop": 0.008,
    "atr_multiplier": 2.5,
    "rsi_period": 14,
    "ma_fast": 10,
    "ma_slow": 50,
}

result = run_multi_symbol_validation(
    strategy_fn=my_strategy,
    base_params=base_params,
    optimization_symbol="ETHUSDT",
    data_loader=load_ohlcv,
    vol_sensitive_params=["entry_threshold", "stop_loss", "take_profit", "trailing_stop"],
    adaptive=True,
)

print(result.report)
print(f"\nCSRS: {result.csrs:.3f}")
print(f"Passed: {result.passed}")

متى يكون التحقق على رمز واحد مقبولاً

الاستثناءات: دفتر أوامر صناعة السوق، المراجحة عبر المنصات، وأنماط الارتباط الفريدة للأصول

ليس كل استراتيجية يجب أن تعمل عبر أدوات متعددة. هناك حالات مشروعة حيث الرمز الواحد هو النهج الطبيعي:

صناعة السوق على دفتر أوامر محدد

استراتيجية صناعة السوق (مثل استخدام نموذج Avellaneda-Stoikov) مرتبطة بالتعريف بدفتر أوامر محدد. المعاملات تعتمد على البنية المجهرية المحددة: العمق، الفرق، موقع الطابور، معدل التعبئة. الاختبار على رمز آخر لا معنى له — إنه دفتر أوامر مختلف.

المراجحة بين أزواج محددة

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

الاستراتيجيات التي تستخدم صراحةً خصائص فريدة للأصل

إذا كانت الاستراتيجية مبنية على خاصية محددة لأصل واحد (مثل ارتباط BTC بمعدل الهاش أو ارتباط ETH برسوم الغاز)، فإن التحقق متعدد الرموز غير قابل للتطبيق. لكن مثل هذه الاستراتيجيات نادرة.

في جميع الحالات الأخرى — إذا كانت الاستراتيجية مبنية على إشارات "عامة" (تقاطع MA، RSI، الزخم، العودة للمتوسط) — التحقق متعدد الرموز إلزامي. إذا كانت استراتيجية عامة تعمل فقط على رمز واحد، فهي ليست ميزة — إنها إفراط في التكيف.

العلاقة مع طرق التحقق الأخرى

ثلاثة محاور تحقق متعامدة: الزمن (التحليل الأمامي)، الأداة (متعدد الرموز)، ترتيب الصفقات (مونتي كارلو)

التحقق متعدد الرموز هو واحد من ثلاث طرق متعامدة للاختبار خارج العينة:

الطريقة محور التحقق ما تكشفه
التحليل الأمامي الزمن الإفراط في التكيف لفترة محددة
متعدد الرموز الأداة الإفراط في التكيف لأصل محدد
محاكاة مونتي كارلو ترتيب الصفقات الاعتماد على تسلسل محدد

كل طريقة تتحقق من المتانة على محورها الخاص. يمكن للاستراتيجية أن تجتاز التحليل الأمامي لكن تفشل في متعدد الرموز (ملاءمة منحنى للأداة). يمكنها اجتياز متعدد الرموز لكن تفشل في مونتي كارلو (تعتمد على ترتيب صفقات محظوظ).

أقصى حماية من الإفراط في التكيف: استخدم الطرق الثلاث جميعًا.

خط أنابيب التحقق الكامل:

  1. تحسين المعاملات على رمز واحد
  2. تحليل الهضبة — فحص استقرار الحد الأمثل
  3. التحليل الأمامي — التحقق على محور الزمن (WFER > 0.5)
  4. متعدد الرموز — التحقق على محور الأداة (CSRS > 0.5)
  5. محاكاة مونتي كارلو — فترات الثقة (المئوية الخامسة > 0)
  6. مراعاة معدلات التمويل وعدم تماثل الخسارة

الاستراتيجية التي تجتاز جميع الفحوصات الستة لديها احتمالية ضئيلة أن تكون نتاج الإفراط في التكيف.

التوسعات: ارتباط الرموز والاستراتيجيات المتتالية

رسم بياني لشبكة ارتباط العملات المشفرة مع تدفقات تخصيص الاستراتيجيات المتتالية

يكشف التحقق متعدد الرموز عن جانب آخر: الارتباطات بين الرموز. إذا كانت الاستراتيجية مربحة على BTC وETH لكن غير مربحة على جميع العملات البديلة — فهذه معلومة بأن الميزة مرتبطة بالارتباط العالي بين BTC وETH. التحليل المفصل لهياكل الارتباط — في مقال ارتباط الإشارات وتداول الأزواج.

بالنسبة لمحافظ الاستراتيجيات، تحدد نتائج متعدد الرموز على أي أدوات يجب إطلاق الاستراتيجية. الاستراتيجية A من المثال أعلاه — المستوى 1-2 فقط. الاستراتيجية B — المستوى 1-3. هذه بيانات مدخلة لـالتنسيق المتتالي، حيث يتم إطلاق استراتيجيات مختلفة على أدوات مختلفة حسب ملف المتانة.

الخاتمة

التحقق متعدد الرموز ليس اختياريًا — إنه خطوة إلزامية لأي استراتيجية تدعي ميزة سوقية معممة. النقاط الرئيسية:

  1. الاستراتيجية التي تعمل فقط على رمز واحد على الأرجح مفرطة التكيف لخصائص ذلك الرمز. الاستثناءات: صناعة السوق، المراجحة، الاستراتيجيات المبنية على خصائص فريدة للأصل.

  2. تجميع المستويات إلزامي. لا يمكنك مقارنة النتائج على BTC (المستوى 1) مع النتائج على PEPE (المستوى 3) دون فهم الاختلافات في التقلب والسيولة والبنية المجهرية.

  3. تحجيم المعاملات التكيفي — تطبيع العتبات حسب التقلب — يحسن بشكل كبير واقعية الاختبار متعدد الرموز.

  4. CSRS > 0.5 — حد أدنى معقول. يجب أن تكون الاستراتيجية مربحة على 60% أو أكثر من رموز نفس المستوى، ومتوسط PnL عبر جميع الرموز يجب أن يكون إيجابيًا.

  5. التحليل الأمامي + متعدد الرموز + مونتي كارلو — ثلاثة محاور تحقق متعامدة. كل طريقة تلتقط ما يفوت الأخريات. استخدم الثلاثة جميعًا.

استراتيجية بـ PnL +25% وCSRS 0.72 أكثر موثوقية من استراتيجية بـ PnL +300% وCSRS 0.18. الأولى تكسب من عدم كفاءة السوق. الثانية تكسب من حفظ سلسلة أسعار واحدة.


روابط مفيدة

  1. Lopez de Prado, M. — Advances in Financial Machine Learning (Wiley)
  2. Pardo, R. — The Evaluation and Optimization of Trading Strategies (Wiley)
  3. Bailey, D.H. et al. — The Probability of Backtest Overfitting
  4. Aronson, D.R. — Evidence-Based Technical Analysis
  5. Kevin Davey — Building Winning Algorithmic Trading Systems (Wiley)
  6. Harvey, C.R. & Liu, Y. — Backtesting (2015)
  7. Chan, E. — Algorithmic Trading: Winning Strategies and Their Rationale (Wiley)
  8. Binance Research — Cryptocurrency Correlation Analysis
  9. NumPy — numpy.random.choice
  10. Pandas — DataFrame

Citation

@article{soloviov2026multisymbolvalidation,
  author = {Soloviov, Eugen},
  title = {Multi-Symbol Validation: Test Your Strategy on All Pairs},
  year = {2026},
  url = {https://marketmaker.cc/ar/blog/post/multi-symbol-validation},
  version = {0.1.0},
  description = {Why a strategy optimized on ETHUSDT may fail on altcoins. How to properly test across pair groups (blue chips, large caps, shitcoins) and what cross-symbol robustness score to consider sufficient.}
}
blog.disclaimer

MarketMaker.cc Team

البحوث والاستراتيجيات الكمية

ناقش في تلغرام
Newsletter

ابقَ متقدماً على السوق

اشترك في نشرتنا الإخبارية للحصول على رؤى حصرية حول تداول الذكاء الاصطناعي وتحليلات السوق وتحديثات المنصة.

نحترم خصوصيتك. يمكنك إلغاء الاشتراك في أي وقت.