Strategy Ranking
250 estrategias testeadas across 49 rondas. Click ⊕ para expandir. Filtra phantom/prod/búsqueda. Cabeceras ordenables.
🟢 En producción (resaltadas)
V2 · GRU Ensemble (always-invested)7,781% compound · α +62.0
V3 · hybrid_v3 (GRU + DailyRSI>80 + Trail 10%)11,400% compound · α +44.0
V4 · hybrid_v5 (GRU 3-Regime V5.4 Robust-5)29,909% compound · α +100.0
V5 · V115_cmp (GRU + peak_drop + ratchet + regime cooldown)76,725% compound · α +266.0
V6 · V66 Cooldown(4,48)42,636% compound · α +193.0
V8 · LLM Hybrid (V5 + Opus committee filter)— compound · α —
V9 · LLM Pure (committee only, no GRU)— compound · α —
V7 · V5 V115_cmp + vol-Kelly (margin, tgt=3% clip[0.5,1.5])1,001,557% compound · α +531.0
OPTIMISTIC-EXEC vs REALISTIC-EXEC: pre-R173 los backtests usaban
close[i] como precio de ejecución — equivale a "ejecuto en el último trade del bar antes de que cierre"
(físicamente imposible). Post-R173 usan open[i+1] que ≈ tu realidad operacional
con 5s de latencia (el siguiente trade tras el cierre). Diferencia por trade ≈ 0.01-0.3%; acumulado puede inflar
~30-66% el compound. PHANTOM es distinto: pyramid usaba además apalancamiento gratis sin dinero real (Bug #4)
→ bajo honest engine colapsa a V66 baseline. R184 confirmó empíricamente. Filtros encima ocultan
estos por defecto para que veas solo realistic-exec.
| Round | Variant | Dir | Compound % | Simple PnL % | Min α | Beats BH | Trades | WR | OOT α | |||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| R195 | V5 V115_cmp leverage=2.0x | L | 9,152,200% | 7,207% | +924.6 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)leverage 2.0 liquidated_folds 0 total_interest_paid 2348.7872796897705 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r195_v5_leveraged.pyExperimento: R195: V5 V115_cmp + margin leverage 1.0x..2.0x
Origen: outputs/round_195_v5_leveraged/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V15 aggressive tgt=4.0% clip[0.5,2.0] | L | 8,835,065% | 7,112% | +919.2 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.04 min_lev 0.5 max_lev 2.0 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217: vol-Kelly variants sweep — find the full margin roster
Origen: outputs/round_217_volkelly_variants/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R195 | V5 V115_cmp leverage=1.75x | L | 3,228,860% | 5,364% | +712.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)leverage 1.75 liquidated_folds 0 total_interest_paid 1342.982636533111 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r195_v5_leveraged.pyExperimento: R195: V5 V115_cmp + margin leverage 1.0x..2.0x
Origen: outputs/round_195_v5_leveraged/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R255 | (unnamed) | L | 1,047,586% | — | +529.3 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)estimator EWMA-RV λ=0.94 folds [766.304786240916, 1390.2338716570544, 1177.7997796955592... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r255_vol_estimators.py |
||||||||||||||||||||||||||||||||||||||||
| R255 | (unnamed) | L | 1,031,495% | — | +533.5 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)estimator HAR-RV blend folds [723.9452148857024, 1393.0195441633703, 1211.676656905662... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r255_vol_estimators.py |
||||||||||||||||||||||||||||||||||||||||
| R195 | V5 V115_cmp leverage=1.5x | L | 1,031,237% | 3,868% | +533.5 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)leverage 1.5 liquidated_folds 0 total_interest_paid 673.919508905454 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r195_v5_leveraged.pyExperimento: R195: V5 V115_cmp + margin leverage 1.0x..2.0x
Origen: outputs/round_195_v5_leveraged/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R255 | (unnamed) | L | 1,017,450% | — | +533.5 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)estimator bipower-BV folds [712.72731814716, 1393.0195441633703, 1211.676656905662, ... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r255_vol_estimators.py |
||||||||||||||||||||||||||||||||||||||||
| R204 | R204 HONEST tgt=3.0% clip[0.5,1.5] | L | 1,001,557% | 3,828% | +531.0 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.03 min_lev 0.5 max_lev 1.5 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r204_vol_kelly_honest.pyExperimento: R204: vol-Kelly with lookahead bugs FIXED
Origen: outputs/round_204_vol_kelly_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V11 ★ tgt=3.0% clip[0.5,1.5] | L | 1,001,557% | 3,828% | +531.0 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.03 min_lev 0.5 max_lev 1.5 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217: vol-Kelly variants sweep — find the full margin roster
Origen: outputs/round_217_volkelly_variants/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V16 deep deleverage tgt=3.0% clip[0.3,1.5] | L | 1,001,557% | 3,828% | +531.0 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.03 min_lev 0.3 max_lev 1.5 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217: vol-Kelly variants sweep — find the full margin roster
Origen: outputs/round_217_volkelly_variants/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | R204 ORIGINAL (0.46% APR + 4bps comm) | L | 1,001,557% | 3,828% | +531.0 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 5.21e-07 comm_rate 0.0004 liquidations 0 total_interest_paid 664.9147794945402 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R255 | (unnamed) | L | 1,001,557% | — | +531.0 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)estimator baseline rolling-30d folds [726.4687203568247, 1373.8486704781683, 1191.350530579601... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r255_vol_estimators.py |
||||||||||||||||||||||||||||||||||||||||
| R204 | V5 V115_cmp + vol-Kelly (margin, tgt=3% clip[0.5,1.5]) — V7 PROD V7 | L | 1,001,557% | — | +531.0 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)deployment_status Active on V7 (V5 V115_cmp + vol-Kelly (margin, tgt=3% cli... synthetic_source SESSION_STATE.md + ROUNDS_LOG.md (canonical round metadat... note ✅ LIVE 2026-05-31. R204 honest +1,001,557% / +531 min α (... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r204_vol_kelly_honest.pyExperimento: Production strategy on V7 bot. ✅ LIVE 2026-05-31. R204 honest +1,001,557% / +531 min α (102% retention vs R203 buggy). R206 stress PASS slip 0-30bps. R216 forensic clean (no lookahead). R217b: V15 aggressive variant +8.8M%/+919 — future V8 upgrade after V7 stable. Sub-account: V3 (cross margin, BTCU
Origen: synthetic from SESSION_STATE.md (canonical round R204) · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R204 | R204 HONEST tgt=2.5% clip[0.5,1.5] | L | 981,201% | 3,802% | +529.3 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.5 max_lev 1.5 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r204_vol_kelly_honest.pyExperimento: R204: vol-Kelly with lookahead bugs FIXED
Origen: outputs/round_204_vol_kelly_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R203 | vol-Kelly tgt=2.5% clip[0.5,1.5] | L | 981,182% | 3,802% | +529.3 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.5 max_lev 1.5 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r203_vol_kelly.pyExperimento: R203: V5 V115_cmp + continuous vol-adjusted Kelly sizing
Origen: outputs/round_203_vol_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | Lender floor 5% APR + 4bps | L | 906,581% | 3,723% | +515.4 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 5.71e-06 comm_rate 0.0004 liquidations 0 total_interest_paid 7164.368365173643 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R222 | V7+shorts LOW rates (10%USDC, 30%BTC, 4bps) | L+S | 861,812% | 4,488% | +171.2 | —/4 | 99 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=99 · WR=—
Métricas y config crudas (metadata.json)usdc_apr 0.1 btc_apr 0.3 comm 0.0004 liquidations_long 0 liquidations_short 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r222_v7_plus_shorts_combined.pyExperimento: R222: V7 vol-Kelly LONG + R151-A shorts combined on Binance margin
Origen: outputs/round_222_v7_plus_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | Conservative 10% APR + 4bps | L | 812,699% | 3,611% | +498.8 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 1.14e-05 comm_rate 0.0004 liquidations 0 total_interest_paid 14039.869261575059 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R203 | vol-Kelly tgt=3% clip[0.7,1.4] | L | 622,391% | 3,336% | +469.4 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.03 min_lev 0.7 max_lev 1.4 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r203_vol_kelly.pyExperimento: R203: V5 V115_cmp + continuous vol-adjusted Kelly sizing
Origen: outputs/round_203_vol_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R204 | R204 HONEST tgt=2.5% clip[0.7,1.4] | L | 609,749% | 3,312% | +467.9 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.7 max_lev 1.4 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r204_vol_kelly_honest.pyExperimento: R204: vol-Kelly with lookahead bugs FIXED
Origen: outputs/round_204_vol_kelly_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V17 narrow band tgt=2.5% clip[0.8,1.4] | L | 609,749% | 3,312% | +467.9 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.8 max_lev 1.4 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217: vol-Kelly variants sweep — find the full margin roster
Origen: outputs/round_217_volkelly_variants/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R203 | vol-Kelly tgt=2.5% clip[0.7,1.4] | L | 609,740% | 3,312% | +467.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.7 max_lev 1.4 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r203_vol_kelly.pyExperimento: R203: V5 V115_cmp + continuous vol-adjusted Kelly sizing
Origen: outputs/round_203_vol_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | Realistic 30% APR + 4bps | L | 524,046% | 3,189% | +436.5 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 3.42e-05 comm_rate 0.0004 liquidations 0 total_interest_paid 39107.82488458135 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | Realistic 30% APR + 7.5bps comm (taker) | L | 382,373% | 2,911% | +395.7 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 3.42e-05 comm_rate 0.00075 liquidations 0 total_interest_paid 36908.104236355925 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R222 | V7+shorts MID rates (30%USDC, 50%BTC, 7.5bps) | L+S | 329,154% | 3,434% | +110.6 | —/4 | 99 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=99 · WR=—
Métricas y config crudas (metadata.json)usdc_apr 0.3 btc_apr 0.5 comm 0.00075 liquidations_long 0 liquidations_short 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r222_v7_plus_shorts_combined.pyExperimento: R222: V7 vol-Kelly LONG + R151-A shorts combined on Binance margin
Origen: outputs/round_222_v7_plus_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R195 | V5 V115_cmp leverage=1.25x | L | 296,991% | 2,683% | +385.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)leverage 1.25 liquidated_folds 0 total_interest_paid 250.95432985830575 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r195_v5_leveraged.pyExperimento: R195: V5 V115_cmp + margin leverage 1.0x..2.0x
Origen: outputs/round_195_v5_leveraged/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R154 | skip shorts if 21d return > +15%OPTIMISTIC-EXEC | L+S | 250,538% | 2,680% | +245.1 | 4/4 | 88 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=88 · WR=—
Métricas y config crudas (metadata.json)lookback 21 return_th 0.15 shorts_skipped 243 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Same as R151 + regime filter: skip shorts if recent N-day return > threshold (variants: 7d>+5/+10, 14d>+10/+15, 21d>+15/+20). Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r154_regime_filtered_shorts.pyExperimento: R154: regime-filtered shorts (R151-A base)
Origen: outputs/round_154_regime_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | Typical retail 50% APR + 7.5bps | L | 245,671% | 2,561% | +343.5 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 5.71e-05 comm_rate 0.00075 liquidations 0 total_interest_paid 57265.845486498496 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R154 | skip shorts if 7d return > +10%OPTIMISTIC-EXEC | L+S | 234,511% | 2,607% | +245.1 | 4/4 | 90 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=90 · WR=—
Métricas y config crudas (metadata.json)lookback 7 return_th 0.1 shorts_skipped 160 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Same as R151 + regime filter: skip shorts if recent N-day return > threshold (variants: 7d>+5/+10, 14d>+10/+15, 21d>+15/+20). Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r154_regime_filtered_shorts.pyExperimento: R154: regime-filtered shorts (R151-A base)
Origen: outputs/round_154_regime_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R203 | vol-Kelly tgt=2.5% clip[0.8,1.2] | L | 223,936% | 2,462% | +358.5 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.8 max_lev 1.2 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r203_vol_kelly.pyExperimento: R203: V5 V115_cmp + continuous vol-adjusted Kelly sizing
Origen: outputs/round_203_vol_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R154 | skip shorts if 21d return > +20%OPTIMISTIC-EXEC | L+S | 213,591% | 2,510% | +245.1 | 4/4 | 89 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=89 · WR=—
Métricas y config crudas (metadata.json)lookback 21 return_th 0.2 shorts_skipped 219 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Same as R151 + regime filter: skip shorts if recent N-day return > threshold (variants: 7d>+5/+10, 14d>+10/+15, 21d>+15/+20). Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r154_regime_filtered_shorts.pyExperimento: R154: regime-filtered shorts (R151-A base)
Origen: outputs/round_154_regime_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R151 | short P(SL)>0.65, exit P(TP)>0.35, sl=8%, max=40hOPTIMISTIC-EXEC | S | 212,591% | 2,505% | +245.1 | 4/4 | 93 sh | 56.6% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=56.550925925925924%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 longs (canonical) + SHORT module: cuando V66 está en cash, si P(SL)>0.65 (3/5 seeds), abre short. Cierra en P(TP)>0.35, stop 8%, o 40h timeout. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r151_shorts_in_gaps.pyExperimento: R151: V66 long + SHORT during cash gaps
Origen: outputs/round_151_shorts_gaps/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R154 | R151-A (no regime filter)OPTIMISTIC-EXEC | L+S | 212,591% | 2,505% | +245.1 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)shorts_skipped 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Same as R151 + regime filter: skip shorts if recent N-day return > threshold (variants: 7d>+5/+10, 14d>+10/+15, 21d>+15/+20). Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r154_regime_filtered_shorts.pyExperimento: R154: regime-filtered shorts (R151-A base)
Origen: outputs/round_154_regime_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R160 | R151-A no friction (baseline)OPTIMISTIC-EXEC | L+S | 212,591% | 2,505% | +245.1 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)funding 0.0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r160_funding_stress.pyExperimento: R160: friction stress on R151-A
Origen: outputs/round_160_friction_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R160 | + funding 0.01%/8hOPTIMISTIC-EXEC | L | 191,908% | 2,431% | +234.1 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)funding 0.0001 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r160_funding_stress.pyExperimento: R160: friction stress on R151-A
Origen: outputs/round_160_friction_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R154 | skip shorts if 7d return > +5%OPTIMISTIC-EXEC | L+S | 181,144% | 2,360% | +245.1 | 4/4 | 88 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=88 · WR=—
Métricas y config crudas (metadata.json)lookback 7 return_th 0.05 shorts_skipped 254 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Same as R151 + regime filter: skip shorts if recent N-day return > threshold (variants: 7d>+5/+10, 14d>+10/+15, 21d>+15/+20). Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r154_regime_filtered_shorts.pyExperimento: R154: regime-filtered shorts (R151-A base)
Origen: outputs/round_154_regime_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R137 | R117 MACD_div local reproductionOPTIMISTIC-EXEC | L | 179,453% | — | -42.0 | 3/4 | 6,544 | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=6544 · WR=—
Métricas y config crudas (metadata.json)folds_trades [1658, 1624, 1639, 1623] folds_wr [44.27020506634499, 45.19704433497537, 44.05125076266016,... folds_mdd [23.591372375173027, 18.580826219207594, 19.8152419508006... bh_per_fold [59.18068329501152, 99.98283255066114, 228.4183620424153,... reproduces_r117 True compound_diff_pct 1.591644913315314e-05 r117_expected {"compound": 179453.2, "min_alpha": -42.0, "beats_bh": 3,... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r137_macd_repro.pyExperimento: R117 MACD_div local reproduction
Origen: outputs/round_137/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R137 | R117 MACD_div local reproductionOPTIMISTIC-EXEC | L | 179,453% | — | -42.0 | 3/4 | 6,544 | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=6544 · WR=—
Métricas y config crudas (metadata.json)folds_trades [1658, 1624, 1639, 1623] folds_wr [44.27020506634499, 45.19704433497537, 44.05125076266016,... folds_mdd [23.591372375173027, 18.580826219207594, 19.8152419508006... bh_per_fold [59.18068329501152, 99.98283255066114, 228.4183620424153,... reproduces_r117 True compound_diff_pct 1.591644913315314e-05 r117_expected {"compound": 179453.2, "min_alpha": -42.0, "beats_bh": 3,... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r137_macd_repro.pyExperimento: R117 MACD_div local reproduction
Origen: outputs/round_137_macd_repro/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R154 | skip shorts if 14d return > +10%OPTIMISTIC-EXEC | L+S | 172,844% | 2,322% | +245.1 | 4/4 | 91 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=91 · WR=—
Métricas y config crudas (metadata.json)lookback 14 return_th 0.1 shorts_skipped 153 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Same as R151 + regime filter: skip shorts if recent N-day return > threshold (variants: 7d>+5/+10, 14d>+10/+15, 21d>+15/+20). Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r154_regime_filtered_shorts.pyExperimento: R154: regime-filtered shorts (R151-A base)
Origen: outputs/round_154_regime_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R154 | skip shorts if 14d return > +15%OPTIMISTIC-EXEC | L+S | 170,820% | 2,313% | +245.1 | 4/4 | 91 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=91 · WR=—
Métricas y config crudas (metadata.json)lookback 14 return_th 0.15 shorts_skipped 109 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Same as R151 + regime filter: skip shorts if recent N-day return > threshold (variants: 7d>+5/+10, 14d>+10/+15, 21d>+15/+20). Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r154_regime_filtered_shorts.pyExperimento: R154: regime-filtered shorts (R151-A base)
Origen: outputs/round_154_regime_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R222 | V7+shorts HIGH (50%USDC, 75%BTC, 7.5bps) | L+S | 167,999% | 2,856% | +76.0 | —/4 | 99 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=99 · WR=—
Métricas y config crudas (metadata.json)usdc_apr 0.5 btc_apr 0.75 comm 0.00075 liquidations_long 0 liquidations_short 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r222_v7_plus_shorts_combined.pyExperimento: R222: V7 vol-Kelly LONG + R151-A shorts combined on Binance margin
Origen: outputs/round_222_v7_plus_shorts/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R160 | + funding 0.03%/8h (worst case)OPTIMISTIC-EXEC | L | 156,375% | 2,289% | +212.8 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)funding 0.0003 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r160_funding_stress.pyExperimento: R160: friction stress on R151-A
Origen: outputs/round_160_friction_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R160 | + regime slippageOPTIMISTIC-EXEC | L | 143,856% | 2,237% | +198.3 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)funding 0.0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r160_funding_stress.pyExperimento: R160: friction stress on R151-A
Origen: outputs/round_160_friction_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | High demand 75% APR + 7.5bps | L | 141,407% | 2,176% | +286.1 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 8.56e-05 comm_rate 0.00075 liquidations 0 total_interest_paid 78436.9940119945 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R181 | skip shorts if 21d return > +15% | L+S | 136,242% | 2,219% | +193.8 | 4/4 | 89 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=89 · WR=—
Métricas y config crudas (metadata.json)lookback 21 return_th 0.15 shorts_skipped 243 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + regime filter (skip shorts when N-day return > threshold). 7 variants tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r181_regime_filtered_honest.pyExperimento: R181: regime-filtered R151-A under bug-fixed engine
Origen: outputs/round_181_regime_filtered_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R160 | + funding 0.01% + regime slipOPTIMISTIC-EXEC | L | 129,857% | 2,169% | +188.2 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)funding 0.0001 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r160_funding_stress.pyExperimento: R160: friction stress on R151-A
Origen: outputs/round_160_friction_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R203 | vol-Kelly tgt=2% clip[0.7,1.4] | L | 127,793% | 2,277% | +149.9 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.02 min_lev 0.7 max_lev 1.4 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r203_vol_kelly.pyExperimento: R203: V5 V115_cmp + continuous vol-adjusted Kelly sizing
Origen: outputs/round_203_vol_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R181 | skip shorts if 7d return > +10% | L+S | 124,625% | 2,151% | +193.8 | 4/4 | 91 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=91 · WR=—
Métricas y config crudas (metadata.json)lookback 7 return_th 0.1 shorts_skipped 160 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + regime filter (skip shorts when N-day return > threshold). 7 variants tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r181_regime_filtered_honest.pyExperimento: R181: regime-filtered R151-A under bug-fixed engine
Origen: outputs/round_181_regime_filtered_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no exit_init_sl | L | 120,327% | — | +264.4 | —/4 | 297 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=297 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -1.5 bh_beats 4 verdict dead-weight? Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R181 | skip shorts if 21d return > +20% | L+S | 115,235% | 2,096% | +193.8 | 4/4 | 90 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=90 · WR=—
Métricas y config crudas (metadata.json)lookback 21 return_th 0.2 shorts_skipped 219 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + regime filter (skip shorts when N-day return > threshold). 7 variants tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r181_regime_filtered_honest.pyExperimento: R181: regime-filtered R151-A under bug-fixed engine
Origen: outputs/round_181_regime_filtered_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R151 | short P(SL)>0.70, exit P(TP)>0.30, sl=10%, max=40hOPTIMISTIC-EXEC | S | 114,349% | 1,999% | +321.6 | 4/4 | 45 sh | 73.6% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=45 · WR=73.61111111111111%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 longs (canonical) + SHORT module: cuando V66 está en cash, si P(SL)>0.65 (3/5 seeds), abre short. Cierra en P(TP)>0.35, stop 8%, o 40h timeout. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r151_shorts_in_gaps.pyExperimento: R151: V66 long + SHORT during cash gaps
Origen: outputs/round_151_shorts_gaps/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R174 | R151-A shorts (bugfix engine)CANDIDATE | L+S | 113,981% | 2,089% | +193.8 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r174_r151_bugfix.pyExperimento: R174: R151-A re-validated under bug-fixed engine
Origen: outputs/round_174_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R181 | R151-A base (no filter, honest engine) | L+S | 113,981% | 2,089% | +193.8 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)shorts_skipped 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + regime filter (skip shorts when N-day return > threshold). 7 variants tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r181_regime_filtered_honest.pyExperimento: R181: regime-filtered R151-A under bug-fixed engine
Origen: outputs/round_181_regime_filtered_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R182 | R151-A base (full notional) | L+S | 113,981% | 2,089% | +193.8 | 4/4 | 389 | 54.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=54.02777777777777%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + ADAPTIVE Kelly sizing based on rolling short WR (last N shorts). 4 schedules + half-Kelly fixed tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r182_adaptive_kelly.pyExperimento: R182: R151-A with adaptive Kelly sizing based on rolling short WR
Origen: outputs/round_182_adaptive_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R183 | R151-A full notional (instrumented, bug-fixed) | L+S | 113,981% | 2,089% | +193.8 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)folds_wr [55.45, 54.13, 56.41, 54.46] folds_longs [61, 100, 60, 74] folds_shorts [40, 9, 18, 27] folds_long_wr [55.74, 53.0, 61.67, 54.05] folds_short_wr [55.0, 66.67, 38.89, 55.56] folds_avg_win_pct [8.25, 8.53, 6.78, 5.1] folds_avg_loss_pct [-4.94, -4.57, -3.07, -2.9] folds_profit_factor [2.08, 2.2, 2.86, 2.1] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r183_instrumented_r151a.pyExperimento: R183: R151-A under bug-fixed engine with full per-fold instrumentation
Origen: outputs/round_183_instrumented_r151a/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R189 | R151-A full notional (instrumented) | L+S | 113,981% | 2,089% | +193.8 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)folds_wr [55.45, 54.13, 56.41, 54.46] folds_long_wr [55.74, 53.0, 61.67, 54.05] folds_short_wr [55.0, 66.67, 38.89, 55.56] folds_longs [61, 100, 60, 74] folds_shorts [40, 9, 18, 27] folds_profit_factor [2.08, 2.2, 2.86, 2.1] avg_win_pct 7.21 avg_loss_pct -3.93 profit_factor 2.24 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r189_comprehensive_instrumented.pyExperimento: R189: comprehensive per-fold instrumentation of all valid honest variants + V5+shorts upside
Origen: outputs/round_189_full_instrumentation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no cooldowns | L | 113,057% | — | +235.6 | —/4 | 314 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=314 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -30.3 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R189 | V5 V115_cmp + R151-A shorts (futures combo, instrumented) | L+S | 111,195% | 2,289% | +125.1 | 4/4 | 394 | 53.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=394 · WR=53.05%
Métricas y config crudas (metadata.json)folds_wr [53.4, 52.29, 56.41, 50.96] folds_long_wr [51.61, 50.5, 63.79, 51.35] folds_short_wr [56.1, 75.0, 35.0, 50.0] folds_longs [62, 101, 58, 74] folds_shorts [41, 8, 20, 30] folds_profit_factor [2.16, 2.32, 2.96, 1.65] avg_win_pct 7.57 avg_loss_pct -3.88 profit_factor 2.2 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r189_comprehensive_instrumented.pyExperimento: R189: comprehensive per-fold instrumentation of all valid honest variants + V5+shorts upside
Origen: outputs/round_189_full_instrumentation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R181 | skip shorts if 7d return > +5% | L+S | 110,320% | 2,068% | +193.8 | 4/4 | 89 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=89 · WR=—
Métricas y config crudas (metadata.json)lookback 7 return_th 0.05 shorts_skipped 254 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + regime filter (skip shorts when N-day return > threshold). 7 variants tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r181_regime_filtered_honest.pyExperimento: R181: regime-filtered R151-A under bug-fixed engine
Origen: outputs/round_181_regime_filtered_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R181 | skip shorts if 14d return > +10% | L+S | 97,054% | 1,990% | +193.8 | 4/4 | 91 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=91 · WR=—
Métricas y config crudas (metadata.json)lookback 14 return_th 0.1 shorts_skipped 153 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + regime filter (skip shorts when N-day return > threshold). 7 variants tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r181_regime_filtered_honest.pyExperimento: R181: regime-filtered R151-A under bug-fixed engine
Origen: outputs/round_181_regime_filtered_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R160 | + all + half-Kelly shorts (50%)OPTIMISTIC-EXEC | L+S | 89,759% | 1,918% | +182.9 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)funding 0.0001 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r160_funding_stress.pyExperimento: R160: friction stress on R151-A
Origen: outputs/round_160_friction_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R181 | skip shorts if 14d return > +15% | L+S | 88,844% | 1,942% | +193.8 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)lookback 14 return_th 0.15 shorts_skipped 109 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + regime filter (skip shorts when N-day return > threshold). 7 variants tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r181_regime_filtered_honest.pyExperimento: R181: regime-filtered R151-A under bug-fixed engine
Origen: outputs/round_181_regime_filtered_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R220 | Peak 100% APR + 7.5bps | L | 81,383% | 1,842% | +235.9 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)interest_per_hour 0.000114 comm_rate 0.00075 liquidations 0 total_interest_paid 95574.22874757415 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r220_v7_interest_stress.pyExperimento: R220: V7 vol-Kelly stress under realistic USDC margin rates
Origen: outputs/round_220_v7_interest_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R182 | Adaptive binary (WR last 10, full/30%) | L | 77,859% | 1,840% | +157.7 | 4/4 | 94 sh | 54.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=94 · WR=54.02777777777777%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + ADAPTIVE Kelly sizing based on rolling short WR (last N shorts). 4 schedules + half-Kelly fixed tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r182_adaptive_kelly.pyExperimento: R182: R151-A with adaptive Kelly sizing based on rolling short WR
Origen: outputs/round_182_adaptive_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R174 | R151-A + half-Kelly (bugfix)CANDIDATE | L+S | 76,873% | 1,837% | +178.4 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r174_r151_bugfix.pyExperimento: R174: R151-A re-validated under bug-fixed engine
Origen: outputs/round_174_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R182 | Half-Kelly fixed (size=0.5 always) | L | 76,873% | 1,837% | +178.4 | 4/4 | 94 sh | 54.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=94 · WR=54.02777777777777%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + ADAPTIVE Kelly sizing based on rolling short WR (last N shorts). 4 schedules + half-Kelly fixed tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r182_adaptive_kelly.pyExperimento: R182: R151-A with adaptive Kelly sizing based on rolling short WR
Origen: outputs/round_182_adaptive_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R189 | R151-A half-Kelly (instrumented) | L+S | 76,873% | 1,837% | +178.4 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)folds_wr [55.45, 54.13, 56.41, 54.46] folds_long_wr [55.74, 53.0, 61.67, 54.05] folds_short_wr [55.0, 66.67, 38.89, 55.56] folds_longs [61, 100, 60, 74] folds_shorts [40, 9, 18, 27] folds_profit_factor [2.08, 2.2, 2.86, 2.1] avg_win_pct 7.21 avg_loss_pct -3.93 profit_factor 2.24 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r189_comprehensive_instrumented.pyExperimento: R189: comprehensive per-fold instrumentation of all valid honest variants + V5+shorts upside
Origen: outputs/round_189_full_instrumentation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R188 | V5 V115_cmp (REALISTIC-EXEC) — V5 bot honestPROD V5 | L | 76,725% | 1,770% | +265.9 | 4/4 | 303 | 54.8% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=54.79%
Métricas y config crudas (metadata.json)folds_wr [50.0, 49.51, 64.41, 58.67] inflation_factor_vs_optimistic 2.2 edge_vs_v66_honest_pct 80.0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r188_v5_bugfix.pyExperimento: R188: V5 (V115_cmp full cascade) under REALISTIC-EXEC
Origen: outputs/round_188_v5_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R190 | V5 baseline (full cap, no pyramid) | L | 76,725% | 1,770% | +265.9 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)initial_size 1.0 pyramid_trigger 99.0 pyramid_add_frac 0.0 max_leverage 1.0 total_adds 0 folds_wr [50.0, 49.51, 64.41, 58.67] folds_adds [0, 0, 0, 0] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r190_v5_honest_pyramid.pyExperimento: R190: V5 V115_cmp + HONEST pyramid (50% initial cap, 50% reserve for adds)
Origen: outputs/round_190_v5_honest_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R191 | V5 + extra exit: none | L | 76,725% | 1,770% | +265.9 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)extra_exit_type none folds_wr [50.0, 49.51, 64.41, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r191_v5_extended_exits.pyExperimento: R191: V5 V115_cmp + 6 extended exit conditions
Origen: outputs/round_191_v5_extended_exits/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R192 | V5 + sizing: baseline | L | 76,725% | 1,770% | +265.9 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)sizing_mode baseline folds_wr [50.0, 49.51, 64.41, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r192_v5_dynamic_sizing.pyExperimento: R192: V5 V115_cmp + DYNAMIC position sizing based on prediction confidence
Origen: outputs/round_192_v5_dynamic_sizing/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R195 | V5 V115_cmp leverage=1.0x | L | 76,725% | 1,770% | +265.9 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)leverage 1.0 liquidated_folds 0 total_interest_paid 0.0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r195_v5_leveraged.pyExperimento: R195: V5 V115_cmp + margin leverage 1.0x..2.0x
Origen: outputs/round_195_v5_leveraged/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | V5 baseline (lo) | L | 76,725% | 1,770% | +265.9 | 4/4 | 303 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.0 thresholds {"nb": 0.3, "nl": 0.38, "nr": 0.31} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R198 | (unnamed) | L | 76,725% | 1,770% | +265.9 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)mode baseline_v5 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r198_v5v66_ensemble.pyExperimento: R198: V5+V66 cascade ensemble (defensive / aggressive / regime-conditional)
Origen: outputs/round_198_v5v66_ensemble/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R203 | V5 baseline (no sizing) | L | 76,725% | 1,770% | +265.9 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r203_vol_kelly.pyExperimento: R203: V5 V115_cmp + continuous vol-adjusted Kelly sizing
Origen: outputs/round_203_vol_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R204 | V5 baseline (control) | L | 76,725% | 1,770% | +265.9 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r204_vol_kelly_honest.pyExperimento: R204: vol-Kelly with lookahead bugs FIXED
Origen: outputs/round_204_vol_kelly_honest/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V5 baseline (control) | L | 76,725% | 1,770% | +265.9 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217: vol-Kelly variants sweep — find the full margin roster
Origen: outputs/round_217_volkelly_variants/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V14 defensive tgt=2.5% clip[0.5,1.0] | L | 76,725% | 1,770% | +265.9 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.5 max_lev 1.0 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217: vol-Kelly variants sweep — find the full margin roster
Origen: outputs/round_217_volkelly_variants/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no ATR-adaptive SL | L | 74,830% | — | +257.7 | —/4 | 303 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -8.2 bh_beats 4 verdict dead-weight? Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R191 | V5 + extra exit: drsi_75 | L | 73,174% | 1,734% | +210.0 | 4/4 | 553 | 55.7% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=553 · WR=55.72%
Métricas y config crudas (metadata.json)extra_exit_type drsi_75 folds_wr [57.58, 52.72, 56.25, 56.31] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r191_v5_extended_exits.pyExperimento: R191: V5 V115_cmp + 6 extended exit conditions
Origen: outputs/round_191_v5_extended_exits/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R182 | Adaptive Kelly (WR last 10, kelly schedule) | L | 72,736% | 1,796% | +154.6 | 4/4 | 94 sh | 54.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=94 · WR=54.02777777777777%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + ADAPTIVE Kelly sizing based on rolling short WR (last N shorts). 4 schedules + half-Kelly fixed tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r182_adaptive_kelly.pyExperimento: R182: R151-A with adaptive Kelly sizing based on rolling short WR
Origen: outputs/round_182_adaptive_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R191 | V5 + extra exit: drsi_oversold | L | 72,217% | 1,743% | +265.9 | 4/4 | 318 | 54.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=318 · WR=54.57%
Métricas y config crudas (metadata.json)extra_exit_type drsi_oversold folds_wr [45.68, 49.51, 64.41, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r191_v5_extended_exits.pyExperimento: R191: V5 V115_cmp + 6 extended exit conditions
Origen: outputs/round_191_v5_extended_exits/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R198 | (unnamed) | L | 72,138% | 1,738% | +252.2 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)mode aggressive Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r198_v5v66_ensemble.pyExperimento: R198: V5+V66 cascade ensemble (defensive / aggressive / regime-conditional)
Origen: outputs/round_198_v5v66_ensemble/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R198 | (unnamed) | L | 72,138% | 1,738% | +252.2 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)mode regime_v66_bear Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r198_v5v66_ensemble.pyExperimento: R198: V5+V66 cascade ensemble (defensive / aggressive / regime-conditional)
Origen: outputs/round_198_v5v66_ensemble/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R182 | Adaptive Kelly (WR last 20, kelly schedule) | L | 72,044% | 1,797% | +159.7 | 4/4 | 94 sh | 54.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=94 · WR=54.02777777777777%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + ADAPTIVE Kelly sizing based on rolling short WR (last N shorts). 4 schedules + half-Kelly fixed tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r182_adaptive_kelly.pyExperimento: R182: R151-A with adaptive Kelly sizing based on rolling short WR
Origen: outputs/round_182_adaptive_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R192 | V5 + sizing: anti_confidence | L | 71,858% | 1,743% | +265.3 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)sizing_mode anti_confidence folds_wr [50.0, 49.51, 64.41, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r192_v5_dynamic_sizing.pyExperimento: R192: V5 V115_cmp + DYNAMIC position sizing based on prediction confidence
Origen: outputs/round_192_v5_dynamic_sizing/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | ratchet 3->2 levels | L | 71,355% | — | +265.9 | —/4 | 295 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=295 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha 0.0 bh_beats 4 verdict dead-weight? Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no ATR-cond lateral | L | 71,294% | — | +254.5 | —/4 | 301 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=301 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -11.4 bh_beats 4 verdict dead-weight? Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R110 | R110 local reproduction | L | 70,576% | 1,707% | +239.2 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)expected_compound 70576 expected_min_alpha 245 reproduces True Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r110_local.pyExperimento: R110 local reproduction
Origen: outputs/round_110_repro/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R136 | R110 local reproductionOPTIMISTIC-EXEC | L | 70,576% | 1,707% | +239.2 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)expected_compound 70576 expected_min_alpha 245 reproduces True Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Experimento: R110 local reproduction
Origen: outputs/round_136/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R146 | canonical (10% fixed)OPTIMISTIC-EXEC | L | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 27.672150676086755 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r146_atr_stops.pyExperimento: R146: ATR-adaptive initial SL on canonical V66
Origen: outputs/round_146_atr_stops/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R148 | (unnamed)OPTIMISTIC-EXEC | L | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)tau 0.0 trades_total 300 skip_pct 0.0 avg_mdd 27.672150676086755 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r148_meta_label.pyExperimento: R148: meta-labeling V66 + R134 P(v66_zone) filter
Origen: outputs/round_148_metalabel/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R150 | canonical (no breaker)OPTIMISTIC-EXEC | L | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 27.672150676086755 circuit_triggers 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r150_maxdd_circuit.pyExperimento: R150: Max-DD circuit breaker on V66
Origen: outputs/round_150_maxdd/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R151 | no shorts (V66 canonical)OPTIMISTIC-EXEC | L+S | 70,576% | 1,707% | +239.2 | 4/4 | 302 | 56.0% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.96%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 longs (canonical) + SHORT module: cuando V66 está en cash, si P(SL)>0.65 (3/5 seeds), abre short. Cierra en P(TP)>0.35, stop 8%, o 40h timeout. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r151_shorts_in_gaps.pyExperimento: R151: V66 long + SHORT during cash gaps
Origen: outputs/round_151_shorts_gaps/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R151 | short P(SL)>0.80, exit P(TP)>0.20, sl=15%, max=40hOPTIMISTIC-EXEC | S | 70,576% | 1,707% | +239.2 | 4/4 | — | 0.0% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 longs (canonical) + SHORT module: cuando V66 está en cash, si P(SL)>0.65 (3/5 seeds), abre short. Cierra en P(TP)>0.35, stop 8%, o 40h timeout. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r151_shorts_in_gaps.pyExperimento: R151: V66 long + SHORT during cash gaps
Origen: outputs/round_151_shorts_gaps/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R156 | R151-A (canonical R069 for shorts) [baseline]OPTIMISTIC-EXEC | L+S | 70,576% | 1,707% | +239.2 | 4/4 | — | 0.0% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier asymmetric: k_up=7, k_dn=10 → favors P(SL) responsiveness Entrada / salida Dual-model: V66 longs use canonical GRU; shorts use R155 short-specific model Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r156_dual_model.pyExperimento: R156: V66 canonical longs + R155 short-trained shorts
Origen: outputs/round_156_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R156 | R155 P(SL)>0.65, exit P(TP)>0.35, sl=8%OPTIMISTIC-EXEC | L | 70,576% | 1,707% | +239.2 | 4/4 | — | 0.0% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier asymmetric: k_up=7, k_dn=10 → favors P(SL) responsiveness Entrada / salida Dual-model: V66 longs use canonical GRU; shorts use R155 short-specific model Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r156_dual_model.pyExperimento: R156: V66 canonical longs + R155 short-trained shorts
Origen: outputs/round_156_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R162 | canonical V66 (full notional)OPTIMISTIC-EXEC | L | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r162_r134_size_multiplier.pyExperimento: R162: R134 P(v66_zone) as position size multiplier
Origen: outputs/round_162_r134_size_mult/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R156 | R155 P(SL)>0.60, exit P(TP)>0.30, sl=8%OPTIMISTIC-EXEC | L | 70,209% | 1,705% | +239.2 | 4/4 | 11 sh | 54.5% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=11 · WR=54.54545454545454%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier asymmetric: k_up=7, k_dn=10 → favors P(SL) responsiveness Entrada / salida Dual-model: V66 longs use canonical GRU; shorts use R155 short-specific model Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r156_dual_model.pyExperimento: R156: V66 canonical longs + R155 short-trained shorts
Origen: outputs/round_156_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R191 | V5 + extra exit: slope_neg | L | 69,381% | 1,697% | +264.3 | 4/4 | 310 | 56.4% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=310 · WR=56.38%
Métricas y config crudas (metadata.json)extra_exit_type slope_neg folds_wr [51.43, 50.48, 64.41, 59.21] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r191_v5_extended_exits.pyExperimento: R191: V5 V115_cmp + 6 extended exit conditions
Origen: outputs/round_191_v5_extended_exits/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no exit_drsi | L | 68,993% | — | +234.2 | —/4 | 300 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=300 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -31.7 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no entry DRSI gate | L | 64,565% | — | +230.3 | —/4 | 441 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=441 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -35.6 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R198 | (unnamed) | L | 63,389% | 1,678% | +235.3 | 4/4 | 310 | 55.4% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=310 · WR=55.42%
Métricas y config crudas (metadata.json)mode defensive Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r198_v5v66_ensemble.pyExperimento: R198: V5+V66 cascade ensemble (defensive / aggressive / regime-conditional)
Origen: outputs/round_198_v5v66_ensemble/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R182 | Adaptive Kelly (WR last 5, kelly schedule) | L | 62,842% | 1,736% | +157.9 | 4/4 | 94 sh | 54.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=94 · WR=54.02777777777777%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A under bug-fixed engine + ADAPTIVE Kelly sizing based on rolling short WR (last N shorts). 4 schedules + half-Kelly fixed tested. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r182_adaptive_kelly.pyExperimento: R182: R151-A with adaptive Kelly sizing based on rolling short WR
Origen: outputs/round_182_adaptive_kelly/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no exit_gru_danger | L | 62,788% | — | +205.0 | —/4 | 299 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=299 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -60.9 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | ratchet 3->1 (none) | L | 62,577% | — | +220.6 | —/4 | 302 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -45.3 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R189 | R151-B conservative (instrumented) | L+S | 60,539% | 1,699% | +168.9 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)folds_wr [55.45, 54.13, 56.41, 54.46] folds_long_wr [55.74, 53.0, 61.67, 54.05] folds_short_wr [55.0, 66.67, 38.89, 55.56] folds_longs [61, 100, 60, 74] folds_shorts [40, 9, 18, 27] folds_profit_factor [2.08, 2.2, 2.86, 2.1] avg_win_pct 7.21 avg_loss_pct -3.93 profit_factor 2.24 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r189_comprehensive_instrumented.pyExperimento: R189: comprehensive per-fold instrumentation of all valid honest variants + V5+shorts upside
Origen: outputs/round_189_full_instrumentation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R198 | (unnamed) | L | 59,598% | 1,647% | +219.5 | 4/4 | 310 | 55.4% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=310 · WR=55.42%
Métricas y config crudas (metadata.json)mode baseline_v66 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r198_v5v66_ensemble.pyExperimento: R198: V5+V66 cascade ensemble (defensive / aggressive / regime-conditional)
Origen: outputs/round_198_v5v66_ensemble/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R191 | V5 + extra exit: double_atr_drsi | L | 55,137% | 1,580% | +211.7 | 4/4 | 596 | 55.4% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=596 · WR=55.36%
Métricas y config crudas (metadata.json)extra_exit_type double_atr_drsi folds_wr [55.0, 51.52, 60.56, 54.37] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r191_v5_extended_exits.pyExperimento: R191: V5 V115_cmp + 6 extended exit conditions
Origen: outputs/round_191_v5_extended_exits/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R191 | V5 + extra exit: rsi_confluence | L | 54,432% | 1,564% | +213.3 | 4/4 | 400 | 59.9% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=400 · WR=59.94%
Métricas y config crudas (metadata.json)extra_exit_type rsi_confluence folds_wr [55.68, 58.16, 66.67, 59.26] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r191_v5_extended_exits.pyExperimento: R191: V5 V115_cmp + 6 extended exit conditions
Origen: outputs/round_191_v5_extended_exits/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R174 | R151-B more conservative (bugfix) | L+S | 54,068% | 1,668% | +125.3 | 4/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r174_r151_bugfix.pyExperimento: R174: R151-A re-validated under bug-fixed engine
Origen: outputs/round_174_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R150 | DD 30% / pause 30dOPTIMISTIC-EXEC | L | 53,423% | 1,553% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 25.739174428102647 circuit_triggers 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r150_maxdd_circuit.pyExperimento: R150: Max-DD circuit breaker on V66
Origen: outputs/round_150_maxdd/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R156 | R155 P(SL)>0.55, exit P(TP)>0.35, sl=8%OPTIMISTIC-EXEC | L | 52,673% | 1,571% | +239.2 | 4/4 | 185 sh | 48.7% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=185 · WR=48.728813559322035%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier asymmetric: k_up=7, k_dn=10 → favors P(SL) responsiveness Entrada / salida Dual-model: V66 longs use canonical GRU; shorts use R155 short-specific model Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r156_dual_model.pyExperimento: R156: V66 canonical longs + R155 short-trained shorts
Origen: outputs/round_156_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R151 | short P(SL)>0.75, exit P(TP)>0.25, sl=12%, max=40hOPTIMISTIC-EXEC | S | 52,487% | 1,596% | +199.3 | 4/4 | 9 sh | 68.8% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=9 · WR=68.75%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 longs (canonical) + SHORT module: cuando V66 está en cash, si P(SL)>0.65 (3/5 seeds), abre short. Cierra en P(TP)>0.35, stop 8%, o 40h timeout. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r151_shorts_in_gaps.pyExperimento: R151: V66 long + SHORT during cash gaps
Origen: outputs/round_151_shorts_gaps/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R146 | ATR 2.5x floor 7%OPTIMISTIC-EXEC | L | 48,939% | 1,533% | +230.4 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 32.082204389008545 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r146_atr_stops.pyExperimento: R146: ATR-adaptive initial SL on canonical V66
Origen: outputs/round_146_atr_stops/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V13 conservative tgt=2.0% clip[0.7,1.2] | L | 46,884% | 1,654% | +90.4 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.02 min_lev 0.7 max_lev 1.2 liquidated_folds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217: vol-Kelly variants sweep — find the full margin roster
Origen: outputs/round_217_volkelly_variants/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R156 | R155 P(SL)>0.50, exit P(TP)>0.40, sl=8%OPTIMISTIC-EXEC | L | 43,030% | 1,501% | +168.3 | 4/4 | 487 sh | 36.6% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=487 · WR=36.56055341659624%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier asymmetric: k_up=7, k_dn=10 → favors P(SL) responsiveness Entrada / salida Dual-model: V66 longs use canonical GRU; shorts use R155 short-specific model Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r156_dual_model.pyExperimento: R156: V66 canonical longs + R155 short-trained shorts
Origen: outputs/round_156_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R156 | R155 P(SL)>0.50, exit P(TP)>0.40, sl=10%OPTIMISTIC-EXEC | L | 43,030% | 1,501% | +168.3 | 4/4 | 487 sh | 36.6% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=487 · WR=36.56055341659624%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier asymmetric: k_up=7, k_dn=10 → favors P(SL) responsiveness Entrada / salida Dual-model: V66 longs use canonical GRU; shorts use R155 short-specific model Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r156_dual_model.pyExperimento: R156: V66 canonical longs + R155 short-trained shorts
Origen: outputs/round_156_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R173 | V66 canonical (no pyramid) — bugfix enginePROD V6 | L | 42,636% | 1,473% | +192.8 | 4/4 | 302 | 56.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.960264900662246%
Métricas y config crudas (metadata.json)pyramid_adds 0 pyramid_blocked 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 canonical UNDER BUG-FIXED ENGINE: detect@close[i] → execute@open[i+1]. Pyramid disabled. Cap properly tracked. THIS IS THE HONEST V66 BASELINE. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r173_bugfix.pyExperimento: R173: bug-fixed engine for V66 + pyramid
Origen: outputs/round_173_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R173 | R170-B (0.12/0.65/1.75x/24h) — bugfix engine | L | 42,636% | 1,473% | +192.8 | 4/4 | 302 | 56.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.960264900662246%
Métricas y config crudas (metadata.json)pyramid_adds 0 pyramid_blocked 517 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 canonical UNDER BUG-FIXED ENGINE: detect@close[i] → execute@open[i+1]. Pyramid disabled. Cap properly tracked. THIS IS THE HONEST V66 BASELINE. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r173_bugfix.pyExperimento: R173: bug-fixed engine for V66 + pyramid
Origen: outputs/round_173_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R173 | R163 baseline (0.10/0.50/1.5x/24h) — bugfix engine | L | 42,636% | 1,473% | +192.8 | 4/4 | 302 | 56.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.960264900662246%
Métricas y config crudas (metadata.json)pyramid_adds 0 pyramid_blocked 583 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 canonical UNDER BUG-FIXED ENGINE: detect@close[i] → execute@open[i+1]. Pyramid disabled. Cap properly tracked. THIS IS THE HONEST V66 BASELINE. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r173_bugfix.pyExperimento: R173: bug-fixed engine for V66 + pyramid
Origen: outputs/round_173_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R173 | More conservative (0.10/0.30/1.3x/24h) — bugfix | L | 42,636% | 1,473% | +192.8 | 4/4 | 302 | 56.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.960264900662246%
Métricas y config crudas (metadata.json)pyramid_adds 0 pyramid_blocked 388 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 canonical UNDER BUG-FIXED ENGINE: detect@close[i] → execute@open[i+1]. Pyramid disabled. Cap properly tracked. THIS IS THE HONEST V66 BASELINE. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r173_bugfix.pyExperimento: R173: bug-fixed engine for V66 + pyramid
Origen: outputs/round_173_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R174 | V66 alone (bugfix engine) | L | 42,636% | 1,473% | +192.8 | 4/4 | 302 | 56.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.96%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r174_r151_bugfix.pyExperimento: R174: R151-A re-validated under bug-fixed engine
Origen: outputs/round_174_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R189 | V66 canonical (instrumented, R173 baseline) | L | 42,636% | 1,473% | +192.8 | 4/4 | 302 | 56.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.96%
Métricas y config crudas (metadata.json)folds_wr [53.12, 52.48, 60.66, 59.21] folds_long_wr [53.12, 52.48, 60.66, 59.21] folds_short_wr [null, null, null, null] folds_longs [64, 101, 61, 76] folds_shorts [0, 0, 0, 0] folds_profit_factor [2.2, 2.06, 3.4, 2.42] avg_win_pct 7.49 avg_loss_pct -4.03 profit_factor 2.36 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r189_comprehensive_instrumented.pyExperimento: R189: comprehensive per-fold instrumentation of all valid honest variants + V5+shorts upside
Origen: outputs/round_189_full_instrumentation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | V5 baseline (lo) | L | 38,952% | 1,419% | +203.4 | 4/4 | 304 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=304 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.001 thresholds {"nb": 0.3, "nl": 0.38, "nr": 0.31} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R192 | V5 + sizing: vol_adjusted | L | 37,452% | 1,442% | +100.0 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)sizing_mode vol_adjusted folds_wr [50.0, 49.51, 64.41, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r192_v5_dynamic_sizing.pyExperimento: R192: V5 V115_cmp + DYNAMIC position sizing based on prediction confidence
Origen: outputs/round_192_v5_dynamic_sizing/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no exit_trail | L | 31,624% | — | +205.5 | —/4 | 225 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=225 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -60.4 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | no exit_peak_drop | L | 30,398% | — | +161.6 | —/4 | 233 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=233 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -104.3 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R187 | V4 hybrid_v5 3-Regime (REALISTIC-EXEC) — V4 bot honestPROD V4 | L | 29,909% | 1,415% | +99.7 | 4/4 | 180 | 52.8% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=180 · WR=52.78%
Métricas y config crudas (metadata.json)folds_wr [55.81, 46.67, 54.55, 56.82] inflation_factor_vs_optimistic 1.01 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r187_v4_bugfix.pyExperimento: R187: V4 (hybrid_v5 3-Regime Robust-5) under REALISTIC-EXEC
Origen: outputs/round_187_v4_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R192 | V5 + sizing: tiered | L | 29,218% | 1,325% | +36.1 | 4/4 | 303 | 55.5% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.47%
Métricas y config crudas (metadata.json)sizing_mode tiered folds_wr [50.0, 50.49, 62.71, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r192_v5_dynamic_sizing.pyExperimento: R192: V5 V115_cmp + DYNAMIC position sizing based on prediction confidence
Origen: outputs/round_192_v5_dynamic_sizing/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R146 | ATR 3x floor 5%OPTIMISTIC-EXEC | L | 29,029% | 1,289% | +195.1 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 29.14433857637885 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r146_atr_stops.pyExperimento: R146: ATR-adaptive initial SL on canonical V66
Origen: outputs/round_146_atr_stops/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R192 | V5 + sizing: prob_weighted | L | 28,274% | 1,323% | +53.6 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)sizing_mode prob_weighted folds_wr [50.0, 49.51, 64.41, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r192_v5_dynamic_sizing.pyExperimento: R192: V5 V115_cmp + DYNAMIC position sizing based on prediction confidence
Origen: outputs/round_192_v5_dynamic_sizing/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R146 | ATR 2x floor 5%OPTIMISTIC-EXEC | L | 28,065% | 1,276% | +200.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 30.555060552317062 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r146_atr_stops.pyExperimento: R146: ATR-adaptive initial SL on canonical V66
Origen: outputs/round_146_atr_stops/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R146 | ATR 2x capped 5-15%OPTIMISTIC-EXEC | L | 28,065% | 1,276% | +200.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 30.555060552317062 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r146_atr_stops.pyExperimento: R146: ATR-adaptive initial SL on canonical V66
Origen: outputs/round_146_atr_stops/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R192 | V5 + sizing: combined | L | 27,453% | 1,319% | +25.0 | 4/4 | 303 | 55.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=55.65%
Métricas y config crudas (metadata.json)sizing_mode combined folds_wr [50.0, 49.51, 64.41, 58.67] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r192_v5_dynamic_sizing.pyExperimento: R192: V5 V115_cmp + DYNAMIC position sizing based on prediction confidence
Origen: outputs/round_192_v5_dynamic_sizing/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R150 | DD 25% / pause 30dOPTIMISTIC-EXEC | L | 25,534% | 1,245% | +189.7 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 24.18901680121595 circuit_triggers 6 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r150_maxdd_circuit.pyExperimento: R150: Max-DD circuit breaker on V66
Origen: outputs/round_150_maxdd/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R218 | R151-A baseline (futures funding 0.03%/day) | L+S | 25,214% | 1,256% | +120.3 | —/4 | 389 | 55.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)borrow_per_8h 9.999999999999999e-05 avg_short_wr 77.07167832167832 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r218_v10_shorts_margin_feasibility.pyExperimento: R218: V10 shorts feasibility under Binance margin BTC borrow rates
Origen: outputs/round_218_v10_shorts_margin_feasibility/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R218 | Margin LOW (0.075%/day = 27.4% APR) | L | 23,601% | 1,223% | +119.7 | —/4 | 74 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=74 · WR=—
Métricas y config crudas (metadata.json)borrow_per_8h 0.00025 avg_short_wr 77.07167832167832 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r218_v10_shorts_margin_feasibility.pyExperimento: R218: V10 shorts feasibility under Binance margin BTC borrow rates
Origen: outputs/round_218_v10_shorts_margin_feasibility/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R223 | R223d +SL +cooldown +vol-Kelly (full stack) | L | 23,231% | 1,681% | -12.2 | —/4 | 30 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=30 · WR=—
Métricas y config crudas (metadata.json)params {"use_sl": true, "use_cooldown": true, "use_kelly": true} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r223_balanced_long_short.pyExperimento: R223: balanced long-short pure signal (no V5 cascade)
Origen: outputs/round_223_balanced_long_short/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R218 | Margin MID (0.1125%/day = 41% APR) | L | 22,335% | 1,196% | +119.3 | —/4 | 74 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=74 · WR=—
Métricas y config crudas (metadata.json)borrow_per_8h 0.00037500000000000006 avg_short_wr 77.07167832167832 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r218_v10_shorts_margin_feasibility.pyExperimento: R218: V10 shorts feasibility under Binance margin BTC borrow rates
Origen: outputs/round_218_v10_shorts_margin_feasibility/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R218 | Margin HIGH (0.15%/day = 55% APR) | L | 21,136% | 1,171% | +118.8 | —/4 | 74 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=74 · WR=—
Métricas y config crudas (metadata.json)borrow_per_8h 0.0005 avg_short_wr 77.07167832167832 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r218_v10_shorts_margin_feasibility.pyExperimento: R218: V10 shorts feasibility under Binance margin BTC borrow rates
Origen: outputs/round_218_v10_shorts_margin_feasibility/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R150 | DD 20% / pause 15dOPTIMISTIC-EXEC | L | 20,674% | 1,178% | +73.9 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 20.213634826794753 circuit_triggers 14 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r150_maxdd_circuit.pyExperimento: R150: Max-DD circuit breaker on V66
Origen: outputs/round_150_maxdd/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R218 | Margin EXTREME (0.20%/day = 73% APR) | L | 19,637% | 1,138% | +118.2 | —/4 | 74 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=74 · WR=—
Métricas y config crudas (metadata.json)borrow_per_8h 0.0006666666666666666 avg_short_wr 77.07167832167832 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r218_v10_shorts_margin_feasibility.pyExperimento: R218: V10 shorts feasibility under Binance margin BTC borrow rates
Origen: outputs/round_218_v10_shorts_margin_feasibility/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R223 | R223a vanilla (no SL, no cooldown, no Kelly) | L | 18,439% | 1,363% | +63.1 | —/4 | 26 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=26 · WR=—
Métricas y config crudas (metadata.json)params {"use_sl": false, "use_cooldown": false, "use_kelly": false} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r223_balanced_long_short.pyExperimento: R223: balanced long-short pure signal (no V5 cascade)
Origen: outputs/round_223_balanced_long_short/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R150 | DD 20% / pause 60dOPTIMISTIC-EXEC | L | 15,747% | 1,081% | +113.5 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 19.974562037134554 circuit_triggers 8 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r150_maxdd_circuit.pyExperimento: R150: Max-DD circuit breaker on V66
Origen: outputs/round_150_maxdd/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R146 | ATR 1.5x capped 4-12%OPTIMISTIC-EXEC | L | 14,737% | 1,040% | +69.0 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 32.219972142219945 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r146_atr_stops.pyExperimento: R146: ATR-adaptive initial SL on canonical V66
Origen: outputs/round_146_atr_stops/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R223 | R223c +SL +cooldown(2,24) | L | 14,241% | 1,161% | +45.7 | —/4 | 30 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=30 · WR=—
Métricas y config crudas (metadata.json)params {"use_sl": true, "use_cooldown": true, "use_kelly": false} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r223_balanced_long_short.pyExperimento: R223: balanced long-short pure signal (no V5 cascade)
Origen: outputs/round_223_balanced_long_short/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | regimes 3->2 (bear+rest) | L | 13,119% | — | +83.1 | —/4 | 319 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=319 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -182.8 bh_beats 4 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R190 | V5 + honest pyramid 70/30, trig=10%, add=70% | L+ | 12,975% | 977% | +33.9 | 4/4 | 302 | 53.3% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=53.34%
Métricas y config crudas (metadata.json)initial_size 0.7 pyramid_trigger 0.1 pyramid_add_frac 0.7 max_leverage 1.43 total_adds 249 folds_wr [43.75, 48.04, 65.0, 56.58] folds_adds [60, 109, 38, 42] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r190_v5_honest_pyramid.pyExperimento: R190: V5 V115_cmp + HONEST pyramid (50% initial cap, 50% reserve for adds)
Origen: outputs/round_190_v5_honest_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R223 | R223b +SL only (long 8%, short 8%) | L | 12,500% | 1,153% | +47.3 | —/4 | 30 sh | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=30 · WR=—
Métricas y config crudas (metadata.json)params {"use_sl": true, "use_cooldown": false, "use_kelly": false} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r223_balanced_long_short.pyExperimento: R223: balanced long-short pure signal (no V5 cascade)
Origen: outputs/round_223_balanced_long_short/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R150 | DD 20% / pause 30dOPTIMISTIC-EXEC | L | 12,491% | 1,015% | +70.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 20.29053530619941 circuit_triggers 11 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r150_maxdd_circuit.pyExperimento: R150: Max-DD circuit breaker on V66
Origen: outputs/round_150_maxdd/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R186 | V3 hybrid_v3 (REALISTIC-EXEC) — V3 bot honestPROD V3 | L | 11,400% | 1,077% | +44.4 | 4/4 | 213 | 47.4% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=213 · WR=47.42%
Métricas y config crudas (metadata.json)folds_wr [48.78, 39.39, 54.35, 50.0] inflation_factor_vs_optimistic 0.63 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r186_v3_bugfix.pyExperimento: R186: V3 (hybrid_v3) under REALISTIC-EXEC engine
Origen: outputs/round_186_v3_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.05 reenter | L | 9,268% | 969% | -83.0 | 3/4 | 234 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=234 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.0 thresholds {"nb": 0.35, "nl": 0.43, "nr": 0.36} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R185 | V2 GRU Ensemble (REALISTIC-EXEC) — V2 bot honestPROD V2 | L | 7,781% | 869% | +62.1 | 4/4 | 117 | 51.3% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=117 · WR=51.28%
Métricas y config crudas (metadata.json)folds_wr [46.15, 44.44, 56.82, 49.02] inflation_factor_vs_optimistic 0.98 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r185_v2_bugfix.pyExperimento: R185: V2 (GRU Ensemble always-invested) under REALISTIC-EXEC engine
Origen: outputs/round_185_v2_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R150 | DD 15% / pause 30dOPTIMISTIC-EXEC | L | 6,938% | 833% | -29.8 | 3/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)avg_mdd 17.41430641438786 circuit_triggers 21 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r150_maxdd_circuit.pyExperimento: R150: Max-DD circuit breaker on V66
Origen: outputs/round_150_maxdd/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R162 | R134 size: hard 25/50/75/100OPTIMISTIC-EXEC | L | 6,278% | 840% | -90.4 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r162_r134_size_multiplier.pyExperimento: R162: R134 P(v66_zone) as position size multiplier
Origen: outputs/round_162_r134_size_mult/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.05 reenter | L | 5,785% | 818% | -105.3 | 3/4 | 234 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=234 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.001 thresholds {"nb": 0.35, "nl": 0.43, "nr": 0.36} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R190 | V5 + honest pyramid 50/50, trig=5%, add=50% | L+ | 4,915% | 671% | -40.8 | 3/4 | 303 | 46.1% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=46.13%
Métricas y config crudas (metadata.json)initial_size 0.5 pyramid_trigger 0.05 pyramid_add_frac 0.5 max_leverage 2.0 total_adds 763 folds_wr [40.0, 41.18, 53.33, 50.0] folds_adds [177, 311, 140, 135] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r190_v5_honest_pyramid.pyExperimento: R190: V5 V115_cmp + HONEST pyramid (50% initial cap, 50% reserve for adds)
Origen: outputs/round_190_v5_honest_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R162 | R134 size: soft (linear P)OPTIMISTIC-EXEC | L | 4,388% | 752% | -116.6 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r162_r134_size_multiplier.pyExperimento: R162: R134 P(v66_zone) as position size multiplier
Origen: outputs/round_162_r134_size_mult/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R148 | (unnamed)OPTIMISTIC-EXEC | L | 3,810% | 809% | -111.6 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)tau 0.2 trades_total 182 skip_pct 94.4206008583691 avg_mdd 22.90006047409818 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r148_meta_label.pyExperimento: R148: meta-labeling V66 + R134 P(v66_zone) filter
Origen: outputs/round_148_metalabel/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R190 | V5 + honest pyramid 50/50, trig=10%, add=30% | L+ | 3,713% | 602% | -65.3 | 3/4 | 302 | 53.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=52.95%
Métricas y config crudas (metadata.json)initial_size 0.5 pyramid_trigger 0.1 pyramid_add_frac 0.3 max_leverage 2.0 total_adds 453 folds_wr [42.19, 48.04, 65.0, 56.58] folds_adds [104, 205, 78, 66] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r190_v5_honest_pyramid.pyExperimento: R190: V5 V115_cmp + HONEST pyramid (50% initial cap, 50% reserve for adds)
Origen: outputs/round_190_v5_honest_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R148 | (unnamed)OPTIMISTIC-EXEC | L | 3,681% | 815% | -115.8 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)tau 0.1 trades_total 207 skip_pct 92.28187919463086 avg_mdd 25.836237270527242 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r148_meta_label.pyExperimento: R148: meta-labeling V66 + R134 P(v66_zone) filter
Origen: outputs/round_148_metalabel/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | V5 baseline (lo) | L | 3,563% | 614% | +15.2 | 4/4 | 303 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.005 thresholds {"nb": 0.3, "nl": 0.38, "nr": 0.31} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R190 | V5 + honest pyramid 50/50, trig=15%, add=50% | L+ | 3,495% | 587% | -84.0 | 3/4 | 302 | 55.7% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.72%
Métricas y config crudas (metadata.json)initial_size 0.5 pyramid_trigger 0.15 pyramid_add_frac 0.5 max_leverage 2.0 total_adds 134 folds_wr [50.0, 50.0, 65.0, 57.89] folds_adds [37, 55, 25, 17] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r190_v5_honest_pyramid.pyExperimento: R190: V5 V115_cmp + HONEST pyramid (50% initial cap, 50% reserve for adds)
Origen: outputs/round_190_v5_honest_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R162 | R134 size: aggressive 10/30/60/100OPTIMISTIC-EXEC | L | 3,415% | 728% | -133.6 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r162_r134_size_multiplier.pyExperimento: R162: R134 P(v66_zone) as position size multiplier
Origen: outputs/round_162_r134_size_mult/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R190 | V5 + honest pyramid 50/50, trig=10%, add=50% | L+ | 3,408% | 581% | -65.1 | 3/4 | 303 | 52.6% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=303 · WR=52.6%
Métricas y config crudas (metadata.json)initial_size 0.5 pyramid_trigger 0.1 pyramid_add_frac 0.5 max_leverage 2.0 total_adds 313 folds_wr [43.08, 47.06, 65.0, 55.26] folds_adds [80, 134, 52, 47] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r190_v5_honest_pyramid.pyExperimento: R190: V5 V115_cmp + HONEST pyramid (50% initial cap, 50% reserve for adds)
Origen: outputs/round_190_v5_honest_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R148 | (unnamed)OPTIMISTIC-EXEC | L | 2,921% | 753% | -147.1 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)tau 0.3 trades_total 167 skip_pct 95.26241134751773 avg_mdd 23.11876349394448 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r148_meta_label.pyExperimento: R148: meta-labeling V66 + R134 P(v66_zone) filter
Origen: outputs/round_148_metalabel/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R148 | (unnamed)OPTIMISTIC-EXEC | L | 2,360% | 668% | -158.2 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)tau 0.7 trades_total 121 skip_pct 97.26182394206833 avg_mdd 19.861826425315833 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r148_meta_label.pyExperimento: R148: meta-labeling V66 + R134 P(v66_zone) filter
Origen: outputs/round_148_metalabel/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R158 | R151-A (canonical R069 for shorts) [baseline]OPTIMISTIC-EXEC | L+S | 1,772% | 780% | -290.9 | 3/4 | 398 sh | 51.2% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=398 · WR=51.2232321592815%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier k_up=15, k_dn=5 (longer up barrier, much tighter down) Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r158_dual_r157.pyExperimento: R158: V66 canonical longs + R157 short-trained shorts
Origen: outputs/round_158_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R158 | R157 P(SL)>0.65, exit P(TP)>0.35, sl=8%OPTIMISTIC-EXEC | L | 1,772% | 780% | -290.9 | 3/4 | 398 sh | 51.2% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=398 · WR=51.2232321592815%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier k_up=15, k_dn=5 (longer up barrier, much tighter down) Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r158_dual_r157.pyExperimento: R158: V66 canonical longs + R157 short-trained shorts
Origen: outputs/round_158_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R148 | (unnamed)OPTIMISTIC-EXEC | L | 1,576% | 608% | -179.8 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)tau 0.4 trades_total 156 skip_pct 95.97419354838709 avg_mdd 25.50800531681281 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r148_meta_label.pyExperimento: R148: meta-labeling V66 + R134 P(v66_zone) filter
Origen: outputs/round_148_metalabel/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R191 | V5 + extra exit: atr_z_spike | L | 1,479% | 476% | -90.1 | 1/4 | 1,953 | 52.0% | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=1953 · WR=51.97%
Métricas y config crudas (metadata.json)extra_exit_type atr_z_spike folds_wr [52.02, 51.22, 54.29, 50.33] Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r191_v5_extended_exits.pyExperimento: R191: V5 V115_cmp + 6 extended exit conditions
Origen: outputs/round_191_v5_extended_exits/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R148 | (unnamed)OPTIMISTIC-EXEC | L | 1,331% | 575% | -169.8 | 2/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)tau 0.5 trades_total 146 skip_pct 96.44509374239104 avg_mdd 24.630217400457944 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r148_meta_label.pyExperimento: R148: meta-labeling V66 + R134 P(v66_zone) filter
Origen: outputs/round_148_metalabel/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R269 | regimes 3->1 (lateral-all) | L | 964% | — | -147.1 | —/4 | 319 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=319 · WR=—
Métricas y config crudas (metadata.json)delta_min_alpha -413.0 bh_beats 2 verdict LOAD-BEARING Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r269_cascade_ablation.pyExperimento: R269 F3 cascade leave-one-rule-out ablation
Origen: outputs/round_269_cascade_ablation/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.05 reenter | L | 814% | 360% | -173.7 | 2/4 | 234 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=234 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.005 thresholds {"nb": 0.35, "nl": 0.43, "nr": 0.36} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.10 reenter | L | 414% | 221% | -205.8 | 2/4 | 144 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=144 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.0 thresholds {"nb": 0.4, "nl": 0.48, "nr": 0.41000000000000003} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.10 reenter | L | 286% | 177% | -212.2 | 2/4 | 144 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=144 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.001 thresholds {"nb": 0.4, "nl": 0.48, "nr": 0.41000000000000003} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.15 reenter | L | 227% | 145% | -219.2 | 2/4 | 77 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=77 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.0 thresholds {"nb": 0.44999999999999996, "nl": 0.53, "nr": 0.459999999... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.15 reenter | L | 180% | 124% | -220.8 | 2/4 | 77 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=77 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.001 thresholds {"nb": 0.44999999999999996, "nl": 0.53, "nr": 0.459999999... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R176 | R176: V66 backtest with R175 Transformer checkpoints (bug-fi | L | 92% | — | -223.9 | 0/4 | 243 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=243 · WR=—
Métricas y config crudas (metadata.json)folds_trades [51, 136, 49, 7] total_wins 114 v66_bugfix_baseline {"compound": 42636, "min_alpha": 193} beats_v66 False elapsed_min 42.88139955202738 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura Transformer encoder 4 layers × d_model=64 × 8 heads × FFN=128 (155K params). Inputs same as GRU, output 3-class. NEW arch. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam 1e-4, GELU, 5 seeds, same data + events + labeling as default. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Transformer outputs fed into V66 cascade. FAILED: distribution mismatch (P(TP) p50=0.18 vs GRU 0.30) breaks thresholds. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r176_transformer_eval.pyExperimento: R176: V66 backtest with R175 Transformer checkpoints (bug-fixed engine)
Origen: outputs/round_176_transformer_eval/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.20 reenter | L | 36% | 34% | -228.8 | 0/4 | 26 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=26 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.0 thresholds {"nb": 0.5, "nl": 0.5800000000000001, "nr": 0.51} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.15 reenter | L | 30% | 33% | -227.0 | 0/4 | 77 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=77 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.005 thresholds {"nb": 0.44999999999999996, "nl": 0.53, "nr": 0.459999999... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.20 reenter | L | 29% | 29% | -229.0 | 0/4 | 26 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=26 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.001 thresholds {"nb": 0.5, "nl": 0.5800000000000001, "nr": 0.51} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.10 reenter | L | 11% | 19% | -234.7 | 1/4 | 145 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=145 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.005 thresholds {"nb": 0.4, "nl": 0.48, "nr": 0.41000000000000003} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R197 | +0.20 reenter | L | 8% | 10% | -229.8 | 0/4 | 26 | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=26 · WR=—
Métricas y config crudas (metadata.json)slip_extra 0.005 thresholds {"nb": 0.5, "nl": 0.5800000000000001, "nr": 0.51} Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r197_v5_high_confidence.pyExperimento: R197: V5 with higher reenter thresholds × slippage stress
Origen: outputs/round_197_v5_high_confidence/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R158 | R157 P(SL)>0.60, exit P(TP)>0.30, sl=8%OPTIMISTIC-EXEC | L | -12% | 80% | -307.2 | 2/4 | 1,540 sh | 45.8% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=1540 · WR=45.845186538028486%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier k_up=15, k_dn=5 (longer up barrier, much tighter down) Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r158_dual_r157.pyExperimento: R158: V66 canonical longs + R157 short-trained shorts
Origen: outputs/round_158_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R169 | R169: V66 backtest with R168 MTF-trained checkpointsOPTIMISTIC-EXEC | L | -56% | — | -222.2 | 0/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)folds_trades [1, 85, 41, 46] r136_baseline {"compound": 70576, "min_alpha": 245, "folds_alpha": [378... improves_vs_r136 False verdict FAIL — MTF doesn't help elapsed_min 7.2285001397132875 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r169_mtf_eval.pyExperimento: R169: V66 backtest with R168 MTF-trained checkpoints
Origen: outputs/round_169_mtf_eval/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R158 | R157 P(SL)>0.55, exit P(TP)>0.35, sl=8%OPTIMISTIC-EXEC | L | -96% | -96% | -303.8 | 1/4 | 900 sh | 47.5% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=900 · WR=47.514101503072084%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier k_up=15, k_dn=5 (longer up barrier, much tighter down) Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r158_dual_r157.pyExperimento: R158: V66 canonical longs + R157 short-trained shorts
Origen: outputs/round_158_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R158 | R157 P(SL)>0.50, exit P(TP)>0.40, sl=8%OPTIMISTIC-EXEC | L | -99% | -260% | -305.4 | 0/4 | 667 sh | 44.5% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=667 · WR=44.51303463530242%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier k_up=15, k_dn=5 (longer up barrier, much tighter down) Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r158_dual_r157.pyExperimento: R158: V66 canonical longs + R157 short-trained shorts
Origen: outputs/round_158_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R158 | R157 P(SL)>0.50, exit P(TP)>0.40, sl=10%OPTIMISTIC-EXEC | L | -100% | -280% | -311.6 | 0/4 | 638 sh | 44.6% | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=638 · WR=44.618133638296385%
Métricas y config crudas (metadata.json)No extra config — Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2x128 5-seed RE-TRAINED with short-specific tb3 labeling (k_up=7, k_dn=10) — asymmetric for catching drops faster. Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier k_up=15, k_dn=5 (longer up barrier, much tighter down) Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r158_dual_r157.pyExperimento: R158: V66 canonical longs + R157 short-trained shorts
Origen: outputs/round_158_dual_model/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R135 | Production-grade bar-by-bar portfolio simulatorOPTIMISTIC-EXEC | P | — | — | -227.7 | —/4 | — | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)round 135 method V66 GRU 5-seed inference + uniform-exit + cooldown logic,... completed_at 2026-05-26T13:19:04.568384+00:00 elapsed_min 1.42 v66_compound 43.51348400339998 macd_compound -89.1549372176 portfolio_compound -60.1537811512 fold_summary [{"fold": 0, "fold_name": "F0_Bear", "n_v66_trades": 30, ... portfolio_results [{"fold": 0, "fold_name": "F0_Bear", "method": "fixed 25/... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r135.pyExperimento: Production-grade bar-by-bar portfolio simulator
Origen: outputs/round_135/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R159 | V66 canonicalOOTOPTIMISTIC-EXEC | L | — | — | — | 1/4 | 302 | 56.0% | +11.4% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.96%
Métricas y config crudas (metadata.json)pnl -7.554368963751494 alpha 11.43278473470329 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r159_oot_2026.pyExperimento: R159: 2026 OOT validation
Origen: outputs/round_159_oot_2026/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R159 | R151-AOOTOPTIMISTIC-EXEC | L+S | — | — | — | 1/4 | 2 sh | — | +13.8% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=2 · WR=—
Métricas y config crudas (metadata.json)pnl -5.227596461050816 alpha 13.759557237403968 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r159_oot_2026.pyExperimento: R159: 2026 OOT validation
Origen: outputs/round_159_oot_2026/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R159 | R151-BOOTOPTIMISTIC-EXEC | L+S | — | — | — | 1/4 | 389 | 55.0% | +11.4% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)pnl -7.554368963751494 alpha 11.43278473470329 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r159_oot_2026.pyExperimento: R159: 2026 OOT validation
Origen: outputs/round_159_oot_2026/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R159 | R154OOTOPTIMISTIC-EXEC | L | — | — | — | 1/4 | 2 sh | — | +13.8% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=2 · WR=—
Métricas y config crudas (metadata.json)pnl -5.227596461050816 alpha 13.759557237403968 shorts_skipped 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r159_oot_2026.pyExperimento: R159: 2026 OOT validation
Origen: outputs/round_159_oot_2026/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R165 | V66 canonicalOOTOPTIMISTIC-EXEC | L | — | — | — | 1/4 | 302 | 56.0% | +11.4% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.96%
Métricas y config crudas (metadata.json)pnl -7.55436896375144 alpha 11.432784734703343 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r165_oot_pyramid.pyExperimento: R165: 2026 OOT for R163 pyramid variants + comparisons
Origen: outputs/round_165_oot_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R165 | R163 pyramidOOTOPTIMISTIC-EXEC | L+ | — | — | — | 1/4 | — | — | +60.3% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 41.30449568804348 alpha 60.291649386498264 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r165_oot_pyramid.pyExperimento: R165: 2026 OOT for R163 pyramid variants + comparisons
Origen: outputs/round_165_oot_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R165 | R163 +5%/+30%/1.3x/12hOOTOPTIMISTIC-EXEC | L | — | — | — | 1/4 | — | — | +41.1% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 22.099480702744838 alpha 41.08663440119962 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r165_oot_pyramid.pyExperimento: R165: 2026 OOT for R163 pyramid variants + comparisons
Origen: outputs/round_165_oot_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R165 | R163 +15%/+50%/1.5x/48hOOTOPTIMISTIC-EXEC | L | — | — | — | 1/4 | — | — | +11.4% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl -7.55436896375144 alpha 11.432784734703343 pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r165_oot_pyramid.pyExperimento: R165: 2026 OOT for R163 pyramid variants + comparisons
Origen: outputs/round_165_oot_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R165 | R163 +20%/+100%/2.0x/48hOOTOPTIMISTIC-EXEC | L | — | — | — | 1/4 | — | — | +11.4% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl -7.55436896375144 alpha 11.432784734703343 pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r165_oot_pyramid.pyExperimento: R165: 2026 OOT for R163 pyramid variants + comparisons
Origen: outputs/round_165_oot_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R165 | R151-A shortsOOTOPTIMISTIC-EXEC | L+S | — | — | — | 1/4 | 2 sh | — | +13.8% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=2 · WR=—
Métricas y config crudas (metadata.json)pnl -5.227596461050816 alpha 13.759557237403968 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r165_oot_pyramid.pyExperimento: R165: 2026 OOT for R163 pyramid variants + comparisons
Origen: outputs/round_165_oot_pyramid/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R171 | V66 canonicalOOTOPTIMISTIC-EXEC | L | — | — | — | —/4 | 302 | 56.0% | +11.4% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.96%
Métricas y config crudas (metadata.json)pnl -7.55436896375144 alpha 11.432784734703343 pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r171_oot_new_champ.pyExperimento: R171: OOT 2026 for R170 sweep winners
Origen: outputs/round_171_oot_new_champ/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R171 | R163 baseline (0.10/0.50/1.5x/24h)OOTOPTIMISTIC-EXEC | L | — | — | — | —/4 | — | — | +60.3% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 41.30449568804348 alpha 60.291649386498264 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r171_oot_new_champ.pyExperimento: R171: OOT 2026 for R170 sweep winners
Origen: outputs/round_171_oot_new_champ/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R171 | R170-A (0.05/0.50/1.5x/24h) ★OOTOPTIMISTIC-EXEC | L | — | — | — | —/4 | — | — | +60.9% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 41.90008113313115 alpha 60.887234831585936 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r171_oot_new_champ.pyExperimento: R171: OOT 2026 for R170 sweep winners
Origen: outputs/round_171_oot_new_champ/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R171 | R170-B (0.12/0.65/1.75x/24h)OOTOPTIMISTIC-EXEC | L | — | — | — | —/4 | — | — | +71.9% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 52.95842635339719 alpha 71.94558005185198 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r171_oot_new_champ.pyExperimento: R171: OOT 2026 for R170 sweep winners
Origen: outputs/round_171_oot_new_champ/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R171 | R170-C (0.10/0.50/1.75x/24h)OOTOPTIMISTIC-EXEC | L | — | — | — | —/4 | — | — | +60.3% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 41.30449568804348 alpha 60.291649386498264 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r171_oot_new_champ.pyExperimento: R171: OOT 2026 for R170 sweep winners
Origen: outputs/round_171_oot_new_champ/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R171 | R170-D (0.10/0.25/1.5x/24h)OOTOPTIMISTIC-EXEC | L | — | — | — | —/4 | — | — | +59.1% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 40.11172246397922 alpha 59.098876162434 pyramid_adds 2 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r171_oot_new_champ.pyExperimento: R171: OOT 2026 for R170 sweep winners
Origen: outputs/round_171_oot_new_champ/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R171 | R170-E (0.08/0.50/1.5x/24h)OOTOPTIMISTIC-EXEC | L | — | — | — | —/4 | — | — | +60.9% | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 41.90794090857351 alpha 60.89509460702829 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r171_oot_new_champ.pyExperimento: R171: OOT 2026 for R170 sweep winners
Origen: outputs/round_171_oot_new_champ/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R172 | R172: R170-B with full instrumentation per foldOPTIMISTIC-EXEC | L | — | — | +415.5 | 4/4 | 301 | — | — | |||||||||||||||||||||||||||||||
|
⚠️ BUGGY-ENGINE — Esta ronda es pre-R173 (engine con bug intra-bar lookahead). El compound está inflado vs realidad de producción. Para R151-A, la versión bug-fixed honesta es R174 (+113,981%). Por eso los buggy aparecen arriba pero los candidatos reales son los R173+.
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=301 · WR=—
Métricas y config crudas (metadata.json)config {"trigger": 0.12, "add_size": 0.65, "max_lev": 1.75, "min... compound_total 257753.52085323367 simple_sum_total 759.4234047223401 total_wins 166 avg_wr_unweighted 55.42761418999043 elapsed_min 5.9215695063273115 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento (Instrumented re-run of R170-B for audit. Per-trade logs revealed phantom adds → trigger for R173.) Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r172_instrumented.pyExperimento: R172: R170-B with full instrumentation per fold
Origen: outputs/round_172_instrumented/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R177 | V66 alone bugfixOOT | L | — | — | — | 1/4 | 10 | 56.0% | +12.4% | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=10 · WR=55.96%
Métricas y config crudas (metadata.json)pnl -6.620420847287624 alpha 12.366732851167159 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward OOT 2026: full hold-out (2026-01-01 to 2026-03-23). NO training on this period. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r177_oot_r151_bugfix.pyExperimento: R177: OOT 2026 R151-A under bug-fixed engine
Origen: outputs/round_177_oot_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R177 | R151-A shorts full notional (bugfix)OOT | L+S | — | — | — | 1/4 | 2 sh | — | +15.3% | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=2 · WR=—
Métricas y config crudas (metadata.json)pnl -3.685996882913823 alpha 15.30115681554096 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward OOT 2026: full hold-out (2026-01-01 to 2026-03-23). NO training on this period. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r177_oot_r151_bugfix.pyExperimento: R177: OOT 2026 R151-A under bug-fixed engine
Origen: outputs/round_177_oot_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R177 | R151-A half-Kelly (bugfix)OOT | L+S | — | — | — | 1/4 | 389 | 55.0% | +11.5% | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)pnl -7.50420184892284 alpha 11.482951849531943 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward OOT 2026: full hold-out (2026-01-01 to 2026-03-23). NO training on this period. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r177_oot_r151_bugfix.pyExperimento: R177: OOT 2026 R151-A under bug-fixed engine
Origen: outputs/round_177_oot_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R177 | R151-B conservative (bugfix)OOT | L+S | — | — | — | 1/4 | 389 | 55.0% | +12.4% | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=389 · WR=55.01%
Métricas y config crudas (metadata.json)pnl -6.620420847287624 alpha 12.366732851167159 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R151-A (V66 longs + shorts in V66 cash gaps) under bug-fixed engine. Honest re-validation of R151 family. Walk-forward OOT 2026: full hold-out (2026-01-01 to 2026-03-23). NO training on this period. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r177_oot_r151_bugfix.pyExperimento: R177: OOT 2026 R151-A under bug-fixed engine
Origen: outputs/round_177_oot_r151_bugfix/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V15 aggressive tgt=4.0% clip[0.5,2.0] | L | — | — | — | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.04 min_lev 0.5 max_lev 2.0 stress_results [{"slip_extra_bps": 0.0, "compound": 8835064.631182425, "... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217b: V15 and V17 slip stress test
Origen: outputs/round_217b_v15_v17_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R217 | V17 narrow band tgt=2.5% clip[0.8,1.4] | L | — | — | — | —/4 | — | — | — | |||||||||||||||||||||||||||||||
Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)target_vol 0.025 min_lev 0.8 max_lev 1.4 stress_results [{"slip_extra_bps": 0.0, "compound": 609749.3311637345, "... Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 cascade: entry on regime-specific thresholds (bull/lateral/bear via 20d slope) → exit en cascada (init_sl 10% OR trail ratchet 22→18→5% según unrealized OR DRSI>78 OR 3/5 GRUs danger (P(SL)>0.70 o P(TP)<exit_th) OR peak_drop del avg_tp_bar desde su pico) → cooldown 4 bars post-cualquier-exit + 48 adicionales si fue loss Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r217_volkelly_variants_sweep.pyExperimento: R217b: V15 and V17 slip stress test
Origen: outputs/round_217b_v15_v17_stress/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R166 | COMBINED R163 + R151-APHANTOM | L+S | 454,068% | 3,221% | +287.2 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)pyramid_adds 2 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r166_combined.pyExperimento: R166: combined R163 pyramid + R151-A shorts (stacking test)
Origen: outputs/round_166_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.50 · lev=1.75x · hold=24hPHANTOM | L+ | 269,825% | 2,560% | +372.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.5 max_lev 1.75 min_hold 24 total_adds 4 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.12 · add=0.65 · lev=1.75x · hold=24hPHANTOM | L+ | 257,754% | 2,522% | +415.5 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 83.5% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.12 add_size 0.65 max_lev 1.75 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.25 · lev=1.50x · hold=24hPHANTOM | L+ | 231,575% | 2,438% | +371.1 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.25 max_lev 1.5 min_hold 24 total_adds 7 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.05 · add=0.50 · lev=1.50x · hold=24hPHANTOM | L+ | 228,349% | 2,410% | +430.4 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 81.3% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.05 add_size 0.5 max_lev 1.5 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.08 · add=0.40 · lev=1.50x · hold=24hPHANTOM | L+ | 226,896% | 2,441% | +346.6 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.08 add_size 0.4 max_lev 1.5 min_hold 24 total_adds 4 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R163 | pyramid +20% / +100% / 2.0x / 48hPHANTOM | L+ | 219,361% | 2,410% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)total_pyramid_adds 2 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 + PYRAMIDING longs: cuando price > entry*(1+trigger) (e.g., +10%), add size_frac of remaining cap; up to max_leverage. ⚠️ INTRA-BAR LOOKAHEAD BUG in entry sequencing — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r163_pyramiding.pyExperimento: R163: Pyramiding × always-invested V66
Origen: outputs/round_163_pyramiding/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R166 | R151-A shorts only (P(SL)>0.65)PHANTOM | L+S | 212,591% | 2,505% | +245.1 | 4/4 | 93 sh | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=93 · WR=—
Métricas y config crudas (metadata.json)pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r166_combined.pyExperimento: R166: combined R163 pyramid + R151-A shorts (stacking test)
Origen: outputs/round_166_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.08 · add=0.50 · lev=1.50x · hold=24hPHANTOM | L+ | 204,690% | 2,353% | +377.5 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.08 add_size 0.5 max_lev 1.5 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.08 · add=0.50 · lev=1.50x · hold=24hPHANTOM | L+ | 204,690% | 2,353% | +377.5 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.08 add_size 0.5 max_lev 1.5 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R163 | pyramid +10% / +50% / 1.5x / 24hPHANTOM | L+ | 198,893% | 2,333% | +372.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)total_pyramid_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 + PYRAMIDING longs: cuando price > entry*(1+trigger) (e.g., +10%), add size_frac of remaining cap; up to max_leverage. ⚠️ INTRA-BAR LOOKAHEAD BUG in entry sequencing — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r163_pyramiding.pyExperimento: R163: Pyramiding × always-invested V66
Origen: outputs/round_163_pyramiding/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R166 | R163 pyramid only (+10/+50/1.5x/24h)PHANTOM | L+ | 198,893% | 2,333% | +372.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pyramid_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r166_combined.pyExperimento: R166: combined R163 pyramid + R151-A shorts (stacking test)
Origen: outputs/round_166_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.50 · lev=1.50x · hold=24hPHANTOM | L+ | 198,893% | 2,333% | +372.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.5 max_lev 1.5 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.50 · lev=1.50x · hold=12hPHANTOM | L+ | 198,893% | 2,333% | +372.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.5 max_lev 1.5 min_hold 12 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.50 · lev=1.50x · hold=48hPHANTOM | L+ | 198,893% | 2,333% | +372.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.5 max_lev 1.5 min_hold 48 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.12 · add=0.50 · lev=1.50x · hold=24hPHANTOM | L+ | 196,935% | 2,326% | +371.0 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 83.5% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.12 add_size 0.5 max_lev 1.5 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R163 | pyramid +15% / +50% / 1.5x / 48hPHANTOM | L+ | 191,642% | 2,307% | +366.3 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)total_pyramid_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 + PYRAMIDING longs: cuando price > entry*(1+trigger) (e.g., +10%), add size_frac of remaining cap; up to max_leverage. ⚠️ INTRA-BAR LOOKAHEAD BUG in entry sequencing — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r163_pyramiding.pyExperimento: R163: Pyramiding × always-invested V66
Origen: outputs/round_163_pyramiding/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.15 · add=0.50 · lev=1.50x · hold=24hPHANTOM | L+ | 191,642% | 2,307% | +366.3 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.15 add_size 0.5 max_lev 1.5 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.40 · lev=1.50x · hold=24hPHANTOM | L+ | 163,654% | 2,201% | +342.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.4 max_lev 1.5 min_hold 24 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.15 · add=0.40 · lev=1.50x · hold=48hPHANTOM | L+ | 158,495% | 2,180% | +337.5 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.15 add_size 0.4 max_lev 1.5 min_hold 48 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R163 | pyramid +5% / +30% / 1.3x / 12hPHANTOM | L+ | 150,563% | 2,129% | +360.4 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)total_pyramid_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 + PYRAMIDING longs: cuando price > entry*(1+trigger) (e.g., +10%), add size_frac of remaining cap; up to max_leverage. ⚠️ INTRA-BAR LOOKAHEAD BUG in entry sequencing — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r163_pyramiding.pyExperimento: R163: Pyramiding × always-invested V66
Origen: outputs/round_163_pyramiding/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.05 · add=0.30 · lev=1.30x · hold=12hPHANTOM | L+ | 150,563% | 2,129% | +360.4 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 81.3% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.05 add_size 0.3 max_lev 1.3 min_hold 12 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.15 · add=0.30 · lev=1.30x · hold=48hPHANTOM | L+ | 129,452% | 2,053% | +308.7 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.15 add_size 0.3 max_lev 1.3 min_hold 48 total_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R163 | pyramid +10% / +25% / 1.25x / 24hPHANTOM | L+ | 119,050% | 2,003% | +297.8 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)total_pyramid_adds 3 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 + PYRAMIDING longs: cuando price > entry*(1+trigger) (e.g., +10%), add size_frac of remaining cap; up to max_leverage. ⚠️ INTRA-BAR LOOKAHEAD BUG in entry sequencing — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r163_pyramiding.pyExperimento: R163: Pyramiding × always-invested V66
Origen: outputs/round_163_pyramiding/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R163 | canonical V66 (no pyramid)PHANTOM | L | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)total_pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida V66 + PYRAMIDING longs: cuando price > entry*(1+trigger) (e.g., +10%), add size_frac of remaining cap; up to max_leverage. ⚠️ INTRA-BAR LOOKAHEAD BUG in entry sequencing — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r163_pyramiding.pyExperimento: R163: Pyramiding × always-invested V66
Origen: outputs/round_163_pyramiding/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R166 | canonical V66PHANTOM | L | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r166_combined.pyExperimento: R166: combined R163 pyramid + R151-A shorts (stacking test)
Origen: outputs/round_166_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.65 · lev=1.50x · hold=24hPHANTOM | L+ | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.65 max_lev 1.5 min_hold 24 total_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.80 · lev=1.50x · hold=24hPHANTOM | L+ | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.8 max_lev 1.5 min_hold 24 total_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.50 · lev=1.25x · hold=24hPHANTOM | L+ | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.5 max_lev 1.25 min_hold 24 total_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.05 · add=0.40 · lev=1.30x · hold=12hPHANTOM | L+ | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 81.3% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.05 add_size 0.4 max_lev 1.3 min_hold 12 total_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R170 | trig=0.10 · add=0.80 · lev=1.75x · hold=24hPHANTOM | L+ | 70,576% | 1,707% | +239.2 | 4/4 | — | — | — | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: bajo bug-fixed engine = +42,636% (= V66 baseline, 78.6% del alpha original era phantom). → ver R184 Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)trigger 0.1 add_size 0.8 max_lev 1.75 min_hold 24 total_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida Dense sweep over R163 pyramid params (trigger/add_size/max_lev/min_hold). ⚠️ Same intra-bar bug. ALL 20 variants INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r170_pyramid_sweep.pyExperimento: R170: dense pyramid sweep around R163 winner
Origen: outputs/round_170_pyramid_sweep/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R167 | V66 canonicalPHANTOMOOT | L | — | — | — | 1/4 | 302 | 56.0% | +11.4% | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=302 · WR=55.96%
Métricas y config crudas (metadata.json)pnl -7.55436896375144 alpha 11.432784734703343 pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r167_oot_combined.pyExperimento: R167: OOT 2026 for COMBINED + comparison
Origen: outputs/round_167_oot_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R167 | R163 pyramid onlyPHANTOMOOT | L+ | — | — | — | 1/4 | — | — | +60.3% | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=— · WR=—
Métricas y config crudas (metadata.json)pnl 41.30449568804348 alpha 60.291649386498264 pyramid_adds 1 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r167_oot_combined.pyExperimento: R167: OOT 2026 for COMBINED + comparison
Origen: outputs/round_167_oot_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R167 | R151-A shorts onlyPHANTOMOOT | L+S | — | — | — | 1/4 | 2 sh | — | +13.8% | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=2 · WR=—
Métricas y config crudas (metadata.json)pnl -5.2275964610507435 alpha 13.759557237404039 pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r167_oot_combined.pyExperimento: R167: OOT 2026 for COMBINED + comparison
Origen: outputs/round_167_oot_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||
| R167 | COMBINED R163+R151-APHANTOMOOT | L+S | — | — | — | 1/4 | 2 sh | — | +13.8% | |||||||||||||||||||||||||||||||
|
🚨 PHANTOM — Esta estrategia fue invalidada por la auditoría R173 (intra-bar lookahead + apalancamiento sin coste). El compound mostrado es 100% artefacto del engine bug.
R184 empirical re-exec: toda la familia pyramid colapsa a V66 baseline (+42,636%) bajo bug-fixed engine. Audit empíricamente validado. Performance por fold
Trades/WR por fold solo disponibles cuando metadata.json los registra (R180+). Totales: trades=2 · WR=—
Métricas y config crudas (metadata.json)pnl -5.2275964610507435 alpha 13.759557237404039 pyramid_adds 0 Reproducción (cómo replicar este modelo)Datos fuente BTC/USD 5min OHLCV (Kaiko, 2017→2026, ~970K bars) en data/btcusd_5min.csv.gz Timeframes Base: resample 5min → 15min OHLCV (~325K bars). Slope/DRSI features derivados de close diario via resample('1D'). No multi-timeframe HTF mixing (cerrado en R168/R175 por failure y ahora bajo regla anti-lookahead). Construcción de secuencias Lookback = 300 EVENT-bars (no time-bars). Cada secuencia incluye los 300 últimos eventos antes del bar de decisión. Construida por src/data/splitter.py::create_event_sequences(). Cualquier feature que requiera datos posteriores al close[i] está PROHIBIDA. Normalización Per-sequence min-max. Grupos compartidos: PRICE (open/high/low/close + ema_9/21/50 + bb_upper/lower/mid + vwap_20) normalizado en bloque; VOLUME (volume_sma_20, obv, obv_sma_20) en bloque; resto (oscilladores RSI/MACD, ratios, returns, ATR_pct) cada uno individual. Definido en src/data/features.py::NORM_GROUPS_BASE + get_norm_group_indices(). Arquitectura GRU 2 layers × 128 hidden × 5-seed ensemble (checkpoints en outputs/round_069). Input: (batch, 300, n_features) → GRU → dropout 0.2 → FC → 3 logits (softmax externally). Indicadores / features RSI(14), MACD(12,26,9), Bollinger(20,2σ) + %B, ATR_14_pct (vol normalization), EMAs(9,21,50), VWAP_20, daily SMA20+pct_change5 slope, DRSI(28) daily (con shift(1) anti-leak), avg_tp_bar, OBV + OBV_SMA20, plus 30+ rolling stats (returns, vol, momentum) generados en src/data/features.py::add_all_features() Entrenamiento Adam lr=1e-3, 50 epochs con early-stop on val_loss (patience=10), batch=64, dropout=0.2. 5-seed ensemble: seeds 17/29/41/53/67. Loss: CrossEntropyLoss para 3-class. Val split: 10% del train fold. Filtro de eventos Volatility event filter: bar marcado como evento si (ATR_14 > atr_mult × median_ATR_50) AND |return_5_bar| > percentile_90. atr_mult=2.0, return_percentile=90 → ~10.5% de bars seleccionados. Calibrado en R141/R142 — modificar este % rompe V66 thresholds. Labeling Triple-barrier method (López de Prado): k_up=10 × ATR_14_pct (upper barrier), k_dn=7 × ATR_14_pct (lower barrier), max_hold=64 bars (vertical barrier). Label ∈ {-1 SL, 0 timeout, 1 TP} → 3-class output. Definido en src/data/labeling.py::apply_labeling(method='tb_vol_10_7'). Entrada / salida R163 pyramid + R151-A shorts combined. ⚠️ Combined two bugs — INVALIDATED. Walk-forward Walk-forward 4 folds chronológicos: F0 Bear (2018), F1 Bull (2019-2021), F2 Recovery (2022-2024), F3 Lateral (2024-2025). val_pct=10% del train por fold. Sin purging — la separación cronológica train|val|test es estricta. Patrón de ejecución 🚨 Bug-fixed engine (R173+): detect@close[i] → execute@open[i+1]. Pre-R173 ejecutaba en mismo bar = intra-bar lookahead bug. Comisiones 0.04% + slippage 0.01% en cada trade leg, sin excepción. Script fuente scripts/run_r167_oot_combined.pyExperimento: R167: OOT 2026 for COMBINED + comparison
Origen: outputs/round_167_oot_combined/metadata.json · → ver detalle de la ronda |
||||||||||||||||||||||||||||||||||||||||