Pengesahan Pelbagai Simbol: Uji Strategi Anda pada Semua Pasangan
Artikel daripada siri "Backtest Tanpa Ilusi"
Anda mengoptimumkan strategi pada ETHUSDT. 25 bulan data, 12+ parameter. Backtest menunjukkan PnL +55%, 500 dagangan, MaxDD -0.9%, posisi terbuka 15% daripada masa. Keluk ekuiti naik dengan lancar. Parameter lulus analisis platau — optimum kelihatan luas. Walk-forward menghasilkan WFER > 0.6. Bootstrap Monte Carlo menunjukkan persentil ke-5 yang positif.
Semuanya sempurna. Kecuali satu perkara: anda menguji strategi pada satu instrumen sahaja.
Anda melancarkan algoritma yang sama dengan parameter yang sama pada BTCUSDT — PnL +8%. Pada SOLUSDT — PnL -12%. Pada DOGEUSDT — PnL -34%. Strategi yang lulus semua pemeriksaan pada ETH ternyata tidak menguntungkan pada kebanyakan pasangan lain.
Ini bukan pepijat. Ini adalah perangkap simbol tunggal — salah satu bentuk overfitting yang paling biasa dan berbahaya dalam algotrading.
Perangkap Instrumen Tunggal

Mengoptimumkan strategi pada satu simbol pada dasarnya adalah menyesuaikannya dengan dinamik harga aset tertentu. Walaupun anda menjalankan walk-forward, walaupun bootstrap menunjukkan selang keyakinan yang luas — semua pemeriksaan ini dilakukan dalam satu siri masa.
Walk-forward memeriksa keteguhan merentas masa: adakah parameter berfungsi pada data masa depan instrumen yang sama. Monte Carlo memeriksa keteguhan merentas susunan dagangan: bolehkah strategi bertahan dengan urutan yang berbeza. Tetapi tiada satu pun daripada kaedah ini memeriksa keteguhan merentas instrumen: adakah strategi berfungsi pada aset lain dengan ciri-ciri yang berbeza.
Jika strategi menguntungkan hanya pada ETHUSDT — ia menangkap bukan ketidakcekapan pasaran, tetapi struktur khusus siri harga ETH:
- Corak candlestick unik yang tersendiri bagi ETH
- Tahap volatiliti tertentu yang padanya ambang diselaraskan
- Spesifik kecairan dan mikrostruktur pasangan tertentu ini
- Korelasi dengan BTC, yang merupakan ciri bagi tempoh tertentu
Tiada satu pun daripada ini adalah edge. Ini adalah curve fitting pada peringkat instrumen.
Kumpulan Simbol (Tier) dalam Pasaran Kripto

Tidak semua mata wang kripto adalah sama. Untuk pengesahan pelbagai simbol yang bermakna, anda perlu memahami bahawa instrumen dibahagikan kepada kumpulan dengan ciri-ciri yang berbeza secara asas.
Tier 1: Blue Chips (BTC, ETH)
Kecairan tinggi, volatiliti yang agak rendah, aliran institusi. Korelasi dengan makro (S&P 500, DXY, kadar Fed). Buku pesanan yang dalam, spread yang ketat, kadar pembiayaan yang stabil. Volatiliti harian biasa: 2-4%.
Tier 2: Large Caps (SOL, BNB, ADA, XRP, AVAX)
Kecairan sederhana, volatiliti yang lebih tinggi. Pergerakan sering didorong oleh dinamik sektor (L1 berbanding L2, DeFi berbanding infrastruktur). Kadar pembiayaan lebih tidak menentu. Spread lebih luas. Volatiliti harian biasa: 4-6%.
Tier 3: Mid Caps (DOGE, SHIB, PEPE, ARB, OP)
Syiling meme dan token naratif. Volatiliti tinggi, korelasi rendah dengan faktor asas. Pergerakan ditentukan oleh media sosial, penyenaraian, naratif. Buku pesanan nipis pada sesetengah bursa. Volatiliti harian biasa: 6-10%.
Tier 4: Low Caps (Penyenaraian Baharu)
Volatiliti melampau, buku pesanan nipis, risiko manipulasi. Sering sejarah yang tidak mencukupi untuk backtest penuh. Volatiliti harian biasa: 10-20%+.
Jadual Ringkasan Ciri-ciri
| Ciri-ciri | Tier 1 | Tier 2 | Tier 3 | Tier 4 |
|---|---|---|---|---|
| Volatiliti harian | 2-4% | 4-6% | 6-10% | 10-20%+ |
| Spread purata (perp) | 0.01-0.02% | 0.02-0.05% | 0.05-0.15% | 0.1-0.5%+ |
| Kedalaman buku pesanan (top 5 bps) | $5-50M | $1-10M | $100K-2M | $10K-200K |
| Kadar pembiayaan (purata abs) | 0.005-0.01% | 0.01-0.03% | 0.02-0.08% | 0.05-0.2%+ |
| Korelasi dengan BTC | 0.85-0.95 | 0.6-0.85 | 0.3-0.7 | 0.1-0.5 |
| Sejarah minimum | 5+ tahun | 2-5 tahun | 6 bln - 3 tahun | < 6 bln |
Setiap tier adalah "dunia" yang berasingan dengan mikrostrukturnya sendiri. Strategi yang diselaraskan untuk Tier 1 memasuki persekitaran asing apabila berpindah ke Tier 3.
Metodologi Pengesahan Pelbagai Simbol

Langkah 1: Optimumkan pada Satu Simbol
Pilih simbol untuk pengoptimuman — contohnya, ETHUSDT. Jalankan saluran paip penuh: pengoptimuman Optuna, analisis platau, walk-forward. Tetapkan parameter.
Langkah 2: Uji pada Simbol dari Tier yang Sama
Jalankan strategi dengan parameter yang sama pada 5-10 simbol dari tier yang sama. Untuk Tier 1 ini terhad (BTC + ETH), tetapi untuk Tier 2 dan Tier 3 terdapat simbol yang mencukupi.
Langkah 3: Uji pada Simbol dari Tier Lain
Jalankan strategi pada 3-5 simbol dari setiap tier lain. Ini adalah ujian paling ketat: jika strategi berfungsi pada ETHUSDT (Tier 1) dan pada DOGEUSDT (Tier 3), kebarangkalian curve fitting adalah minimum.
Langkah 4: Analisis Keputusan mengikut Kumpulan
Agregat metrik mengikut tier dan nilai keteguhan merentas simbol.
Metrik untuk Setiap Simbol
Untuk setiap simbol, rekodkan:
- PnL — jumlah pulangan
- MaxDD — drawdown maksimum
- N dagangan — bilangan dagangan
- Win rate — pecahan dagangan yang menguntungkan
- PnL/hari aktif — pulangan per unit masa aktif (butiran lanjut dalam PnL mengikut masa aktif)
Kriteria Lulus
Strategi lulus pengesahan pelbagai simbol jika:
- Menguntungkan pada >= 60% simbol dalam tier yang sama
- Purata PnL merentas kumpulan adalah positif
- MaxDD tidak meningkat secara dramatik (tidak lebih daripada 2-3x berbanding simbol pengoptimuman)
- Jika strategi menguntungkan HANYA pada simbol pengoptimuman — tolak
Contoh: Tiga Strategi, Tiga Hasil

Mari kita pertimbangkan contoh konkrit. Tiga strategi (Strategi A, Strategi B, Strategi C), dioptimumkan pada ETHUSDT, diuji pada 12 simbol merentas empat tier.
Strategi A (Dioptimumkan pada ETHUSDT)
Parameter: PnL +55%, ~500 dagangan, ~15% masa aktif, MaxDD ~0.9%.
| Simbol | Tier | PnL | MaxDD | N dagangan | Win rate | PnL/hari aktif |
|---|---|---|---|---|---|---|
| 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% |
* — simbol pengoptimuman
Keputusan mengikut tier:
| Tier | Simbol | Menguntungkan | Purata PnL | Purata 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% |
Keputusan: Strategi A berfungsi pada Tier 1-2 tetapi gagal sepenuhnya pada Tier 3. Ini adalah strategi biasa yang diselaraskan untuk persekitaran volatiliti rendah. Untuk portfolio blue chips dan large caps — boleh diterima. Untuk penggunaan universal — tidak.
Strategi B (Dioptimumkan pada ETHUSDT)
Parameter: PnL +25%, ~40 dagangan, ~5% masa aktif.
| Simbol | Tier | PnL | MaxDD | N dagangan | 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% |
Keputusan mengikut tier:
| Tier | Simbol | Menguntungkan | Purata PnL | Purata 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% |
Keputusan: Strategi B menguntungkan pada 9 daripada 11 simbol (82%). Purata PnL adalah positif merentas semua tier. MaxDD meningkat secara boleh diramal dengan tier. Ini adalah strategi yang teguh dengan edge pasaran yang sebenar. Walaupun PnL yang lebih sederhana pada simbol pengoptimuman (+25% berbanding +55%), Strategi B jauh lebih boleh dipercayai daripada Strategi A.
Strategi C (Dioptimumkan pada ETHUSDT)
Parameter: PnL +300%, ~400 dagangan, ~45% masa aktif, MaxDD ~17%.
| Simbol | Tier | PnL | MaxDD | N dagangan | 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% |
Keputusan: Strategi C adalah overfitting klasik. +301% pada ETHUSDT, tetapi kerugian bencana pada kebanyakan pasangan lain. MaxDD pada Tier 3 melebihi 70% — ini adalah pemusnahan modal. Strategi menangkap corak unik ETH, bukan ketidakcekapan pasaran. Tolak.
Mengapa Strategi Gagal pada Simbol Lain

1. Ketidakpadanan Volatiliti
Sebab yang paling biasa. Parameter strategi diselaraskan kepada tahap volatiliti tertentu. Jika strategi menggunakan ambang masuk 2% — untuk ETH dengan volatiliti harian 3%, ini adalah penapis yang munasabah. Untuk DOGE dengan volatiliti harian 8% — ambang ini dicetuskan terlalu kerap, menghasilkan banyak isyarat palsu.
Begitu juga, stop loss 1% adalah mencukupi untuk ETH, tetapi untuk PEPE ia adalah "noise" biasa, dan stop kena berpuluh-puluh kali sehari.
2. Perbezaan Kecairan
Strategi mengandaikan pelaksanaan pesanan serta-merta pada harga semasa. Pada BTCUSDT dengan kedalaman buku pesanan 200K — pesanan $10K anda akan menggerakkan harga, dan pelaksanaan sebenar akan lebih teruk sebanyak 0.05-0.2%. Sepanjang 500 dagangan, itu 25-100% hilang kepada slippage sahaja.
3. Mikrostruktur Pasaran
Setiap instrumen mempunyai mikrostrukturnya sendiri:
- Kadar pembiayaan: pada BTC, pembiayaan secara konsisten positif dalam pasaran lembu (+0.01% setiap 8 jam). Pada syiling meme, pembiayaan boleh melompat dari -0.3% ke +0.5%. Butiran lanjut — dalam Kadar pembiayaan membunuh leverage anda.
- Spread: pada Tier 1 spread adalah 0.01%, pada Tier 4 — 0.5%. Strategi dengan take-profit kecil tidak boleh menguntungkan apabila spread melebihi saiz take.
- Corak manipulasi: wick, spoofing, wash trading — memanifestasikan diri secara berbeza pada setiap tier.
4. Kepekaan Rejim
Altcoin berkelakuan berbeza dalam fasa pasaran yang berbeza:
- Dalam tren lembu, altcoin mengatasi BTC (beta > 1)
- Dalam tren beruang, altcoin jatuh lebih teruk daripada BTC
- Dalam pasaran mendatar, altcoin mungkin berkorelasi dengan BTC atau bergerak mengikut naratif mereka sendiri
Strategi yang dioptimumkan dalam satu fasa pada satu simbol mungkin diselaraskan secara optimum kepada lag/lead simbol tertentu itu berbanding BTC — dan lag/lead ini akan berubah apabila rejim beralih.
Penskalaan Parameter Adaptif

Menjalankan strategi dengan parameter yang sama pada semua simbol adalah tidak betul. Tetapi pengoptimuman semula penuh pada setiap simbol mengalahkan tujuan utama pengesahan pelbagai simbol (parameter menjadi "asli" bagi setiap simbol).
Komprominya adalah normalisasi parameter mengikut volatiliti:
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:
"""
Skala parameter strategi mengikut volatiliti simbol sasaran.
Args:
base_params: parameter yang dioptimumkan pada simbol asal
optimization_symbol_vol: volatiliti harian simbol pengoptimuman
target_symbol_vol: volatiliti harian simbol sasaran
vol_sensitive_params: senarai parameter yang sensitif terhadap volatiliti
"""
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% — ambang masuk
"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, # pengganda ATR (tidak diskala)
"rsi_period": 14, # tempoh RSI (tidak diskala)
"ma_fast": 10, # MA pantas (tidak diskala)
"ma_slow": 50, # MA perlahan (tidak diskala)
}
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})
Output:
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 meningkat dari 1% ke 2.53% — sesuai untuk volatiliti harian DOGE sebanyak 8.1%. Tanpa penskalaan, stop 1% akan kena oleh "noise" berpuluh-puluh kali.
Penting: skala hanya ambang harga (masuk, stop, take). Tempoh penunjuk (RSI, MA) dan pengganda (pengganda ATR) biasanya tidak diskala — ia sudah dinormalisasi mengikut volatiliti melalui penunjuk itu sendiri.
Dua Mod Pengesahan
-
Mod ketat (tanpa penskalaan): jalankan dengan parameter yang sama. Ujian keteguhan mutlak. Jika strategi menguntungkan — edge adalah kuat.
-
Mod adaptif (dengan penskalaan): jalankan dengan parameter yang dinormalisasi. Ujian keteguhan logik strategi, dengan mengambil kira bahawa tahap volatiliti berbeza.
Kami mengesyorkan menjalankan kedua-dua ujian. Mod ketat — untuk menilai "kekuatan" edge. Mod adaptif — untuk aplikasi praktikal.
Skor Keteguhan Merentas Simbol

Untuk penilaian kuantitatif keteguhan pelbagai simbol, kami memperkenalkan metrik komposit — Cross-Symbol Robustness Score (CSRS).
Formula
di mana:
- — pecahan simbol yang menguntungkan:
- — purata PnL berwajaran kecairan yang dinormalisasi:
di mana adalah kecairan simbol (purata volum harian).
- — bonus untuk konsistensi merentas tier:
- — penalti untuk varians PnL yang tinggi antara simbol:
Wajaran Lalai
| Komponen | Wajaran | Rasional |
|---|---|---|
| (pecahan menguntungkan) | 0.35 | Paling penting: strategi mesti berfungsi pada majoriti |
| (purata PnL) | 0.25 | Pulangan mutlak |
| (merentas tier) | 0.25 | Bonus untuk kesejagatan |
| (penalti varians) | 0.15 | Penalti untuk ketidakstabilan |
Tafsiran CSRS
| CSRS | Tafsiran |
|---|---|
| > 0.7 | Keteguhan cemerlang. Strategi berfungsi pada kebanyakan instrumen. |
| 0.5 — 0.7 | Keteguhan baik. Strategi berfungsi dalam tiernya dan sebahagian dalam tier lain. |
| 0.3 — 0.5 | Sempadan. Strategi berfungsi pada set simbol yang sempit. |
| < 0.3 | Keteguhan rendah. Curve fitting pada peringkat instrumen berkemungkinan besar. |
Implementasi Penuh: Saluran Paip Pengesahan Pelbagai Simbol

import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import Callable, Optional
@dataclass
class SymbolResult:
"""Keputusan strategi pada satu simbol."""
symbol: str
tier: int
pnl: float
max_dd: float
n_trades: int
win_rate: float
pnl_per_active_day: float
avg_daily_volume: float # kecairan
@dataclass
class TierResult:
"""Keputusan agregat mengikut 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:
"""Keputusan pengesahan pelbagai simbol penuh."""
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:
"""
Saluran paip pengesahan pelbagai simbol penuh.
Args:
strategy_fn: fungsi strategi (data, params) -> (pnl, max_dd, n_trades, win_rate, returns)
base_params: parameter yang dioptimumkan pada optimization_symbol
optimization_symbol: simbol pengoptimuman
data_loader: fungsi pemuatan data (symbol) -> np.ndarray
vol_sensitive_params: parameter untuk diskala mengikut volatiliti
adaptive: gunakan penskalaan volatiliti
csrs_weights: wajaran (w1, w2, w3, w4) untuk CSRS
min_profit_ratio: pecahan minimum simbol yang menguntungkan dalam satu 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) # anggaran kasar
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) # hadkan penalti
csrs = w1 * r_profit + w2 * r_pnl + w3 * p_consistency - w4 * (p_variance / 5.0)
csrs = max(0, min(1, csrs)) # kekang ke [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:
"""Jana laporan teks."""
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)
Contoh Penggunaan Saluran Paip
def my_strategy(data, params):
"""Strategi anda. Mengembalikan (pnl, max_dd, n_trades, win_rate, returns)."""
pass
def load_ohlcv(symbol):
"""Muatkan data OHLCV untuk simbol."""
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}")
Bila Pengesahan Simbol Tunggal Boleh Diterima

Tidak setiap strategi mesti berfungsi merentas pelbagai instrumen. Terdapat kes sah di mana simbol tunggal adalah pendekatan yang normal:
Pembuat Pasaran pada Buku Pesanan Tertentu
Strategi pembuat pasaran (contohnya, menggunakan model Avellaneda-Stoikov) secara definisinya terikat kepada buku pesanan tertentu. Parameter bergantung pada mikrostruktur khusus: kedalaman, spread, kedudukan giliran, kadar pengisian. Menguji pada simbol lain adalah tidak bermakna — ia adalah buku pesanan yang berbeza.
Arbitraj Antara Pasangan Tertentu
Arbitraj kadar pembiayaan atau arbitraj merentas bursa secara definisinya terikat kepada pasangan instrumen tertentu. Pengesahan di sini adalah pada bursa lain dengan pasangan yang sama, bukan pada simbol yang berbeza.
Strategi yang Secara Eksplisit Menggunakan Sifat Unik Aset
Jika strategi berdasarkan sifat khusus satu aset (contohnya, korelasi BTC dengan hashrate atau korelasi ETH dengan yuran gas), pengesahan pelbagai simbol tidak terpakai. Tetapi strategi sedemikian adalah jarang.
Dalam semua kes lain — jika strategi berdasarkan isyarat "generik" (MA crossover, RSI, momentum, mean reversion) — pengesahan pelbagai simbol adalah wajib. Jika strategi generik hanya berfungsi pada satu simbol, ia bukan edge — ia adalah overfitting.
Hubungan dengan Kaedah Pengesahan Lain

Pengesahan pelbagai simbol adalah salah satu daripada tiga kaedah ortogon ujian di luar sampel:
| Kaedah | Paksi Pengesahan | Apa yang Didedahkannya |
|---|---|---|
| Walk-Forward | Masa | Overfitting kepada tempoh tertentu |
| Pelbagai simbol | Instrumen | Overfitting kepada aset tertentu |
| Bootstrap Monte Carlo | Susunan dagangan | Kebergantungan pada urutan tertentu |
Setiap kaedah memeriksa keteguhan sepanjang paksinya sendiri. Strategi boleh lulus walk-forward tetapi gagal pelbagai simbol (curve fitted kepada instrumen). Ia boleh lulus pelbagai simbol tetapi gagal Monte Carlo (bergantung pada susunan dagangan yang bertuah).
Perlindungan overfitting maksimum: gunakan ketiga-tiga kaedah.
Saluran paip pengesahan penuh:
- Pengoptimuman parameter pada satu simbol
- Analisis platau — semakan kestabilan optimum
- Walk-forward — pengesahan paksi masa (WFER > 0.5)
- Pelbagai simbol — pengesahan paksi instrumen (CSRS > 0.5)
- Bootstrap Monte Carlo — selang keyakinan (persentil ke-5 > 0)
- Ambil kira kadar pembiayaan dan asimetri kerugian
Strategi yang lulus semua enam pemeriksaan mempunyai kebarangkalian minimum untuk menjadi artifak overfitting.
Sambungan: Korelasi Simbol dan Strategi Bertingkat

Pengesahan pelbagai simbol mendedahkan aspek lain lagi: korelasi antara simbol. Jika strategi menguntungkan pada BTC dan ETH tetapi tidak menguntungkan pada semua altcoin — ini adalah maklumat bahawa edge terikat kepada korelasi tinggi BTC-ETH. Analisis terperinci struktur korelasi — dalam artikel Korelasi isyarat dan dagangan pasangan.
Untuk portfolio strategi, keputusan pelbagai simbol menentukan pada instrumen mana strategi harus dilancarkan. Strategi A dari contoh di atas — hanya Tier 1-2. Strategi B — Tier 1-3. Ini adalah data input untuk orkestrasi bertingkat, di mana strategi berbeza dilancarkan pada instrumen berbeza bergantung pada profil keteguhan mereka.
Kesimpulan
Pengesahan pelbagai simbol bukan pilihan — ia adalah langkah wajib untuk mana-mana strategi yang mendakwa edge pasaran yang umum. Perkara utama:
-
Strategi yang hanya berfungsi pada satu simbol kemungkinan besar adalah overfit kepada spesifik simbol itu. Pengecualian: pembuat pasaran, arbitraj, strategi berdasarkan sifat unik aset.
-
Pengelompokan tier adalah wajib. Anda tidak boleh membandingkan keputusan pada BTC (Tier 1) dengan keputusan pada PEPE (Tier 3) tanpa memahami perbezaan dalam volatiliti, kecairan, dan mikrostruktur.
-
Penskalaan parameter adaptif — normalisasi ambang mengikut volatiliti — meningkatkan secara ketara realisme ujian pelbagai simbol.
-
CSRS > 0.5 — ambang minimum yang munasabah. Strategi harus menguntungkan pada >= 60% simbol dalam tier yang sama, dan purata PnL merentas semua simbol harus positif.
-
Walk-forward + Pelbagai simbol + Monte Carlo — tiga paksi pengesahan ortogon. Setiap kaedah menangkap apa yang terlepas oleh yang lain. Gunakan ketiga-tiganya.
Strategi dengan PnL +25% dan CSRS 0.72 lebih boleh dipercayai daripada strategi dengan PnL +300% dan CSRS 0.18. Yang pertama memperoleh daripada ketidakcekapan pasaran. Yang kedua memperoleh daripada menghafal satu siri harga.
Pautan Berguna
- 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
Petikan
@article{soloviov2026multisymbolvalidation,
author = {Soloviov, Eugen},
title = {Multi-Symbol Validation: Test Your Strategy on All Pairs},
year = {2026},
url = {https://marketmaker.cc/ms/blog/post/multi-symbol-validation},
version = {0.1.0},
description = {Mengapa strategi yang dioptimumkan pada ETHUSDT mungkin gagal pada altcoin. Cara menguji dengan betul merentas kumpulan pasangan (blue chips, large caps, shitcoin) dan skor keteguhan merentas simbol yang manakah yang perlu dianggap mencukupi.}
}
Pengarang
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.