← Макалаларга кайтуу
March 10, 2026
5 мүн окуу

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

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

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

Сиз ETHUSDT боюнча стратегияны оптималдаштырдыңыз. 25 айлык маалымат, 12+ параметр. Бэктест PnL +55%, 500 сооda, 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 сооda, ~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 сооda, ~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 сооda, ~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% стоп "ызы-чуудан" ондогон жолу тиймек.

Маанилүү: жалгыз гана баа босогоlorun (кирүү, стоп, take) масштабдаңыз. Индикатор мезгилдери (RSI, MA) жана мультипликаторлор (ATR мультипликатору) адатта масштабдалbайт — алар индикатордун өзү аркылуу волатилдик боюнча мурунтан нормалдаштырылган.

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

  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'кo байланыштуу. Параметрлер конкреттүү микроструктурага көз каранды: тереңдик, спрэд, кезектеги позиция, 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. Ыңгайлашуучу параметр масштабдоо — волатилдик боюнча босогоlorду нормалдаштыруу — мульти-символдук тестирлөөнүн реалдуулугун бир топ жакшыртат.

  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 соода аналитикасы, рынок талдоолору жана платформа жаңылыктары үчүн биздин жаңылыктар бюллетенине жазылыңыз.

Биз сиздин купуялыгыңызды урматтайбыз. Каалаган убакта жазылымдан чыга аласыз.