MarketMaker.cc Team
量化研究与策略
MarketMaker.cc Team
量化研究与策略
"无幻觉回测"系列文章
你在ETHUSDT上优化了策略。25个月的数据,12+个参数。回测显示PnL +55%,500笔交易,MaxDD -0.9%,持仓时间占15%。权益曲线平滑上升。参数通过了plateau分析——最优解看起来范围很宽。Walk-forward给出WFER > 0.6。蒙特卡洛自助法显示第5百分位为正。
一切看起来完美。除了一点:你只在一个品种上测试了策略。
用相同的算法和相同的参数在BTCUSDT上运行——PnL +8%。在SOLUSDT上——PnL -12%。在DOGEUSDT上——PnL -34%。一个通过了所有ETH检验的策略,在大多数其他交易对上都是亏损的。
这不是bug。这是单品种陷阱(single-symbol trap)——算法交易中最常见且最隐蔽的过拟合形式之一。
在单一品种上优化策略,本质上就是对特定资产的价格动态进行拟合。即使你进行了walk-forward,即使自助法显示了宽置信区间——所有这些检验都是在同一个时间序列内部完成的。
Walk-forward检验的是时间维度的鲁棒性:参数在同一品种的未来数据上是否有效。蒙特卡洛检验的是交易顺序维度的鲁棒性:策略能否承受不同的交易序列。但这两种方法都无法检验品种维度的鲁棒性:策略在具有不同特征的其他资产上是否有效。
如果策略只在ETHUSDT上盈利——它捕获的不是市场低效性,而是ETH价格序列的特定结构:
这些都不是edge,而是品种层面的曲线拟合。

并非所有加密货币都是相同的。要进行有意义的多品种验证,必须理解品种按具有根本不同特征的组别进行划分。
高流动性,相对较低的波动率,机构资金流。与宏观因素相关(S&P 500、DXY、美联储利率)。深度订单簿,窄价差,稳定的资金费率。典型日波动率:2-4%。
中等流动性,较高波动率。行情通常由板块动态驱动(L1 vs L2,DeFi vs 基础设施)。资金费率波动更大。价差更宽。典型日波动率:4-6%。
Meme币和叙事型代币。高波动率,与基本面因素的相关性低。行情由社交媒体、上线公告、叙事驱动。部分交易所订单簿较薄。典型日波动率:6-10%。
极端波动率,薄订单簿,存在操纵风险。通常没有足够的历史数据进行完整回测。典型日波动率:10-20%+。
| 特征 | Tier 1 | Tier 2 | Tier 3 | Tier 4 |
|---|---|---|---|---|
| 日波动率 | 2-4% | 4-6% | 6-10% | 10-20%+ |
| 平均价差(永续合约) | 0.01-0.02% | 0.02-0.05% | 0.05-0.15% | 0.1-0.5%+ |
| 订单簿深度(前5 bps) | $5-50M | $1-10M | $100K-2M | $10K-200K |
| 资金费率(平均绝对值) | 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时会进入一个完全陌生的环境。
选择一个品种进行优化——例如ETHUSDT。执行完整的流程:Optuna优化、plateau分析、walk-forward。锁定参数。
用相同的参数在同tier的5-10个品种上运行策略。对于Tier 1来说选择有限(BTC + ETH),但Tier 2和Tier 3有足够多的品种。
在每个其他tier的3-5个品种上运行策略。这是最严格的测试:如果策略在ETHUSDT(Tier 1)和DOGEUSDT(Tier 3)上都有效,曲线拟合的可能性极低。
按tier汇总指标并评估cross-symbol鲁棒性。
对每个品种记录:
策略通过多品种验证的条件:
来看一个具体示例。三个策略(Strategy A、Strategy B、Strategy C),在ETHUSDT上优化,在四个tier的12个品种上测试。
参数:PnL +55%,约500笔交易,约15%活跃时间,MaxDD约0.9%。
| 品种 | Tier | PnL | MaxDD | 交易数 | 胜率 | 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% |
结论: Strategy A在Tier 1-2上有效,但在Tier 3上完全失败。这是典型的针对低波动率环境调整的策略。用于蓝筹和大市值组合——可以接受。用于通用目的——不行。
参数:PnL +25%,约40笔交易,约5%活跃时间。
| 品种 | Tier | PnL | MaxDD | 交易数 | 胜率 |
|---|---|---|---|---|---|
| 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% |
结论: Strategy B在11个品种中有9个盈利(82%)。所有tier的平均PnL均为正。MaxDD随tier级别可预测地增长。这是一个具有真实市场edge的鲁棒策略。尽管在优化品种上的PnL较为温和(+25% vs +55%),Strategy B远比Strategy A可靠。
参数:PnL +300%,约400笔交易,约45%活跃时间,MaxDD约17%。
| 品种 | Tier | PnL | MaxDD | 交易数 | 胜率 |
|---|---|---|---|---|---|
| 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% |
结论: Strategy C是典型的过拟合。在ETHUSDT上+301%,但在大多数其他交易对上出现灾难性亏损。Tier 3的MaxDD超过70%——这意味着资金毁灭。策略捕获了ETH独有的模式,而非市场低效性。拒绝。
最常见的原因。策略参数针对特定的波动率水平进行了调整。如果策略使用2%的入场阈值——对于日波动率3%的ETH来说,这是合理的过滤器。但对于日波动率8%的DOGE来说——这个阈值触发过于频繁,产生大量虚假信号。
同样,1%的止损对ETH来说是合理的,但对PEPE来说这只是正常的"噪音",止损会在一天内被触发数十次。
策略假设订单按当前价格即时成交。在订单簿深度为200K的ARBUSDT上——你$10K的订单会推动价格,实际成交价会差0.05-0.2%。500笔交易下来,仅滑点就会造成25-100%的损失。
每个品种都有自己的微观结构:
山寨币在不同市场阶段表现各异:
在某一阶段对某一品种优化的策略,可能恰好针对该品种相对于BTC的领先/滞后关系进行了最优调整——而这种领先/滞后关系在市场状态切换时会改变。
用完全相同的参数在所有品种上运行策略是不正确的。但对每个品种进行完全重新优化会使多品种验证本身失去意义(参数会变成每个品种"自己的")。
折中方案是按波动率归一化参数:
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:
"""
根据目标品种的波动率缩放策略参数。
Args:
base_params: 在原始品种上优化的参数
optimization_symbol_vol: 优化品种的日波动率
target_symbol_vol: 目标品种的日波动率
vol_sensitive_params: 对波动率敏感的参数列表
"""
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% — 入场阈值
"stop_loss": 0.01, # 1% — 止损
"take_profit": 0.03, # 3% — 止盈
"trailing_stop": 0.008, # 0.8% — 追踪止损
"atr_multiplier": 2.5, # ATR乘数(不缩放)
"rsi_period": 14, # RSI周期(不缩放)
"ma_fast": 10, # 快速MA(不缩放)
"ma_slow": 50, # 慢速MA(不缩放)
}
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'}
止损从1%增加到2.53%——对于日波动率8.1%的DOGE来说是合理的。不进行缩放的话,1%的止损会因为"噪音"被触发数十次。
重要: 只缩放价格阈值(入场、止损、止盈)。指标周期(RSI、MA)和乘数(ATR multiplier)通常不需要缩放——它们通过指标本身已经按波动率归一化了。
严格模式(不缩放): 使用完全相同的参数运行。测试绝对鲁棒性。如果策略仍然盈利——edge很强。
自适应模式(带缩放): 使用归一化后的参数运行。测试策略逻辑的鲁棒性,允许波动率水平存在差异。
建议两种测试都进行。严格模式——评估edge的"强度"。自适应模式——用于实际应用。

为了量化评估多品种鲁棒性,我们引入一个复合指标——Cross-Symbol Robustness Score (CSRS)。
其中:
其中 为品种 的流动性(平均日成交量)。
| 组成部分 | 权重 | 依据 |
|---|---|---|
| (盈利占比) | 0.35 | 最重要:策略必须在大多数品种上有效 |
| (平均PnL) | 0.25 | 绝对收益率 |
| (跨tier一致性) | 0.25 | 通用性奖励 |
| (方差惩罚) | 0.15 | 不稳定性惩罚 |
| CSRS | 解读 |
|---|---|
| > 0.7 | 优秀的鲁棒性。策略在大多数品种上有效。 |
| 0.5 — 0.7 | 良好的鲁棒性。策略在自身tier和部分其他tier上有效。 |
| 0.3 — 0.5 | 临界水平。策略仅在少数品种上有效。 |
| < 0.3 | 低鲁棒性。可能存在品种层面的曲线拟合。 |
import numpy as np
import pandas as pd
from dataclasses import dataclass, field
from typing import Callable, Optional
@dataclass
class SymbolResult:
"""单个品种上的策略结果。"""
symbol: str
tier: int
pnl: float
max_dd: float
n_trades: int
win_rate: float
pnl_per_active_day: float
avg_daily_volume: float # 流动性
@dataclass
class TierResult:
"""按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:
"""多品种验证的完整结果。"""
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:
"""
完整的多品种验证流水线。
Args:
strategy_fn: 策略函数 (data, params) -> (pnl, max_dd, n_trades, win_rate, returns)
base_params: 在optimization_symbol上优化的参数
optimization_symbol: 优化品种
data_loader: 数据加载函数 (symbol) -> np.ndarray
vol_sensitive_params: 需要按波动率缩放的参数
adaptive: 是否使用波动率缩放
csrs_weights: CSRS的权重 (w1, w2, w3, w4)
min_profit_ratio: 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) # 粗略估计
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) # 限制惩罚上限
csrs = w1 * r_profit + w2 * r_pnl + w3 * p_consistency - w4 * (p_variance / 5.0)
csrs = max(0, min(1, csrs)) # 限制在[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:
"""生成文本报告。"""
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)
def my_strategy(data, params):
"""你的策略。返回 (pnl, max_dd, n_trades, win_rate, returns)。"""
pass
def load_ohlcv(symbol):
"""加载品种的OHLCV数据。"""
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}")
并非每个策略都必须在多个品种上有效。在以下合理情况下,单品种验证是正常的做法:
做市策略(例如基于Avellaneda-Stoikov模型)天然绑定到特定订单簿。参数依赖于具体的微观结构:深度、价差、队列位置、成交率。在其他品种上测试没有意义——那是另一个订单簿。
资金费率套利或跨交易所套利天然绑定到特定的品种对。这里的验证应该在相同交易对的不同交易所上进行,而非在不同品种上。
如果策略基于某个资产的特定属性(例如BTC与算力的相关性,或ETH与gas费的相关性),多品种验证不适用。但这类策略非常少见。
在所有其他情况下——如果策略基于"通用"信号(MA交叉、RSI、动量、均值回归)——多品种验证是必须的。如果通用策略只在一个品种上有效,这不是edge——这是过拟合。
多品种验证是三种正交的样本外测试方法之一:
| 方法 | 检验维度 | 发现的问题 |
|---|---|---|
| Walk-Forward | 时间 | 对特定时期的过拟合 |
| 多品种验证 | 品种 | 对特定资产的过拟合 |
| 蒙特卡洛自助法 | 交易顺序 | 对特定交易序列的依赖 |
每种方法沿各自的维度检验鲁棒性。策略可能通过walk-forward,但在多品种验证上失败(对品种的曲线拟合)。可能通过多品种验证,但在蒙特卡洛上失败(依赖于特定的交易顺序)。
最大程度防止过拟合:三种方法全部使用。
完整验证流水线:
通过全部六项检验的策略,成为过拟合产物的概率最小。
多品种验证还揭示了另一个维度:品种间的相关性。如果策略在BTC和ETH上盈利,但在所有山寨币上亏损——这说明edge绑定在BTC-ETH的高相关性上。关于相关性结构的详细分析,请参阅信号相关性与配对交易。
对于策略组合,多品种结果决定了应该在哪些品种上运行策略。上述示例中的Strategy A——仅限Tier 1-2。Strategy B——Tier 1-3。这些是级联编排的输入数据,其中不同策略根据其鲁棒性特征在不同品种上运行。
多品种验证不是可选项,而是任何声称具有泛化市场edge的策略的必要步骤。核心要点:
只在一个品种上有效的策略,很可能对该品种的特性过拟合了。 例外情况:做市、套利、基于资产独有属性的策略。
按tier分组是必须的。 不能在不理解波动率、流动性和微观结构差异的情况下,将BTC(Tier 1)的结果与PEPE(Tier 3)的结果进行比较。
自适应参数缩放——按波动率缩放阈值——显著提高了多品种测试的现实性。
CSRS > 0.5——合理的最低门槛。策略应在同tier >= 60%的品种上盈利,且所有品种的平均PnL为正。
Walk-forward + 多品种验证 + 蒙特卡洛——三个正交的验证维度。每种方法能捕获其他方法遗漏的问题。三者都要使用。
PnL +25%且CSRS 0.72的策略,比PnL +300%且CSRS 0.18的策略更可靠。前者从市场低效性中获利。后者只是记住了一条价格序列。
@article{soloviov2026multisymbolvalidation, author = {Soloviov, Eugen}, title = {Multi-symbol валидация: проверяйте стратегию на всех парах}, year = {2026}, url = {https://marketmaker.cc/ru/blog/post/multi-symbol-validation}, version = {0.1.0}, description = {为什么在ETHUSDT上优化的策略可能在山寨币上失败。如何正确按交易对分组(蓝筹、大市值、垃圾币)进行测试,以及什么水平的cross-symbol robustness score才算足够。} }