Pengesahan Pelbagai Simbol: Uji Strategi Anda pada Semua Pasangan

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.

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

Perangkap simbol tunggal: satu keluk ekuiti cerah dikelilingi oleh strategi yang gagal pada aset lain

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

Matriks ciri-ciri tier simbol

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-ciriTier 1Tier 2Tier 3Tier 4
Volatiliti harian2-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 BTC0.85-0.950.6-0.850.3-0.70.1-0.5
Sejarah minimum5+ tahun2-5 tahun6 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

Metodologi pengesahan pelbagai simbol: optimumkan, uji tier yang sama, uji tier lain, analisis keputusan

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:

  1. Menguntungkan pada >= 60% simbol dalam tier yang sama
  2. Purata PnL merentas kumpulan adalah positif
  3. MaxDD tidak meningkat secara dramatik (tidak lebih daripada 2-3x berbanding simbol pengoptimuman)
  4. Jika strategi menguntungkan HANYA pada simbol pengoptimuman — tolak

Contoh: Tiga Strategi, Tiga Hasil

Tiga strategi dibandingkan: A (hijau, kejayaan separa), B (sian, teguh), C (merah, overfitted)

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%.

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

* — simbol pengoptimuman

Keputusan mengikut tier:

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

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

Keputusan mengikut tier:

TierSimbolMenguntungkanPurata PnLPurata MaxDD
Tier 122 (100%)+23.5%-2.6%
Tier 244 (100%)+14.3%-3.9%
Tier 353 (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%.

SimbolTierPnLMaxDDN daganganWin rate
ETHUSDT*1+301.2%-17.1%41853.8%
BTCUSDT1+42.7%-28.4%39548.6%
SOLUSDT2-18.3%-41.2%45644.1%
BNBUSDT2+12.1%-33.7%38746.8%
AVAXUSDT2-31.4%-52.8%47142.3%
ADAUSDT2-44.7%-58.1%41240.5%
DOGEUSDT3-67.2%-74.3%52838.1%
PEPEUSDT3-72.1%-81.6%57437.4%

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

Empat faktor yang merosakkan strategi: volatiliti, kecairan, mikrostruktur, dan peralihan rejim

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 50Mdalam5bps—iniadalahrealistik.PadaARBUSDTdengankedalaman50M dalam 5 bps — ini adalah realistik. Pada ARBUSDT dengan kedalaman 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

Penskalaan parameter adaptif: tolok nisbah volatiliti dengan gelangsar parameter berubah dari ambang ketat ke ambang luas

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

# Contoh: Strategi A, dioptimumkan pada ETHUSDT
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)
}

# Parameter yang perlu diskala
vol_sensitive = ["entry_threshold", "stop_loss", "take_profit", "trailing_stop"]

# Volatiliti (harian)
eth_vol = 0.032     # 3.2%
doge_vol = 0.081    # 8.1%

# Skala untuk DOGE
doge_params = scale_params_by_volatility(
    base_params, eth_vol, doge_vol, vol_sensitive
)

print("ETH params:", {k: f"{v:.4f}" for k, v in base_params.items() if k in vol_sensitive})
print("DOGE params:", {k: f"{v:.4f}" for k, v in doge_params.items() if k in vol_sensitive})

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

  1. Mod ketat (tanpa penskalaan): jalankan dengan parameter yang sama. Ujian keteguhan mutlak. Jika strategi menguntungkan — edge adalah kuat.

  2. 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

Radar keteguhan merentas-simbol pelbagai simbol

Untuk penilaian kuantitatif keteguhan pelbagai simbol, kami memperkenalkan metrik komposit — Cross-Symbol Robustness Score (CSRS).

Formula

CSRS=w1⋅Rprofit+w2⋅Rpnl+w3⋅Pconsistency−w4⋅Pvariance\text{CSRS} = w_1 \cdot R_{profit} + w_2 \cdot R_{pnl} + w_3 \cdot P_{consistency} - w_4 \cdot P_{variance}

di mana:

  • RprofitR_{profit} — pecahan simbol yang menguntungkan:

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

  • RpnlR_{pnl} — purata PnL berwajaran kecairan yang dinormalisasi:

Rpnl=∑i=1Nli⋅PnLi∑i=1NliR_{pnl} = \frac{\sum_{i=1}^{N} l_i \cdot \text{PnL}_i}{\sum_{i=1}^{N} l_i}

di mana lil_i adalah kecairan simbol ii (purata volum harian).

  • PconsistencyP_{consistency} — bonus untuk konsistensi merentas tier:

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

  • PvarianceP_{variance} — penalti untuk varians PnL yang tinggi antara simbol:

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

Wajaran Lalai

KomponenWajaranRasional
w1w_1 (pecahan menguntungkan)0.35Paling penting: strategi mesti berfungsi pada majoriti
w2w_2 (purata PnL)0.25Pulangan mutlak
w3w_3 (merentas tier)0.25Bonus untuk kesejagatan
w4w_4 (penalti varians)0.15Penalti untuk ketidakstabilan

Tafsiran CSRS

CSRSTafsiran
> 0.7Keteguhan cemerlang. Strategi berfungsi pada kebanyakan instrumen.
0.5 — 0.7Keteguhan baik. Strategi berfungsi dalam tiernya dan sebahagian dalam tier lain.
0.3 — 0.5Sempadan. Strategi berfungsi pada set simbol yang sempit.
< 0.3Keteguhan rendah. Curve fitting pada peringkat instrumen berkemungkinan besar.

Implementasi Penuh: Saluran Paip Pengesahan Pelbagai Simbol

Saluran paip pemprosesan data isometrik 3D untuk pengesahan strategi 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

# Kamus simbol mengikut tier
SYMBOL_TIERS = {
    1: ["BTCUSDT", "ETHUSDT"],
    2: ["SOLUSDT", "BNBUSDT", "ADAUSDT", "XRPUSDT", "AVAXUSDT"],
    3: ["DOGEUSDT", "SHIBUSDT", "PEPEUSDT", "ARBUSDT", "OPUSDT"],
}

# Anggaran volatiliti harian
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,
}

# Anggaran purata volum harian ($)
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 = []

    # Jalankan strategi pada semua simbol
    for tier, symbols in SYMBOL_TIERS.items():
        for symbol in symbols:
            data = data_loader(symbol)
            if data is None or len(data) < 100:
                continue

            # Penskalaan parameter
            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()

            # Jalankan strategi
            pnl, max_dd, n_trades, win_rate, returns = strategy_fn(data, params)

            # PnL per hari aktif (dipermudahkan)
            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),
            ))

    # Agregasi mengikut tier
    tier_results = []
    tiers_present = sorted(set(r.tier for r in symbol_results))

    for tier in tiers_present:
        tier_symbols = [r for r in symbol_results if r.tier == tier]
        n_profitable = sum(1 for r in tier_symbols if r.pnl > 0)
        pnls = [r.pnl for r in tier_symbols]

        tier_results.append(TierResult(
            tier=tier,
            symbols=tier_symbols,
            n_symbols=len(tier_symbols),
            n_profitable=n_profitable,
            profit_ratio=n_profitable / len(tier_symbols) if tier_symbols else 0,
            avg_pnl=np.mean(pnls),
            avg_max_dd=np.mean([r.max_dd for r in tier_symbols]),
            pnl_std=np.std(pnls),
        ))

    # Kira CSRS
    all_pnls = [r.pnl for r in symbol_results]
    all_volumes = [r.avg_daily_volume for r in symbol_results]
    n_total = len(symbol_results)
    n_profitable = sum(1 for r in symbol_results if r.pnl > 0)

    # R_profit
    r_profit = n_profitable / n_total if n_total > 0 else 0

    # R_pnl (berwajaran kecairan)
    total_vol = sum(all_volumes)
    r_pnl_raw = sum(r.pnl * r.avg_daily_volume for r in symbol_results) / total_vol
    # Normalisasi ke [0, 1]: menggunakan sigmoid
    r_pnl = 1 / (1 + np.exp(-r_pnl_raw * 5))

    # P_consistency
    profitable_tiers = sum(1 for tr in tier_results if tr.avg_pnl > 0)
    p_consistency = profitable_tiers / len(tier_results) if tier_results else 0

    # P_variance
    pnl_std = np.std(all_pnls) if len(all_pnls) > 1 else 0
    pnl_mean = np.mean(all_pnls) if all_pnls else 0.01
    p_variance = pnl_std / max(abs(pnl_mean), 0.01)
    p_variance = min(p_variance, 5.0)  # 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]

    # Kriteria lulus
    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
    )

    # Jana laporan
    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)

    # Mengikut tier
    for tr in tier_results:
        lines.append(f"\n--- Tier {tr.tier} ---")
        lines.append(f"  Symbols: {tr.n_symbols}, Profitable: {tr.n_profitable} "
                      f"({tr.profit_ratio:.0%})")
        lines.append(f"  Avg PnL: {tr.avg_pnl:.2%}, Avg MaxDD: {tr.avg_max_dd:.2%}")
        lines.append(f"  PnL StdDev: {tr.pnl_std:.2%}")

        for sr in tr.symbols:
            marker = "*" if sr.symbol == opt_symbol else " "
            status = "+" if sr.pnl > 0 else "-"
            lines.append(
                f"  {marker} [{status}] {sr.symbol:12s} "
                f"PnL={sr.pnl:+.2%}  MaxDD={sr.max_dd:.2%}  "
                f"Trades={sr.n_trades:4d}  WR={sr.win_rate:.1%}"
            )

    lines.append("\n" + "=" * 60)
    return "\n".join(lines)

Contoh Penggunaan Saluran Paip

# Anggap anda mempunyai fungsi strategi dan pemuat data
def my_strategy(data, params):
    """Strategi anda. Mengembalikan (pnl, max_dd, n_trades, win_rate, returns)."""
    # ... implementasi ...
    pass

def load_ohlcv(symbol):
    """Muatkan data OHLCV untuk simbol."""
    # ... muat dari pangkalan data / API ...
    pass

# Parameter yang dioptimumkan pada ETHUSDT
base_params = {
    "entry_threshold": 0.02,
    "stop_loss": 0.01,
    "take_profit": 0.03,
    "trailing_stop": 0.008,
    "atr_multiplier": 2.5,
    "rsi_period": 14,
    "ma_fast": 10,
    "ma_slow": 50,
}

# Jalankan pengesahan
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

Pengecualian: buku pesanan pembuat pasaran, arbitraj merentas bursa, dan corak korelasi unik khusus aset

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

Tiga paksi pengesahan ortogon: masa (walk-forward), instrumen (pelbagai simbol), susunan dagangan (Monte Carlo)

Pengesahan pelbagai simbol adalah salah satu daripada tiga kaedah ortogon ujian di luar sampel:

KaedahPaksi PengesahanApa yang Didedahkannya
Walk-ForwardMasaOverfitting kepada tempoh tertentu
Pelbagai simbolInstrumenOverfitting kepada aset tertentu
Bootstrap Monte CarloSusunan daganganKebergantungan 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:

  1. Pengoptimuman parameter pada satu simbol
  2. Analisis platau — semakan kestabilan optimum
  3. Walk-forward — pengesahan paksi masa (WFER > 0.5)
  4. Pelbagai simbol — pengesahan paksi instrumen (CSRS > 0.5)
  5. Bootstrap Monte Carlo — selang keyakinan (persentil ke-5 > 0)
  6. 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

Graf rangkaian korelasi mata wang kripto dengan aliran peruntukan 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:

  1. Strategi yang hanya berfungsi pada satu simbol kemungkinan besar adalah overfit kepada spesifik simbol itu. Pengecualian: pembuat pasaran, arbitraj, strategi berdasarkan sifat unik aset.

  2. 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.

  3. Penskalaan parameter adaptif — normalisasi ambang mengikut volatiliti — meningkatkan secara ketara realisme ujian pelbagai simbol.

  4. 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.

  5. 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

  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

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