التحقق متعدد الرموز: اختبر استراتيجيتك على جميع الأزواج
مقال من سلسلة "اختبارات رجعية بلا أوهام"
لقد حسّنت استراتيجية على 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 حسب الوقت النشط)
معايير النجاح
تجتاز الاستراتيجية التحقق متعدد الرموز إذا:
- مربحة على 60% أو أكثر من رموز نفس المستوى
- متوسط PnL عبر المجموعة إيجابي
- MaxDD لا يزداد بشكل كبير (لا يزيد عن 2-3 أضعاف مقارنة برمز التحسين)
- إذا كانت الاستراتيجية مربحة فقط على رمز التحسين — ارفضها
مثال: ثلاث استراتيجيات، ثلاث نتائج

لنتأمل مثالاً ملموسًا. ثلاث استراتيجيات (الاستراتيجية 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 بعمق دفتر أوامر 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) عادةً لا تُحجَّم — فهي مُطبَّعة بالفعل بالتقلب من خلال المؤشر نفسه.
وضعان للتحقق
-
الوضع الصارم (بدون تحجيم): التشغيل بمعاملات متطابقة. اختبار المتانة المطلقة. إذا كانت الاستراتيجية مربحة — فالميزة قوية.
-
الوضع التكيفي (مع تحجيم): التشغيل بمعاملات مُطبَّعة. اختبار متانة منطق الاستراتيجية، مع مراعاة اختلاف مستويات التقلب.
نوصي بتشغيل كلا الاختبارين. الوضع الصارم — لتقييم "قوة" الميزة. الوضع التكيفي — للتطبيق العملي.
درجة المتانة عبر الرموز

للتقييم الكمي للمتانة متعددة الرموز، نقدم مقياسًا مركبًا — Cross-Symbol Robustness Score (CSRS).
الصيغة
حيث:
- — نسبة الرموز المربحة:
- — متوسط PnL المرجح بالسيولة المُطبَّع:
حيث هي سيولة الرمز (متوسط الحجم اليومي).
- — مكافأة الاتساق عبر المستويات:
- — عقوبة التباين العالي في PnL بين الرموز:
الأوزان الافتراضية
| المكوّن | الوزن | المبرر |
|---|---|---|
| (نسبة الربحية) | 0.35 | الأهم: يجب أن تعمل الاستراتيجية على الأغلبية |
| (متوسط PnL) | 0.25 | العوائد المطلقة |
| (عبر المستويات) | 0.25 | مكافأة للشمولية |
| (عقوبة التباين) | 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، الزخم، العودة للمتوسط) — التحقق متعدد الرموز إلزامي. إذا كانت استراتيجية عامة تعمل فقط على رمز واحد، فهي ليست ميزة — إنها إفراط في التكيف.
العلاقة مع طرق التحقق الأخرى

التحقق متعدد الرموز هو واحد من ثلاث طرق متعامدة للاختبار خارج العينة:
| الطريقة | محور التحقق | ما تكشفه |
|---|---|---|
| التحليل الأمامي | الزمن | الإفراط في التكيف لفترة محددة |
| متعدد الرموز | الأداة | الإفراط في التكيف لأصل محدد |
| محاكاة مونتي كارلو | ترتيب الصفقات | الاعتماد على تسلسل محدد |
كل طريقة تتحقق من المتانة على محورها الخاص. يمكن للاستراتيجية أن تجتاز التحليل الأمامي لكن تفشل في متعدد الرموز (ملاءمة منحنى للأداة). يمكنها اجتياز متعدد الرموز لكن تفشل في مونتي كارلو (تعتمد على ترتيب صفقات محظوظ).
أقصى حماية من الإفراط في التكيف: استخدم الطرق الثلاث جميعًا.
خط أنابيب التحقق الكامل:
- تحسين المعاملات على رمز واحد
- تحليل الهضبة — فحص استقرار الحد الأمثل
- التحليل الأمامي — التحقق على محور الزمن (WFER > 0.5)
- متعدد الرموز — التحقق على محور الأداة (CSRS > 0.5)
- محاكاة مونتي كارلو — فترات الثقة (المئوية الخامسة > 0)
- مراعاة معدلات التمويل وعدم تماثل الخسارة
الاستراتيجية التي تجتاز جميع الفحوصات الستة لديها احتمالية ضئيلة أن تكون نتاج الإفراط في التكيف.
التوسعات: ارتباط الرموز والاستراتيجيات المتتالية

يكشف التحقق متعدد الرموز عن جانب آخر: الارتباطات بين الرموز. إذا كانت الاستراتيجية مربحة على BTC وETH لكن غير مربحة على جميع العملات البديلة — فهذه معلومة بأن الميزة مرتبطة بالارتباط العالي بين BTC وETH. التحليل المفصل لهياكل الارتباط — في مقال ارتباط الإشارات وتداول الأزواج.
بالنسبة لمحافظ الاستراتيجيات، تحدد نتائج متعدد الرموز على أي أدوات يجب إطلاق الاستراتيجية. الاستراتيجية A من المثال أعلاه — المستوى 1-2 فقط. الاستراتيجية B — المستوى 1-3. هذه بيانات مدخلة لـالتنسيق المتتالي، حيث يتم إطلاق استراتيجيات مختلفة على أدوات مختلفة حسب ملف المتانة.
الخاتمة
التحقق متعدد الرموز ليس اختياريًا — إنه خطوة إلزامية لأي استراتيجية تدعي ميزة سوقية معممة. النقاط الرئيسية:
-
الاستراتيجية التي تعمل فقط على رمز واحد على الأرجح مفرطة التكيف لخصائص ذلك الرمز. الاستثناءات: صناعة السوق، المراجحة، الاستراتيجيات المبنية على خصائص فريدة للأصل.
-
تجميع المستويات إلزامي. لا يمكنك مقارنة النتائج على BTC (المستوى 1) مع النتائج على PEPE (المستوى 3) دون فهم الاختلافات في التقلب والسيولة والبنية المجهرية.
-
تحجيم المعاملات التكيفي — تطبيع العتبات حسب التقلب — يحسن بشكل كبير واقعية الاختبار متعدد الرموز.
-
CSRS > 0.5 — حد أدنى معقول. يجب أن تكون الاستراتيجية مربحة على 60% أو أكثر من رموز نفس المستوى، ومتوسط PnL عبر جميع الرموز يجب أن يكون إيجابيًا.
-
التحليل الأمامي + متعدد الرموز + مونتي كارلو — ثلاثة محاور تحقق متعامدة. كل طريقة تلتقط ما يفوت الأخريات. استخدم الثلاثة جميعًا.
استراتيجية بـ PnL +25% وCSRS 0.72 أكثر موثوقية من استراتيجية بـ PnL +300% وCSRS 0.18. الأولى تكسب من عدم كفاءة السوق. الثانية تكسب من حفظ سلسلة أسعار واحدة.
روابط مفيدة
- Lopez de Prado, M. — Advances in Financial Machine Learning (Wiley)
- Pardo, R. — The Evaluation and Optimization of Trading Strategies (Wiley)
- Bailey, D.H. et al. — The Probability of Backtest Overfitting
- Aronson, D.R. — Evidence-Based Technical Analysis
- Kevin Davey — Building Winning Algorithmic Trading Systems (Wiley)
- Harvey, C.R. & Liu, Y. — Backtesting (2015)
- Chan, E. — Algorithmic Trading: Winning Strategies and Their Rationale (Wiley)
- Binance Research — Cryptocurrency Correlation Analysis
- NumPy — numpy.random.choice
- 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.}
}
MarketMaker.cc Team
البحوث والاستراتيجيات الكمية