← Мақалаларға оралу
March 10, 2026
5 мин оқу

Мульти-символды валидация: стратегияңды барлық жұптарда тексер

Мульти-символды валидация: стратегияңды барлық жұптарда тексер
#algotrading
#backtest
#validation
#multi-symbol
#diversification
#crypto

"Иллюзиясыз бэктесттер" сериясының мақаласы

Сіз ETHUSDT-та стратегияны оңтайландырдыңыз. 25 айлық деректер, 12+ параметр. Бэктест PnL +55%, 500 сауда, MaxDD -0,9%, позиция уақыттың 15% ашық екенін көрсетеді. Эквити қисығы тегіс өседі. Параметрлер плато анализінен өтті — оптимум кең көрінеді. Walk-forward WFER > 0,6 береді. Монте-Карло бутстрэп оң 5-ші процентильді көрсетеді.

Барлығы тамаша. Тек бір нәрседен басқа: сіз стратегияны бір ғана инструментте тестіден өткіздіңіз.

Сіз сол алгоритмді сол параметрлермен BTCUSDT-та іске қосасыз — PnL +8%. SOLUSDT-та — PnL -12%. DOGEUSDT-та — PnL -34%. ETH-те барлық тексерулерден өткен стратегия басқа жұптардың көпшілігінде рентабельсіз болып шығады.

Бұл баг емес. Бұл — алгосаудада ең кең тараған және жасырын overfitting түрлерінің бірі — single-symbol тұзағы.

Жалғыз инструмент тұзағы

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

Стратегияны бір ғана символда оңтайландыру, негізінен, оны белгілі бір активтің баға динамикасына бейімдеу болып табылады. Walk-forward жүргізілген болса да, бутстрэп кең сенімділік интервалдарын көрсетсе де — осы тексерулердің барлығы бір ғана уақыт қатары шеңберінде орындалды.

Walk-forward уақыт бойынша тұрақтылықты тексереді: параметрлер сол инструменттің болашақ деректерінде жұмыс істей ме. Монте-Карло сауда реті бойынша тұрақтылықты тексереді: стратегия басқа тізбекке төтеп бере ала ма. Бірақ бұл әдістердің ешқайсысы инструменттер бойынша тұрақтылықты тексермейді: стратегия басқа сипаттамалары бар басқа активтерде жұмыс істей ме.

Егер стратегия тек ETHUSDT-та ғана рентабельді болса — ол нарықтық тиімсіздікті емес, ETH баға қатарының нақты құрылымын ұстап алды:

  • ETH-ке тән ерекше свеча үлгілері
  • Шектер бейімделген нақты волатильділік деңгейлері
  • Осы нақты жұптың өтімділігі мен микроқұрылымының ерекшеліктері
  • Белгілі бір кезеңге тән BTC-мен корреляция

Мұның ешқайсысы edge емес. Бұл инструмент деңгейіндегі curve fitting.

Крипто нарығындағы символ топтары (Tiers)

Symbol tier characteristics matrix

Барлық криптовалюталар бірдей емес. Мағыналы мульти-символды валидация үшін инструменттер түбегейлі әртүрлі сипаттамалары бар топтарға бөлінетінін түсіну керек.

Tier 1: Blue Chips (BTC, ETH)

Жоғары өтімділік, салыстырмалы түрде төмен волатильділік, институционалдық ағын. Макро (S&P 500, DXY, ФРЖ ставкалары) корреляциясы. Терең order book-тар, тар спрэдтер, тұрақты funding rate-тер. Әдеттегі күнделікті волатильділік: 2-4%.

Tier 2: Large Caps (SOL, BNB, ADA, XRP, AVAX)

Орташа өтімділік, жоғарылатылған волатильділік. Қозғалыстар көбіне секторлық динамикамен (L1 vs L2, DeFi vs infra) басқарылады. Funding rate-тер айнымалырақ. Спрэдтер кеңірек. Әдеттегі күнделікті волатильділік: 4-6%.

Tier 3: Mid Caps (DOGE, SHIB, PEPE, ARB, OP)

Мем-коиндер мен нарративтік токендер. Жоғары волатильділік, іргелі факторлармен төмен корреляция. Қозғалыстар әлеуметтік желілермен, листингтермен, нарративтермен анықталады. Кейбір биржаларда сирек order book-тар. Әдеттегі күнделікті волатильділік: 6-10%.

Tier 4: Low Caps (жаңа листингтер)

Экстремалды волатильділік, сирек order book-тар, манипуляция қаупі. Толық бэктест үшін көбіне жеткіліксіз тарих. Әдеттегі күнделікті волатильділік: 10-20%+.

Сипаттамалардың жиынтық кестесі

Сипаттама Tier 1 Tier 2 Tier 3 Tier 4
Күнделікті волатильділік 2-4% 4-6% 6-10% 10-20%+
Орташа спрэд (perps) 0.01-0.02% 0.02-0.05% 0.05-0.15% 0.1-0.5%+
Order book тереңдігі (топ 5 bps) $5-50M $1-10M $100K-2M $10K-200K
Funding rate (орташа абс.) 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 ай

Әр tier — өз микроқұрылымы бар бөлек "әлем". Tier 1 үшін реттелген стратегия Tier 3-ке көшкенде бөтен ортаға енеді.

Мульти-символды валидация әдістемесі

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

1-қадам: Бір символда оңтайландыру

Оңтайландыру үшін символ таңдаңыз — мысалы, ETHUSDT. Толық pipeline-ды іске қосыңыз: Optuna оңтайландыруы, плато анализі, walk-forward. Параметрлерді бекітіңіз.

2-қадам: Сол tier-дегі символдарда тестілеу

Стратегияны сол параметрлермен сол tier-дің 5-10 символында іске қосыңыз. Tier 1 үшін бұл шектеулі (BTC + ETH), бірақ Tier 2 және Tier 3 үшін символдар жеткілікті.

3-қадам: Басқа tier-лердегі символдарда тестілеу

Стратегияны әр басқа tier-дің 3-5 символында іске қосыңыз. Бұл — ең қиын тест: стратегия ETHUSDT-та (Tier 1) және DOGEUSDT-та (Tier 3) жұмыс істесе, curve fitting ықтималдығы минималды.

4-қадам: Нәтижелерді топ бойынша талдау

Метрикаларды tier бойынша агрегациялап, cross-symbol тұрақтылықты бағалаңыз.

Әр символ үшін метрикалар

Әр символ үшін жазып алыңыз:

  • PnL — жалпы табыстылық
  • MaxDD — максималды drawdown
  • N trades — сауда саны
  • Win rate — рентабельді саудалардың үлесі
  • PnL/белсенді күн — белсенді уақыт бірлігіне табыстылық (толығырақ белсенді уақыт бойынша PnL мақаласында)

Өту критерийлері

Стратегия мульти-символды валидациядан өтеді, егер:

  1. Сол tier-дегі символдардың >= 60%-ында рентабельді болса
  2. Топтағы орташа PnL оң болса
  3. MaxDD күрт өспесе (оңтайландыру символына қатысты 2-3 еседен артық емес)
  4. Стратегия ТЕК оңтайландыру символында ғана рентабельді болса — қабылданбайды

Мысал: үш стратегия, үш нәтиже

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

Нақты мысалды қарастырайық. Үш стратегия (Стратегия A, Стратегия B, Стратегия C), ETHUSDT-та оңтайландырылған, төрт tier-дің 12 символында тестіден өткен.

Стратегия A (ETHUSDT-та оңтайландырылған)

Параметрлер: PnL +55%, ~500 сауда, ~15% белсенді уақыт, MaxDD ~0,9%.

Символ Tier PnL MaxDD N trades Win rate 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%

* — оңтайландыру символы

Tier бойынша нәтижелер:

Tier Символдар Рентабельді Орташа PnL Орташа 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%

Қорытынды: Стратегия A Tier 1-2-де жұмыс істейді, бірақ Tier 3-те толығымен сәтсіздікке ұшырайды. Бұл төмен волатильділік ортасына реттелген типтік стратегия. Blue chips пен large caps портфелі үшін — жарамды. Әмбебап қолдану үшін — жоқ.

Стратегия B (ETHUSDT-та оңтайландырылған)

Параметрлер: PnL +25%, ~40 сауда, ~5% белсенді уақыт.

Символ 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 бойынша нәтижелер:

Tier Символдар Рентабельді Орташа PnL Орташа 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%

Қорытынды: Стратегия B 11 символдың 9-ында рентабельді (82%). Орташа PnL барлық tier-лерде оң. MaxDD tier-ге сай болжамды түрде өседі. Бұл — нақты нарықтық edge-і бар тұрақты стратегия. Оңтайландыру символында қарапайымдау PnL-ге қарамастан (+25% қарсы +55%), Стратегия B Стратегия A-ға қарағанда айтарлықтай сенімдірек.

Стратегия C (ETHUSDT-та оңтайландырылған)

Параметрлер: PnL +300%, ~400 сауда, ~45% белсенді уақыт, MaxDD ~17%.

Символ 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%

Қорытынды: Стратегия C — классикалық overfitting. ETHUSDT-та +301%, бірақ басқа жұптардың көпшілігінде апатты шығындар. Tier 3-те MaxDD 70%-дан асады — бұл капиталды жою. Стратегия ETH-тің ерекше үлгілерін ұстап алды, нарықтық тиімсіздікті емес. Қабылданбайды.

Стратегиялар басқа символдарда неге бұзылады

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

1. Волатильділік сәйкессіздігі

Ең кең тараған себеп. Стратегия параметрлері белгілі бір волатильділік деңгейіне реттелген. Стратегия 2% кіру шегін пайдаланса — 3% күнделікті волатильділігі бар ETH үшін бұл ақылға қонымды сүзгі. 8% күнделікті волатильділігі бар DOGE үшін бұл шек тым жиі іске қосылып, көптеген жалған сигналдар туғызады.

Дәл сол сияқты, 1% stop loss ETH үшін жеткілікті, ал PEPE үшін бұл — қалыпты "шу", және стоп күніне ондаған рет соғылады.

2. Өтімділік айырмашылықтары

Стратегия ордердің ағымдағы бағада лезде орындалатынын болжайды. 5 bps шегінде 50MorderbookтереңдігібарBTCUSDTта—бұлшынайы.50M order book тереңдігі бар BTCUSDT-та — бұл шынайы. 200K тереңдігі бар ARBUSDT-та — сіздің $10K ордеріңіз бағаны жылжытады, ал нақты орындалу 0,05-0,2%-ға нашарлайды. 500 сауда бойы бұл slippage-тен жалғыз ғана 25-100% жоғалту дегенді білдіреді.

3. Нарық микроқұрылымы

Әр инструменттің өз микроқұрылымы бар:

  • Funding rate-тер: BTC-де funding бұқа нарығында тұрақты түрде оң (әр 8 сағатта +0,01%). Мем-коиндерде funding -0,3%-дан +0,5%-ға дейін секіруі мүмкін. Толығырақ Funding rate-тер сіздің левереджіңізді жейді мақаласында.
  • Спрэд: Tier 1-де спрэд 0,01%, Tier 4-те — 0,5%. Кіші take-profit-тары бар стратегия спрэд take өлшемінен асып кеткенде рентабельді бола алмайды.
  • Манипуляция үлгілері: wick-тер, спуфинг, wash trading — әр tier-де әртүрлі көрінеді.

4. Режимге сезімталдық

Альткоиндер әртүрлі нарық фазаларында әртүрлі әрекет етеді:

  • Бұқа трендінде альткоиндер BTC-ден асып түседі (бета > 1)
  • Аю трендінде альткоиндер BTC-ден қатты құлайды
  • Бүйірлік нарықта альткоиндер BTC-мен корреляцияда болуы немесе өз нарративтері бойынша қозғалуы мүмкін

Бір фазада бір символда оңтайландырылған стратегия сол символдың BTC-ге қатысты lag/lead-іне оңтайлы реттелген болуы мүмкін — ал режим ауысқанда бұл lag/lead өзгереді.

Бейімделгіш параметр масштабтау

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

Стратегияны барлық символдарда бірдей параметрлермен іске қосу дұрыс емес. Бірақ әр символда толық қайта оңтайландыру мульти-символды валидацияның негізгі мақсатын жоққа шығарады (параметрлер әр символға "туған" болып кетеді).

Ымыраласу — волатильділік бойынша параметрлерді нормализациялау:

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'}

Stop loss 1%-дан 2,53%-ға өсті — бұл DOGE-тің 8,1% күнделікті волатильділігіне сай келеді. Масштабтаусыз 1% стоп "шудан" ондаған рет соғылар еді.

Маңызды: тек баға шектерін (кіру, стоп, take) масштабтаңыз. Индикатор кезеңдері (RSI, MA) мен мультипликаторлар (ATR мультипликаторы) әдетте масштабталмайды — олар индикатордың өзі арқылы волатильділік бойынша бұрыннан нормализацияланған.

Екі валидация режимі

  1. Қатаң режим (масштабтаусыз): бірдей параметрлермен іске қосу. Абсолютті тұрақтылық тесті. Стратегия рентабельді болса — edge мықты.

  2. Бейімделгіш режим (масштабтаумен): нормализацияланған параметрлермен іске қосу. Волатильділік деңгейлері әртүрлі екенін ескере отырып, стратегия логикасының тұрақтылық тесті.

Біз екі тестті де жүргізуді ұсынамыз. Қатаң режим — edge-тің "күшін" бағалау үшін. Бейімделгіш режим — практикалық қолдану үшін.

Cross-Symbol тұрақтылық көрсеткіші

Multi-symbol cross-robustness radar

Мульти-символды тұрақтылықты сандық бағалау үшін біз құрама метрика — Cross-Symbol Robustness Score (CSRS) енгіземіз.

Формула

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

мұндағы:

  • RprofitR_{profit} — рентабельді символдар үлесі:

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

  • RpnlR_{pnl} — нормализацияланған, өтімділікпен өлшенген орташа PnL:

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

мұндағы lil_iii символының өтімділігі (орташа күнделікті көлем).

  • PconsistencyP_{consistency} — tier-аралық сәйкестік үшін бонус:

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

  • PvarianceP_{variance} — символдар арасындағы жоғары PnL дисперсиясы үшін айыппұл:

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

Әдепкі салмақтар

Компонент Салмақ Негіздеме
w1w_1 (рентабельді үлес) 0.35 Ең маңыздысы: стратегия көпшілікте жұмыс істеуі керек
w2w_2 (орташа PnL) 0.25 Абсолютті табыстылық
w3w_3 (cross-tier) 0.25 Әмбебаптық үшін бонус
w4w_4 (дисперсия айыппұлы) 0.15 Тұрақсыздық үшін айыппұл

CSRS интерпретациясы

CSRS Интерпретация
> 0.7 Тамаша тұрақтылық. Стратегия көптеген инструменттерде жұмыс істейді.
0.5 — 0.7 Жақсы тұрақтылық. Стратегия өз tier-інде және ішінара басқаларында жұмыс істейді.
0.3 — 0.5 Шекаралық. Стратегия символдардың тар жиынтығында жұмыс істейді.
< 0.3 Төмен тұрақтылық. Инструмент деңгейіндегі curve fitting ықтимал.

Толық іске асыру: мульти-символды валидация pipeline-ы

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 қолдану мысалы

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 валидация қашан қолайлы

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

Әр стратегия бірнеше инструментте жұмыс істеуге міндетті емес. Single-symbol қалыпты тәсіл болатын заңды жағдайлар бар:

Нақты order book-та маркет-мейкинг

Маркет-мейкинг стратегиясы (мысалы, Avellaneda-Stoikov моделін пайдаланатын) анықтамасы бойынша нақты order book-қа байланысты. Параметрлер нақты микроқұрылымға байланысты: тереңдік, спрэд, кезектегі позиция, fill rate. Басқа символда тестілеу мағынасыз — бұл басқа order book.

Нақты жұптар арасындағы арбитраж

Funding rate арбитражы немесе cross-exchange арбитраж анықтамасы бойынша нақты инструмент жұптарына байланысты. Мұнда валидация басқа биржаларда сол жұптармен жүргізіледі, басқа символдарда емес.

Активтің ерекше қасиеттерін нақты пайдаланатын стратегиялар

Егер стратегия активтің нақты бір қасиетіне негізделсе (мысалы, BTC-тің хэшрейтпен корреляциясы немесе ETH-тің газ комиссияларымен корреляциясы), мульти-символды валидация қолданылмайды. Бірақ мұндай стратегиялар сирек кездеседі.

Барлық басқа жағдайларда — стратегия "жалпы" сигналдарға (MA crossover, RSI, momentum, mean reversion) негізделсе — мульти-символды валидация міндетті. Егер жалпы стратегия тек бір символда ғана жұмыс істесе, бұл edge емес — бұл overfitting.

Басқа валидация әдістерімен байланыс

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

Мульти-символды валидация out-of-sample тестілеудің үш ортогональды әдісінің бірі:

Әдіс Валидация осі Не анықтайды
Walk-Forward Уақыт Белгілі бір кезеңге overfitting
Multi-symbol Инструмент Белгілі бір активке overfitting
Монте-Карло бутстрэп Сауда реті Белгілі бір тізбекке тәуелділік

Әр әдіс өз осі бойынша тұрақтылықты тексереді. Стратегия walk-forward-тан өтуі мүмкін, бірақ multi-symbol-да сәтсіздікке ұшырауы мүмкін (инструментке curve fitting). Ол multi-symbol-дан өтуі мүмкін, бірақ Монте-Карлода сәтсіздікке ұшырауы мүмкін (сәтті сауда ретіне тәуелді болу).

Overfitting-тен максималды қорғаныс: үш әдісті де қолданыңыз.

Толық валидация pipeline-ы:

  1. Бір символда параметрлерді оңтайландыру
  2. Плато анализі — оптимум тұрақтылығын тексеру
  3. Walk-forward — уақыт осі бойынша валидация (WFER > 0,5)
  4. Multi-symbol — инструмент осі бойынша валидация (CSRS > 0,5)
  5. Монте-Карло бутстрэп — сенімділік интервалдары (5-ші процентиль > 0)
  6. Funding rate-терді және шығын-табыс асимметриясын ескеру

Барлық алты тексеруден өткен стратегияның overfitting артефактісі болу ықтималдығы минималды.

Кеңейтулер: символдар корреляциясы және каскадты стратегиялар

Cryptocurrency correlation network graph with cascade strategy allocation flows

Мульти-символды валидация тағы бір аспектіні ашады: символдар арасындағы корреляциялар. Егер стратегия BTC мен ETH-те рентабельді болса, бірақ барлық альткоиндерде рентабельсіз болса — бұл edge-тің BTC-ETH жоғары корреляциясына байланысты екені туралы ақпарат. Корреляция құрылымдарының егжей-тегжейлі талдауы Сигнал корреляциясы және pairs trading мақаласында.

Стратегия портфельдері үшін мульти-символды нәтижелер стратегия қандай инструменттерде іске қосылуы керектігін анықтайды. Жоғарыдағы мысалдың Стратегия A — тек Tier 1-2. Стратегия B — Tier 1-3. Бұл каскадты оркестрация үшін кіріс деректер, онда әртүрлі стратегиялар олардың тұрақтылық профиліне байланысты әртүрлі инструменттерде іске қосылады.

Қорытынды

Мульти-символды валидация міндетті емес нәрсе емес — бұл жалпыланған нарықтық edge-ті талап ететін кез келген стратегия үшін міндетті қадам. Негізгі тұжырымдар:

  1. Тек бір символда ғана жұмыс істейтін стратегия сол символдың ерекшеліктеріне overfit болу ықтималдығы жоғары. Ерекшеліктер: маркет-мейкинг, арбитраж, активтің ерекше қасиеттеріне негізделген стратегиялар.

  2. Tier бойынша топтастыру міндетті. Волатильділік, өтімділік және микроқұрылым айырмашылықтарын түсінбей BTC (Tier 1) нәтижелерін PEPE (Tier 3) нәтижелерімен салыстыруға болмайды.

  3. Бейімделгіш параметр масштабтауы — волатильділік бойынша шектерді нормализациялау — мульти-символды тестілеудің шынайылығын айтарлықтай жақсартады.

  4. CSRS > 0,5 — ақылға қонымды минималды шек. Стратегия сол tier-дегі символдардың >= 60%-ында рентабельді болуы керек, ал барлық символдар бойынша орташа PnL оң болуы керек.

  5. Walk-forward + Multi-symbol + Монте-Карло — үш ортогональды валидация осі. Әр әдіс басқалары жіберіп алатынды ұстайды. Үшеуін де қолданыңыз.

PnL +25% және CSRS 0,72 бар стратегия PnL +300% және CSRS 0,18 бар стратегияға қарағанда сенімдірек. Біріншісі нарықтық тиімсіздіктен табыс табады. Екіншісі жалғыз баға қатарын жаттап алудан табыс табады.


Пайдалы сілтемелер

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

Дәйексөз

@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

Нарықтан бір қадам алда болыңыз

AI сауда талдаулары, нарық аналитикасы және платформа жаңалықтары үшін біздің ақпараттық бюллетеньге жазылыңыз.

Біз сіздің жекелігіңізді құрметтейміз. Кез келген уақытта жазылымнан шығуға болады.