Multi-simvolli validatsiya: strategiyangizni barcha juftliklarda sinang
"Illyuziyasiz backtestlar" seriyasidan maqola
Siz ETHUSDT bo'yicha strategiyani optimallashtirdingiz. 25 oylik ma'lumot, 12+ parametr. Backtest PnL +55%, 500 savdo, MaxDD -0,9%, pozitsiya vaqtning 15% ochiq ekanini ko'rsatadi. Equity egri chizig'i tekis ko'tariladi. Parametrlar plato tahlilidan o'tdi — optimum keng ko'rinadi. Walk-forward WFER > 0,6 beradi. Monte-Karlo bootstrap musbat 5-protsentilni ko'rsatadi.
Hammasi mukammal. Faqat bitta narsadan tashqari: siz strategiyani faqat bitta instrumentda sinadingiz.
Siz o'sha algoritmni o'sha parametrlar bilan BTCUSDT'da ishga tushirasiz — PnL +8%. SOLUSDT'da — PnL -12%. DOGEUSDT'da — PnL -34%. ETH'da barcha tekshiruvlardan o'tgan strategiya boshqa juftliklarning ko'pchiligida foydasiz bo'lib chiqadi.
Bu bag emas. Bu — algosavdoda eng keng tarqalgan va yashirin overfitting turlaridan biri — single-symbol tuzog'i.
Yagona instrument tuzog'i

Strategiyani faqat bitta simvolda optimallashtirish, mohiyatan, uni muayyan aktivning narx dinamikasiga moslashtirishdir. Walk-forward o'tkazilgan bo'lsa ham, bootstrap keng ishonch intervallarini ko'rsatsa ham — bu tekshiruvlarning barchasi bitta vaqt qatori doirasida amalga oshirilgan edi.
Walk-forward vaqt bo'yicha barqarorlikni tekshiradi: parametrlar o'sha instrumentning kelajakdagi ma'lumotlarida ishlaydimi. Monte-Karlo savdo tartibi bo'yicha barqarorlikni tekshiradi: strategiya boshqa ketma-ketlikka bardosh bera oladimi. Ammo bu usullarning hech biri instrumentlar bo'yicha barqarorlikni tekshirmaydi: strategiya boshqa xususiyatlarga ega boshqa aktivlarda ishlaydimi.
Agar strategiya faqat ETHUSDT'da foydali bo'lsa — u bozor samarasizligini emas, balki ETH narx qatorining o'ziga xos tuzilishini ushlab olgan:
- ETH'ga xos bo'lgan o'ziga xos sham naqshlari
- Chegaralar moslashtirilgan aniq volatillik darajalari
- Aynan shu juftlikning likvidlik va mikrostruktura xususiyatlari
- Ma'lum bir davrga xos bo'lgan BTC bilan korrelyatsiya
Bularning hech biri edge emas. Bu instrument darajasidagi curve fitting.
Kripto bozorida simvol guruhlari (Tiers)

Barcha kriptovalyutalar bir xil emas. Mazmunli multi-simvolli validatsiya uchun instrumentlar tubdan farqli xususiyatlarga ega guruhlarga bo'linishini tushunish kerak.
Tier 1: Blue Chips (BTC, ETH)
Yuqori likvidlik, nisbatan past volatillik, institutsional oqim. Makro (S&P 500, DXY, FRS stavkalari) bilan korrelyatsiya. Chuqur order book'lar, tor spredlar, barqaror funding rate'lar. Odatiy kunlik volatillik: 2-4%.
Tier 2: Large Caps (SOL, BNB, ADA, XRP, AVAX)
O'rtacha likvidlik, oshirilgan volatillik. Harakatlar ko'pincha sektor dinamikasi (L1 vs L2, DeFi vs infra) bilan boshqariladi. Funding rate'lar ko'proq beqaror. Spredlar kengroq. Odatiy kunlik volatillik: 4-6%.
Tier 3: Mid Caps (DOGE, SHIB, PEPE, ARB, OP)
Mem-koinlar va narrativ tokenlar. Yuqori volatillik, fundamental omillar bilan past korrelyatsiya. Harakatlar ijtimoiy tarmoqlar, listinglar, narrativlar bilan belgilanadi. Ba'zi birjalarda kam qatlamli order book'lar. Odatiy kunlik volatillik: 6-10%.
Tier 4: Low Caps (yangi listinglar)
Ekstremal volatillik, kam qatlamli order book'lar, manipulyatsiya xavfi. Ko'pincha to'liq backtest uchun yetarli bo'lmagan tarix. Odatiy kunlik volatillik: 10-20%+.
Xususiyatlarning umumlashtiruvchi jadvali
| Xususiyat | Tier 1 | Tier 2 | Tier 3 | Tier 4 |
|---|---|---|---|---|
| Kunlik volatillik | 2-4% | 4-6% | 6-10% | 10-20%+ |
| O'rtacha spred (perps) | 0.01-0.02% | 0.02-0.05% | 0.05-0.15% | 0.1-0.5%+ |
| Order book chuqurligi (top 5 bps) | $5-50M | $1-10M | $100K-2M | $10K-200K |
| Funding rate (o'rtacha abs.) | 0.005-0.01% | 0.01-0.03% | 0.02-0.08% | 0.05-0.2%+ |
| BTC bilan korrelyatsiya | 0.85-0.95 | 0.6-0.85 | 0.3-0.7 | 0.1-0.5 |
| Minimal tarix | 5+ yil | 2-5 yil | 6 oy - 3 yil | < 6 oy |
Har bir tier — o'z mikrostrukturasi bilan alohida "dunyo". Tier 1 uchun sozlangan strategiya Tier 3'ga o'tganda begona muhitga kiradi.
Multi-simvolli validatsiya metodologiyasi

1-qadam: Bitta simvolda optimallashtirish
Optimallashtirish uchun simvol tanlang — masalan, ETHUSDT. To'liq pipeline'ni ishga tushiring: Optuna optimallashtirish, plato tahlili, walk-forward. Parametrlarni mustahkamlang.
2-qadam: Xuddi shu tier'dagi simvollarda sinash
Strategiyani xuddi shu parametrlar bilan xuddi shu tier'ning 5-10 simvolida ishga tushiring. Tier 1 uchun bu cheklangan (BTC + ETH), lekin Tier 2 va Tier 3 uchun simvollar yetarli.
3-qadam: Boshqa tier'lardagi simvollarda sinash
Strategiyani har bir boshqa tier'ning 3-5 simvolida ishga tushiring. Bu — eng qattiq sinov: agar strategiya ETHUSDT'da (Tier 1) va DOGEUSDT'da (Tier 3) ishlasa, curve fitting ehtimoli minimal.
4-qadam: Natijalarni guruh bo'yicha tahlil qilish
Metrikalarni tier bo'yicha jamlab, cross-symbol barqarorlikni baholang.
Har bir simvol uchun metrikalar
Har bir simvol uchun qayd eting:
- PnL — umumiy daromadlilik
- MaxDD — maksimal drawdown
- N trades — savdolar soni
- Win rate — foydali savdolar ulushi
- PnL/faol kun — faol vaqt birligiga daromadlilik (batafsil ma'lumot faol vaqt bo'yicha PnL maqolasida)
O'tish mezonlari
Strategiya multi-simvolli validatsiyadan o'tadi, agar:
- Xuddi shu tier'dagi simvollarning >= 60% ida foydali bo'lsa
- Guruh bo'yicha o'rtacha PnL musbat bo'lsa
- MaxDD keskin oshmasa (optimallashtirish simvoliga nisbatan 2-3 barobardan ortiq emas)
- Agar strategiya FAQAT optimallashtirish simvolida foydali bo'lsa — rad etiladi
Misol: uchta strategiya, uchta natija

Aniq misolni ko'rib chiqamiz. Uchta strategiya (Strategiya A, Strategiya B, Strategiya C), ETHUSDT'da optimallashtirilgan, to'rtta tier'ning 12 simvolida sinalgan.
Strategiya A (ETHUSDT'da optimallashtirilgan)
Parametrlar: PnL +55%, ~500 savdo, ~15% faol vaqt, MaxDD ~0,9%.
| Simvol | Tier | PnL | MaxDD | N trades | Win rate | PnL/faol kun |
|---|---|---|---|---|---|---|
| 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% |
* — optimallashtirish simvoli
Tier bo'yicha natijalar:
| Tier | Simvollar | Foydali | O'rtacha PnL | O'rtacha MaxDD |
|---|---|---|---|---|
| Tier 1 | 2 | 2 (100%) | +43.3% | -1.4% |
| Tier 2 | 4 | 3 (75%) | +11.5% | -4.1% |
| Tier 3 | 5 | 0 (0%) | -13.7% | -10.1% |
Xulosa: Strategiya A Tier 1-2'da ishlaydi, lekin Tier 3'da butunlay muvaffaqiyatsizlikka uchraydi. Bu past volatillik muhitiga sozlangan tipik strategiya. Blue chips va large caps portfeli uchun — qabul qilinadi. Universal foydalanish uchun — yo'q.
Strategiya B (ETHUSDT'da optimallashtirilgan)
Parametrlar: PnL +25%, ~40 savdo, ~5% faol vaqt.
| Simvol | Tier | PnL | MaxDD | N trades | Win rate |
|---|---|---|---|---|---|
| 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% |
Tier bo'yicha natijalar:
| Tier | Simvollar | Foydali | O'rtacha PnL | O'rtacha MaxDD |
|---|---|---|---|---|
| Tier 1 | 2 | 2 (100%) | +23.5% | -2.6% |
| Tier 2 | 4 | 4 (100%) | +14.3% | -3.9% |
| Tier 3 | 5 | 3 (60%) | +1.8% | -7.2% |
Xulosa: Strategiya B 11 ta simvoldan 9 tasida foydali (82%). O'rtacha PnL barcha tier'larda musbat. MaxDD tier'ga qarab bashorat qilinadigan tarzda o'sadi. Bu — haqiqiy bozor edge'iga ega barqaror strategiya. Optimallashtirish simvolida oddiyroq PnL'ga qaramay (+25% qarshi +55%), Strategiya B Strategiya A'ga qaraganda ancha ishonchli.
Strategiya C (ETHUSDT'da optimallashtirilgan)
Parametrlar: PnL +300%, ~400 savdo, ~45% faol vaqt, MaxDD ~17%.
| Simvol | Tier | PnL | MaxDD | N trades | Win rate |
|---|---|---|---|---|---|
| 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% |
Xulosa: Strategiya C — klassik overfitting. ETHUSDT'da +301%, lekin boshqa juftliklarning ko'pchiligida halokatli yo'qotishlar. Tier 3'da MaxDD 70% dan oshadi — bu kapitalni yo'q qilishdir. Strategiya ETH'ning o'ziga xos naqshlarini ushlab oldi, bozor samarasizligini emas. Rad etiladi.
Strategiyalar boshqa simvollarda nima uchun buziladi

1. Volatillik mos kelmasligi
Eng keng tarqalgan sabab. Strategiya parametrlari muayyan volatillik darajasiga sozlangan. Agar strategiya 2% kirish chegarasidan foydalansa — 3% kunlik volatillikka ega ETH uchun bu oqilona filtr. 8% kunlik volatillikka ega DOGE uchun bu chegara juda ko'p marta ishga tushib, ko'plab yolg'on signallarni yaratadi.
Xuddi shunday, 1% stop loss ETH uchun mos, lekin PEPE uchun bu — oddiy "shovqin", va stop kuniga o'nlab marta urib ketadi.
2. Likvidlik farqlari
Strategiya order joriy narxda darhol bajarilishini taxmin qiladi. 5 bps ichida 200K chuqurlikka ega ARBUSDT'da — sizning $10K order'ingiz narxni siljitadi, va haqiqiy bajarish 0,05-0,2% yomonroq bo'ladi. 500 savdo davomida bu faqat slippage'dan 25-100% yo'qotish degani.
3. Bozor mikrostrukturasi
Har bir instrumentning o'z mikrostrukturasi bor:
- Funding rate'lar: BTC'da funding buqa bozorida doimiy ravishda musbat (har 8 soatda +0,01%). Mem-koinlarda funding -0,3% dan +0,5% ga sakrab ketishi mumkin. Batafsil ma'lumot Funding rate'lar sizning leverage'ingizni yeydi maqolasida.
- Spred: Tier 1'da spred 0,01%, Tier 4'da — 0,5%. Kichik take-profitlarga ega strategiya spred take o'lchamidan oshib ketganda foydali bo'la olmaydi.
- Manipulyatsiya naqshlari: wick'lar, spoofing, wash trading — har bir tier'da turlicha namoyon bo'ladi.
4. Rejimga sezgirlik
Altkoinlar turli bozor fazalarida turlicha o'zini tutadi:
- Buqa trendida altkoinlar BTC'dan ustun keladi (beta > 1)
- Ayiq trendida altkoinlar BTC'dan kuchliroq tushadi
- Yon bozorda altkoinlar BTC bilan korrelyatsiyada bo'lishi yoki o'z narrativlariga ko'ra harakatlanishi mumkin
Bir fazada bitta simvolda optimallashtirilgan strategiya o'sha simvolning BTC'ga nisbatan lag/lead'iga optimal sozlangan bo'lishi mumkin — va rejim o'zgarganda bu lag/lead o'zgaradi.
Moslashuvchan parametr masshtablash

Strategiyani barcha simvollarda bir xil parametrlar bilan ishga tushirish noto'g'ri. Lekin har bir simvolda to'liq qayta optimallashtirish multi-simvolli validatsiyaning asosiy maqsadini yo'qqa chiqaradi (parametrlar har bir simvol uchun "tug'ma" bo'lib qoladi).
Murosaga kelish — volatillik bo'yicha parametrlarni normallashtirish:
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})
Natija:
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'}
Stop loss 1% dan 2,53% ga oshdi — bu DOGE'ning 8,1% kunlik volatilligiga mos keladi. Masshtablashsiz, 1% stop "shovqin"dan o'nlab marta urib ketardi.
Muhim: faqat narx chegaralarini (kirish, stop, take) masshtablang. Indikator davrlari (RSI, MA) va multiplikatorlar (ATR multiplikatori) odatda masshtablanmaydi — ular allaqachon indikatorning o'zi orqali volatillik bo'yicha normallashtirilgan.
Ikki validatsiya rejimi
-
Qat'iy rejim (masshtablashsiz): bir xil parametrlar bilan ishga tushirish. Mutlaq barqarorlik sinovi. Agar strategiya foydali bo'lsa — edge kuchli.
-
Moslashuvchan rejim (masshtablash bilan): normallashtirilgan parametrlar bilan ishga tushirish. Volatillik darajalari farqlanishini hisobga olgan holda strategiya mantiqining barqarorlik sinovi.
Biz ikkala sinovni ham o'tkazishni tavsiya qilamiz. Qat'iy rejim — edge'ning "kuchini" baholash uchun. Moslashuvchan rejim — amaliy qo'llash uchun.
Cross-Symbol barqarorlik ko'rsatkichi

Multi-simvolli barqarorlikni miqdoriy baholash uchun biz murakkab metrika — Cross-Symbol Robustness Score (CSRS) ni joriy qilamiz.
Formula
bu yerda:
- — foydali simvollar ulushi:
- — normallashtirilgan, likvidlik bilan tortilgan o'rtacha PnL:
bu yerda — simvolining likvidligi (o'rtacha kunlik hajm).
- — tier'lararo mosligi uchun bonus:
- — simvollar orasidagi yuqori PnL dispersiyasi uchun jarima:
Standart og'irliklar
| Komponent | Og'irlik | Asos |
|---|---|---|
| (foydali ulush) | 0.35 | Eng muhimi: strategiya ko'pchilikda ishlashi kerak |
| (o'rtacha PnL) | 0.25 | Mutlaq daromadlilik |
| (cross-tier) | 0.25 | Universallik uchun bonus |
| (dispersiya jarimasi) | 0.15 | Beqarorlik uchun jarima |
CSRS talqini
| CSRS | Talqin |
|---|---|
| > 0.7 | Ajoyib barqarorlik. Strategiya ko'pchilik instrumentlarda ishlaydi. |
| 0.5 — 0.7 | Yaxshi barqarorlik. Strategiya o'z tier'ida va qisman boshqalarida ishlaydi. |
| 0.3 — 0.5 | Chegara holati. Strategiya tor simvollar to'plamida ishlaydi. |
| < 0.3 | Past barqarorlik. Instrument darajasidagi curve fitting ehtimoli bor. |
To'liq amalga oshirish: multi-simvolli validatsiya pipeline'i

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)
Pipeline foydalanish misoli
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}")
Single-symbol validatsiya qachon qabul qilinadi

Har bir strategiya bir nechta instrumentda ishlashi shart emas. Single-symbol oddiy yondashuv bo'lgan qonuniy holatlar mavjud:
Aniq order book'da market-meyking
Market-meyking strategiyasi (masalan, Avellaneda-Stoikov modelidan foydalanuvchi) ta'rifi bo'yicha aniq order book'ga bog'liq. Parametrlar aniq mikrostrukturaga bog'liq: chuqurlik, spred, navbatdagi pozitsiya, fill rate. Boshqa simvolda sinash ma'nosiz — bu boshqa order book.
Aniq juftliklar orasidagi arbitraj
Funding rate arbitraji yoki cross-exchange arbitraj ta'rifi bo'yicha aniq instrument juftliklariga bog'liq. Bu yerda validatsiya boshqa birjalarda xuddi shu juftliklar bilan o'tkaziladi, boshqa simvollarda emas.
Aktivning noyob xususiyatlaridan aniq foydalanadigan strategiyalar
Agar strategiya aktivning aniq bir xususiyatiga asoslangan bo'lsa (masalan, BTC'ning heshreyt bilan korrelyatsiyasi yoki ETH'ning gaz to'lovlari bilan korrelyatsiyasi), multi-simvolli validatsiya qo'llanilmaydi. Lekin bunday strategiyalar kam uchraydi.
Boshqa barcha holatlarda — agar strategiya "umumiy" signallarga (MA crossover, RSI, momentum, mean reversion) asoslangan bo'lsa — multi-simvolli validatsiya majburiydir. Agar umumiy strategiya faqat bitta simvolda ishlasa, bu edge emas — bu overfitting.
Boshqa validatsiya usullari bilan bog'liqlik

Multi-simvolli validatsiya out-of-sample testlashning uchta ortogonal usulidan biri:
| Usul | Validatsiya o'qi | Nimani ochib beradi |
|---|---|---|
| Walk-Forward | Vaqt | Muayyan davrga overfitting |
| Multi-symbol | Instrument | Muayyan aktivga overfitting |
| Monte-Karlo bootstrap | Savdo tartibi | Muayyan ketma-ketlikka bog'liqlik |
Har bir usul o'z o'qi bo'yicha barqarorlikni tekshiradi. Strategiya walk-forward'dan o'tishi mumkin, lekin multi-symbol'da muvaffaqiyatsizlikka uchrashi mumkin (instrumentga curve fitting). U multi-symbol'dan o'tishi mumkin, lekin Monte-Karlo'da muvaffaqiyatsizlikka uchrashi mumkin (omadli savdo tartibiga bog'liq bo'lish).
Overfitting'dan maksimal himoya: uchala usuldan ham foydalaning.
To'liq validatsiya pipeline'i:
- Bitta simvolda parametrlarni optimallashtirish
- Plato tahlili — optimum barqarorligini tekshirish
- Walk-forward — vaqt o'qi bo'yicha validatsiya (WFER > 0,5)
- Multi-symbol — instrument o'qi bo'yicha validatsiya (CSRS > 0,5)
- Monte-Karlo bootstrap — ishonch intervallari (5-protsentil > 0)
- Funding rate'larni va yo'qotish-foyda assimetriyasini hisobga olish
Barcha oltita tekshiruvdan o'tgan strategiyaning overfitting artefakti bo'lish ehtimoli minimal.
Kengaytmalar: simvollar korrelyatsiyasi va kaskadli strategiyalar

Multi-simvolli validatsiya yana bir jihatni ochib beradi: simvollar orasidagi korrelyatsiyalar. Agar strategiya BTC va ETH'da foydali bo'lsa, lekin barcha altkoinlarda foydasiz bo'lsa — bu edge'ning BTC-ETH yuqori korrelyatsiyasiga bog'liq ekani haqidagi ma'lumot. Korrelyatsiya tuzilmalarining batafsil tahlili Signal korrelyatsiyasi va pairs trading maqolasida.
Strategiya portfellari uchun multi-simvolli natijalar strategiya qaysi instrumentlarda ishga tushirilishi kerakligini belgilaydi. Yuqoridagi misolning Strategiya A — faqat Tier 1-2. Strategiya B — Tier 1-3. Bu kaskadli orkestratsiya uchun kirish ma'lumotlari bo'lib, unda turli strategiyalar ularning barqarorlik profiliga qarab turli instrumentlarda ishga tushiriladi.
Xulosa
Multi-simvolli validatsiya ixtiyoriy narsa emas — bu umumlashtirilgan bozor edge'ini da'vo qiladigan har qanday strategiya uchun majburiy qadam. Asosiy xulosalar:
-
Faqat bitta simvolda ishlaydigan strategiya ehtimol o'sha simvolning xususiyatlariga overfit qilingan. Istisnolar: market-meyking, arbitraj, aktivning noyob xususiyatlariga asoslangan strategiyalar.
-
Tier bo'yicha guruhlash majburiy. Volatillik, likvidlik va mikrostruktura farqlarini tushunmasdan BTC (Tier 1) natijalarini PEPE (Tier 3) natijalari bilan solishtirib bo'lmaydi.
-
Moslashuvchan parametr masshtablashi — volatillik bo'yicha chegaralarni normallashtirish — multi-simvolli testlashning realligini sezilarli darajada yaxshilaydi.
-
CSRS > 0,5 — oqilona minimal chegara. Strategiya xuddi shu tier'dagi simvollarning >= 60% ida foydali bo'lishi kerak, va barcha simvollar bo'yicha o'rtacha PnL musbat bo'lishi kerak.
-
Walk-forward + Multi-symbol + Monte-Karlo — uchta ortogonal validatsiya o'qi. Har bir usul boshqalari o'tkazib yuboradigan narsani ushlaydi. Uchalasidan ham foydalaning.
PnL +25% va CSRS 0,72 ga ega strategiya PnL +300% va CSRS 0,18 ga ega strategiyaga qaraganda ishonchliroq. Birinchisi bozor samarasizligidan daromad oladi. Ikkinchisi yagona narx qatorini yodlab olishdan daromad oladi.
Foydali havolalar
- 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
Iqtibos
@article{soloviov2026multisymbolvalidation,
author = {Soloviov, Eugen},
title = {Multi-Symbol Validation: Test Your Strategy on All Pairs},
year = {2026},
url = {https://marketmaker.cc/en/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.}
}
Authors
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.