Мульти-символды валидация: стратегияңды барлық жұптарда тексер
"Иллюзиясыз бэктесттер" сериясының мақаласы
Сіз 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 тұзағы.
Жалғыз инструмент тұзағы

Стратегияны бір ғана символда оңтайландыру, негізінен, оны белгілі бір активтің баға динамикасына бейімдеу болып табылады. Walk-forward жүргізілген болса да, бутстрэп кең сенімділік интервалдарын көрсетсе де — осы тексерулердің барлығы бір ғана уақыт қатары шеңберінде орындалды.
Walk-forward уақыт бойынша тұрақтылықты тексереді: параметрлер сол инструменттің болашақ деректерінде жұмыс істей ме. Монте-Карло сауда реті бойынша тұрақтылықты тексереді: стратегия басқа тізбекке төтеп бере ала ма. Бірақ бұл әдістердің ешқайсысы инструменттер бойынша тұрақтылықты тексермейді: стратегия басқа сипаттамалары бар басқа активтерде жұмыс істей ме.
Егер стратегия тек ETHUSDT-та ғана рентабельді болса — ол нарықтық тиімсіздікті емес, ETH баға қатарының нақты құрылымын ұстап алды:
- ETH-ке тән ерекше свеча үлгілері
- Шектер бейімделген нақты волатильділік деңгейлері
- Осы нақты жұптың өтімділігі мен микроқұрылымының ерекшеліктері
- Белгілі бір кезеңге тән BTC-мен корреляция
Мұның ешқайсысы edge емес. Бұл инструмент деңгейіндегі curve fitting.
Крипто нарығындағы символ топтары (Tiers)

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

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 мақаласында)
Өту критерийлері
Стратегия мульти-символды валидациядан өтеді, егер:
- Сол tier-дегі символдардың >= 60%-ында рентабельді болса
- Топтағы орташа PnL оң болса
- MaxDD күрт өспесе (оңтайландыру символына қатысты 2-3 еседен артық емес)
- Стратегия ТЕК оңтайландыру символында ғана рентабельді болса — қабылданбайды
Мысал: үш стратегия, үш нәтиже

Нақты мысалды қарастырайық. Үш стратегия (Стратегия 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-тің ерекше үлгілерін ұстап алды, нарықтық тиімсіздікті емес. Қабылданбайды.
Стратегиялар басқа символдарда неге бұзылады

1. Волатильділік сәйкессіздігі
Ең кең тараған себеп. Стратегия параметрлері белгілі бір волатильділік деңгейіне реттелген. Стратегия 2% кіру шегін пайдаланса — 3% күнделікті волатильділігі бар ETH үшін бұл ақылға қонымды сүзгі. 8% күнделікті волатильділігі бар DOGE үшін бұл шек тым жиі іске қосылып, көптеген жалған сигналдар туғызады.
Дәл сол сияқты, 1% stop loss ETH үшін жеткілікті, ал PEPE үшін бұл — қалыпты "шу", және стоп күніне ондаған рет соғылады.
2. Өтімділік айырмашылықтары
Стратегия ордердің ағымдағы бағада лезде орындалатынын болжайды. 5 bps шегінде 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 өзгереді.
Бейімделгіш параметр масштабтау

Стратегияны барлық символдарда бірдей параметрлермен іске қосу дұрыс емес. Бірақ әр символда толық қайта оңтайландыру мульти-символды валидацияның негізгі мақсатын жоққа шығарады (параметрлер әр символға "туған" болып кетеді).
Ымыраласу — волатильділік бойынша параметрлерді нормализациялау:
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 мультипликаторы) әдетте масштабталмайды — олар индикатордың өзі арқылы волатильділік бойынша бұрыннан нормализацияланған.
Екі валидация режимі
-
Қатаң режим (масштабтаусыз): бірдей параметрлермен іске қосу. Абсолютті тұрақтылық тесті. Стратегия рентабельді болса — edge мықты.
-
Бейімделгіш режим (масштабтаумен): нормализацияланған параметрлермен іске қосу. Волатильділік деңгейлері әртүрлі екенін ескере отырып, стратегия логикасының тұрақтылық тесті.
Біз екі тестті де жүргізуді ұсынамыз. Қатаң режим — edge-тің "күшін" бағалау үшін. Бейімделгіш режим — практикалық қолдану үшін.
Cross-Symbol тұрақтылық көрсеткіші

Мульти-символды тұрақтылықты сандық бағалау үшін біз құрама метрика — Cross-Symbol Robustness Score (CSRS) енгіземіз.
Формула
мұндағы:
- — рентабельді символдар үлесі:
- — нормализацияланған, өтімділікпен өлшенген орташа PnL:
мұндағы — символының өтімділігі (орташа күнделікті көлем).
- — tier-аралық сәйкестік үшін бонус:
- — символдар арасындағы жоғары PnL дисперсиясы үшін айыппұл:
Әдепкі салмақтар
| Компонент | Салмақ | Негіздеме |
|---|---|---|
| (рентабельді үлес) | 0.35 | Ең маңыздысы: стратегия көпшілікте жұмыс істеуі керек |
| (орташа PnL) | 0.25 | Абсолютті табыстылық |
| (cross-tier) | 0.25 | Әмбебаптық үшін бонус |
| (дисперсия айыппұлы) | 0.15 | Тұрақсыздық үшін айыппұл |
CSRS интерпретациясы
| CSRS | Интерпретация |
|---|---|
| > 0.7 | Тамаша тұрақтылық. Стратегия көптеген инструменттерде жұмыс істейді. |
| 0.5 — 0.7 | Жақсы тұрақтылық. Стратегия өз tier-інде және ішінара басқаларында жұмыс істейді. |
| 0.3 — 0.5 | Шекаралық. Стратегия символдардың тар жиынтығында жұмыс істейді. |
| < 0.3 | Төмен тұрақтылық. Инструмент деңгейіндегі curve fitting ықтимал. |
Толық іске асыру: мульти-символды валидация pipeline-ы

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

Әр стратегия бірнеше инструментте жұмыс істеуге міндетті емес. 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.
Басқа валидация әдістерімен байланыс

Мульти-символды валидация out-of-sample тестілеудің үш ортогональды әдісінің бірі:
| Әдіс | Валидация осі | Не анықтайды |
|---|---|---|
| Walk-Forward | Уақыт | Белгілі бір кезеңге overfitting |
| Multi-symbol | Инструмент | Белгілі бір активке overfitting |
| Монте-Карло бутстрэп | Сауда реті | Белгілі бір тізбекке тәуелділік |
Әр әдіс өз осі бойынша тұрақтылықты тексереді. Стратегия walk-forward-тан өтуі мүмкін, бірақ multi-symbol-да сәтсіздікке ұшырауы мүмкін (инструментке curve fitting). Ол multi-symbol-дан өтуі мүмкін, бірақ Монте-Карлода сәтсіздікке ұшырауы мүмкін (сәтті сауда ретіне тәуелді болу).
Overfitting-тен максималды қорғаныс: үш әдісті де қолданыңыз.
Толық валидация pipeline-ы:
- Бір символда параметрлерді оңтайландыру
- Плато анализі — оптимум тұрақтылығын тексеру
- Walk-forward — уақыт осі бойынша валидация (WFER > 0,5)
- Multi-symbol — инструмент осі бойынша валидация (CSRS > 0,5)
- Монте-Карло бутстрэп — сенімділік интервалдары (5-ші процентиль > 0)
- Funding rate-терді және шығын-табыс асимметриясын ескеру
Барлық алты тексеруден өткен стратегияның overfitting артефактісі болу ықтималдығы минималды.
Кеңейтулер: символдар корреляциясы және каскадты стратегиялар

Мульти-символды валидация тағы бір аспектіні ашады: символдар арасындағы корреляциялар. Егер стратегия BTC мен ETH-те рентабельді болса, бірақ барлық альткоиндерде рентабельсіз болса — бұл edge-тің BTC-ETH жоғары корреляциясына байланысты екені туралы ақпарат. Корреляция құрылымдарының егжей-тегжейлі талдауы Сигнал корреляциясы және pairs trading мақаласында.
Стратегия портфельдері үшін мульти-символды нәтижелер стратегия қандай инструменттерде іске қосылуы керектігін анықтайды. Жоғарыдағы мысалдың Стратегия A — тек Tier 1-2. Стратегия B — Tier 1-3. Бұл каскадты оркестрация үшін кіріс деректер, онда әртүрлі стратегиялар олардың тұрақтылық профиліне байланысты әртүрлі инструменттерде іске қосылады.
Қорытынды
Мульти-символды валидация міндетті емес нәрсе емес — бұл жалпыланған нарықтық edge-ті талап ететін кез келген стратегия үшін міндетті қадам. Негізгі тұжырымдар:
-
Тек бір символда ғана жұмыс істейтін стратегия сол символдың ерекшеліктеріне overfit болу ықтималдығы жоғары. Ерекшеліктер: маркет-мейкинг, арбитраж, активтің ерекше қасиеттеріне негізделген стратегиялар.
-
Tier бойынша топтастыру міндетті. Волатильділік, өтімділік және микроқұрылым айырмашылықтарын түсінбей BTC (Tier 1) нәтижелерін PEPE (Tier 3) нәтижелерімен салыстыруға болмайды.
-
Бейімделгіш параметр масштабтауы — волатильділік бойынша шектерді нормализациялау — мульти-символды тестілеудің шынайылығын айтарлықтай жақсартады.
-
CSRS > 0,5 — ақылға қонымды минималды шек. Стратегия сол tier-дегі символдардың >= 60%-ында рентабельді болуы керек, ал барлық символдар бойынша орташа PnL оң болуы керек.
-
Walk-forward + Multi-symbol + Монте-Карло — үш ортогональды валидация осі. Әр әдіс басқалары жіберіп алатынды ұстайды. Үшеуін де қолданыңыз.
PnL +25% және CSRS 0,72 бар стратегия PnL +300% және CSRS 0,18 бар стратегияға қарағанда сенімдірек. Біріншісі нарықтық тиімсіздіктен табыс табады. Екіншісі жалғыз баға қатарын жаттап алудан табыс табады.
Пайдалы сілтемелер
- Lopez de Prado, M. — Advances in Financial Machine Learning (Wiley)
- Pardo, R. — The Evaluation and Optimization of Trading Strategies (Wiley)
- Bailey, D.H. et al. — The Probability of Backtest Overfitting
- Aronson, D.R. — Evidence-Based Technical Analysis
- Kevin Davey — Building Winning Algorithmic Trading Systems (Wiley)
- Harvey, C.R. & Liu, Y. — Backtesting (2015)
- Chan, E. — Algorithmic Trading: Winning Strategies and Their Rationale (Wiley)
- Binance Research — Cryptocurrency Correlation Analysis
- NumPy — numpy.random.choice
- Pandas — DataFrame
Дәйексөз
@article{soloviov2026multisymbolvalidation,
author = {Soloviov, Eugen},
title = {Multi-Symbol Validation: Test Your Strategy on All Pairs},
year = {2026},
url = {https://marketmaker.cc/en/blog/post/multi-symbol-validation},
version = {0.1.0},
description = {Why a strategy optimized on ETHUSDT may fail on altcoins. How to properly test across pair groups (blue chips, large caps, shitcoins) and what cross-symbol robustness score to consider sufficient.}
}
Authors
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.