Multi-simvolli validatsiya: strategiyangizni barcha juftliklarda sinang

ETHUSDT bo'yicha optimallashtirilgan strategiya nima uchun altkoinlarda muvaffaqiyatsizlikka uchrashi mumkin. Juftlik guruhlari (blue chips, large caps, shitcoins) bo'yicha to'g'ri sinash usuli va yetarli deb hisoblanadigan cross-symbol barqarorlik ko'rsatkichi.

"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

XususiyatTier 1Tier 2Tier 3Tier 4
Kunlik volatillik2-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 korrelyatsiya0.85-0.950.6-0.850.3-0.70.1-0.5
Minimal tarix5+ yil2-5 yil6 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%.

SimvolTierPnLMaxDDN tradesWin ratePnL/faol kun
ETHUSDT*1+55.2%-0.9%49152.1%0.48%
BTCUSDT1+31.4%-1.8%47850.8%0.27%
SOLUSDT2+22.7%-3.1%51249.2%0.18%
BNBUSDT2+18.3%-2.7%46748.9%0.16%
AVAXUSDT2+8.1%-4.5%49847.6%0.07%
ADAUSDT2-3.2%-6.1%44546.1%-0.03%
DOGEUSDT3-12.8%-9.4%53144.3%-0.10%
SHIBUSDT3-18.7%-12.1%48743.1%-0.16%
PEPEUSDT3-24.3%-14.8%55642.7%-0.18%
ARBUSDT3-7.4%-7.2%41945.8%-0.07%
OPUSDT3-5.1%-6.8%40246.2%-0.05%

* — optimallashtirish simvoli

Tier bo'yicha natijalar:

TierSimvollarFoydaliO'rtacha PnLO'rtacha MaxDD
Tier 122 (100%)+43.3%-1.4%
Tier 243 (75%)+11.5%-4.1%
Tier 350 (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.

SimvolTierPnLMaxDDN tradesWin rate
ETHUSDT*1+25.1%-2.3%3857.9%
BTCUSDT1+21.8%-2.8%4156.1%
SOLUSDT2+19.4%-3.5%4454.5%
BNBUSDT2+16.7%-3.1%3754.1%
AVAXUSDT2+12.3%-4.2%4252.4%
ADAUSDT2+8.9%-4.8%3951.3%
DOGEUSDT3+4.2%-6.7%4847.9%
SHIBUSDT3-1.3%-8.4%4546.7%
PEPEUSDT3-3.8%-9.1%5246.2%
ARBUSDT3+6.1%-5.8%4050.0%
OPUSDT3+3.7%-6.2%3850.0%

Tier bo'yicha natijalar:

TierSimvollarFoydaliO'rtacha PnLO'rtacha MaxDD
Tier 122 (100%)+23.5%-2.6%
Tier 244 (100%)+14.3%-3.9%
Tier 353 (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%.

SimvolTierPnLMaxDDN tradesWin rate
ETHUSDT*1+301.2%-17.1%41853.8%
BTCUSDT1+42.7%-28.4%39548.6%
SOLUSDT2-18.3%-41.2%45644.1%
BNBUSDT2+12.1%-33.7%38746.8%
AVAXUSDT2-31.4%-52.8%47142.3%
ADAUSDT2-44.7%-58.1%41240.5%
DOGEUSDT3-67.2%-74.3%52838.1%
PEPEUSDT3-72.1%-81.6%57437.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 50MorderbookchuqurligigaegaBTCUSDT′da—bureal.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

# Example: Strategy A, optimized on ETHUSDT
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)
}

# Parameters that need scaling
vol_sensitive = ["entry_threshold", "stop_loss", "take_profit", "trailing_stop"]

# Volatilities (daily)
eth_vol = 0.032     # 3.2%
doge_vol = 0.081    # 8.1%

# Scale for DOGE
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=w1⋅Rprofit+w2⋅Rpnl+w3⋅Pconsistency−w4⋅Pvariance\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=1Nli⋅PnLi∑i=1NliR_{pnl} = \frac{\sum_{i=1}^{N} l_i \cdot \text{PnL}_i}{\sum_{i=1}^{N} l_i}

bu yerda lil_i — ii 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

KomponentOg'irlikAsos
w1w_1 (foydali ulush)0.35Eng muhimi: strategiya ko'pchilikda ishlashi kerak
w2w_2 (o'rtacha PnL)0.25Mutlaq daromadlilik
w3w_3 (cross-tier)0.25Universallik uchun bonus
w4w_4 (dispersiya jarimasi)0.15Beqarorlik uchun jarima

CSRS talqini

CSRSTalqin
> 0.7Ajoyib barqarorlik. Strategiya ko'pchilik instrumentlarda ishlaydi.
0.5 — 0.7Yaxshi barqarorlik. Strategiya o'z tier'ida va qisman boshqalarida ishlaydi.
0.3 — 0.5Chegara holati. Strategiya tor simvollar to'plamida ishlaydi.
< 0.3Past 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 dictionary by tier
SYMBOL_TIERS = {
    1: ["BTCUSDT", "ETHUSDT"],
    2: ["SOLUSDT", "BNBUSDT", "ADAUSDT", "XRPUSDT", "AVAXUSDT"],
    3: ["DOGEUSDT", "SHIBUSDT", "PEPEUSDT", "ARBUSDT", "OPUSDT"],
}

# Approximate daily volatilities
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,
}

# Approximate average daily volumes ($)
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 = []

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

            # Parameter scaling
            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()

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

            # PnL per active day (simplified)
            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),
            ))

    # Aggregation by tier
    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),
        ))

    # Compute CSRS
    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
    r_profit = n_profitable / n_total if n_total > 0 else 0

    # R_pnl (liquidity-weighted)
    total_vol = sum(all_volumes)
    r_pnl_raw = sum(r.pnl * r.avg_daily_volume for r in symbol_results) / total_vol
    # Normalize to [0, 1]: using sigmoid
    r_pnl = 1 / (1 + np.exp(-r_pnl_raw * 5))

    # P_consistency
    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

    # P_variance
    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]

    # Pass criteria
    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
    )

    # Generate report
    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)

    # By tier
    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

# Assume you have a strategy function and data loader
def my_strategy(data, params):
    """Your strategy. Returns (pnl, max_dd, n_trades, win_rate, returns)."""
    # ... implementation ...
    pass

def load_ohlcv(symbol):
    """Load OHLCV data for a symbol."""
    # ... load from database / API ...
    pass

# Parameters optimized on ETHUSDT
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,
}

# Run validation
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:

UsulValidatsiya o'qiNimani ochib beradi
Walk-ForwardVaqtMuayyan davrga overfitting
Multi-symbolInstrumentMuayyan aktivga overfitting
Monte-Karlo bootstrapSavdo tartibiMuayyan 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.}
}