← Maqolalarga qaytish
March 10, 2026
5 daqiqa o'qish

Multi-simvolli validatsiya: strategiyangizni barcha juftliklarda sinang

Multi-simvolli validatsiya: strategiyangizni barcha juftliklarda sinang
#algotrading
#backtest
#validation
#multi-symbol
#diversification
#crypto

"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

Single-symbol trap: one bright equity curve surrounded by failing strategies on other assets

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)

Symbol tier characteristics matrix

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

Multi-symbol validation methodology: optimize, test same tier, test other tiers, analyze results

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:

  1. Xuddi shu tier'dagi simvollarning >= 60% ida foydali bo'lsa
  2. Guruh bo'yicha o'rtacha PnL musbat bo'lsa
  3. MaxDD keskin oshmasa (optimallashtirish simvoliga nisbatan 2-3 barobardan ortiq emas)
  4. Agar strategiya FAQAT optimallashtirish simvolida foydali bo'lsa — rad etiladi

Misol: uchta strategiya, uchta natija

Three strategies compared: A (green, partial success), B (cyan, robust), C (red, overfitted)

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

Four factors that break strategies: volatility, liquidity, microstructure, and regime transitions

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 50MorderbookchuqurligigaegaBTCUSDTdabureal.50M order book chuqurligiga ega BTCUSDT'da — bu real. 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

Adaptive parameter scaling: volatility ratio gauge with parameter sliders transforming from tight to wide thresholds

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

  1. Qat'iy rejim (masshtablashsiz): bir xil parametrlar bilan ishga tushirish. Mutlaq barqarorlik sinovi. Agar strategiya foydali bo'lsa — edge kuchli.

  2. 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-symbol cross-robustness radar

Multi-simvolli barqarorlikni miqdoriy baholash uchun biz murakkab metrika — Cross-Symbol Robustness Score (CSRS) ni joriy qilamiz.

Formula

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}

bu yerda:

  • RprofitR_{profit} — foydali simvollar ulushi:

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

  • RpnlR_{pnl} — normallashtirilgan, likvidlik bilan tortilgan o'rtacha PnL:

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

bu yerda lil_iii simvolining likvidligi (o'rtacha kunlik hajm).

  • PconsistencyP_{consistency} — tier'lararo mosligi uchun bonus:

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

  • PvarianceP_{variance} — simvollar orasidagi yuqori PnL dispersiyasi uchun jarima:

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

Standart og'irliklar

Komponent Og'irlik Asos
w1w_1 (foydali ulush) 0.35 Eng muhimi: strategiya ko'pchilikda ishlashi kerak
w2w_2 (o'rtacha PnL) 0.25 Mutlaq daromadlilik
w3w_3 (cross-tier) 0.25 Universallik uchun bonus
w4w_4 (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

Isometric 3D data processing pipeline for multi-symbol strategy validation

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

Exceptions: market-making order book, cross-exchange arbitrage, and unique asset-specific correlation patterns

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

Three orthogonal validation axes: time (walk-forward), instrument (multi-symbol), trade order (Monte Carlo)

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:

  1. Bitta simvolda parametrlarni optimallashtirish
  2. Plato tahlili — optimum barqarorligini tekshirish
  3. Walk-forward — vaqt o'qi bo'yicha validatsiya (WFER > 0,5)
  4. Multi-symbol — instrument o'qi bo'yicha validatsiya (CSRS > 0,5)
  5. Monte-Karlo bootstrap — ishonch intervallari (5-protsentil > 0)
  6. 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

Cryptocurrency correlation network graph with cascade strategy allocation flows

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:

  1. Faqat bitta simvolda ishlaydigan strategiya ehtimol o'sha simvolning xususiyatlariga overfit qilingan. Istisnolar: market-meyking, arbitraj, aktivning noyob xususiyatlariga asoslangan strategiyalar.

  2. Tier bo'yicha guruhlash majburiy. Volatillik, likvidlik va mikrostruktura farqlarini tushunmasdan BTC (Tier 1) natijalarini PEPE (Tier 3) natijalari bilan solishtirib bo'lmaydi.

  3. Moslashuvchan parametr masshtablashi — volatillik bo'yicha chegaralarni normallashtirish — multi-simvolli testlashning realligini sezilarli darajada yaxshilaydi.

  4. 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.

  5. 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

  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

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.}
}
blog.disclaimer

Authors

Eugen Soloviov
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.

Newsletter

Bozordan bir qadam oldinda bo'ling

Sun'iy intellekt savdo tahlillari, bozor tahlili va platforma yangiliklari uchun bizning xabarnomaga obuna bo'ling.

Biz sizning maxfiyligingizni hurmat qilamiz. Istalgan vaqtda obunadan chiqishingiz mumkin.