branch fix/capital-reconcile-all-bots commit 6ee796d built last · auto: refresh dashboard data (2026-07-03 06:20)
🟢 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.
250 estrategias
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

FoldPnLαBHTradesWR
F0 Bear (2018)1,154.4%+1,097.7%104%
F1 Bull (2019-21)2,566.9%+2,468.9%1162%
F2 Recovery (2022-24)2,554.9%+2,320.5%234%
F3 Lateral (2024-25)930.4%+924.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)1,163.5%+1,106.8%104%65
F1 Bull (2019-21)2,522.3%+2,424.3%1162%103
F2 Recovery (2022-24)2,501.5%+2,267.1%234%58
F3 Lateral (2024-25)925.0%+919.2%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)932.1%+875.4%104%
F1 Bull (2019-21)1,932.6%+1,834.6%1162%
F2 Recovery (2022-24)1,781.5%+1,547.1%234%
F3 Lateral (2024-25)718.0%+712.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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
Experimento:
Origen: outputs/round_255_vol_estimators/metadata.json · → ver detalle de la ronda
R255 (unnamed) L 1,031,495% +533.5 —/4

Performance por fold

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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
Experimento:
Origen: outputs/round_255_vol_estimators/metadata.json · → ver detalle de la ronda
R195 V5 V115_cmp leverage=1.5x L 1,031,237% 3,868% +533.5 4/4

Performance por fold

FoldPnLαBHTradesWR
F0 Bear (2018)723.8%+667.1%104%
F1 Bull (2019-21)1,393.0%+1,295.0%1162%
F2 Recovery (2022-24)1,211.7%+977.3%234%
F3 Lateral (2024-25)539.3%+533.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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
Experimento:
Origen: outputs/round_255_vol_estimators/metadata.json · → ver detalle de la ronda
R204 R204 HONEST tgt=3.0% clip[0.5,1.5] L 1,001,557% 3,828% +531.0 —/4

Performance por fold

FoldPnLαBHTradesWR
F0 Bear (2018)726.5%+669.8%104%65
F1 Bull (2019-21)1,373.8%+1,275.8%1162%103
F2 Recovery (2022-24)1,191.4%+957.0%234%58
F3 Lateral (2024-25)536.8%+531.0%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)726.5%+669.8%104%65
F1 Bull (2019-21)1,373.8%+1,275.8%1162%103
F2 Recovery (2022-24)1,191.4%+957.0%234%58
F3 Lateral (2024-25)536.8%+531.0%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)726.5%+669.8%104%65
F1 Bull (2019-21)1,373.8%+1,275.8%1162%103
F2 Recovery (2022-24)1,191.4%+957.0%234%58
F3 Lateral (2024-25)536.8%+531.0%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)726.5%+622.5%104%
F1 Bull (2019-21)1,373.8%+211.8%1162%
F2 Recovery (2022-24)1,191.4%+957.4%234%
F3 Lateral (2024-25)536.8%+536.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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
Experimento:
Origen: outputs/round_255_vol_estimators/metadata.json · → ver detalle de la ronda
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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)727.6%+670.9%104%65
F1 Bull (2019-21)1,361.1%+1,263.1%1162%103
F2 Recovery (2022-24)1,177.8%+943.4%234%58
F3 Lateral (2024-25)535.1%+529.3%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)727.6%+670.9%104%
F1 Bull (2019-21)1,361.1%+1,263.1%1162%
F2 Recovery (2022-24)1,177.8%+943.4%234%
F3 Lateral (2024-25)535.1%+529.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)707.3%+603.3%104%
F1 Bull (2019-21)1,332.7%+170.7%1162%
F2 Recovery (2022-24)1,161.9%+927.9%234%
F3 Lateral (2024-25)521.2%+521.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)1,339.1%+1,282.4%104%
F1 Bull (2019-21)2,080.9%+1,982.9%1162%
F2 Recovery (2022-24)891.5%+657.1%234%
F3 Lateral (2024-25)177.0%+171.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)686.7%+582.7%104%
F1 Bull (2019-21)1,288.8%+126.8%1162%
F2 Recovery (2022-24)1,130.4%+896.4%234%
F3 Lateral (2024-25)504.6%+504.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)647.6%+590.9%104%
F1 Bull (2019-21)1,194.6%+1,096.6%1162%
F2 Recovery (2022-24)1,018.2%+783.8%234%
F3 Lateral (2024-25)475.2%+469.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)648.6%+591.9%104%65
F1 Bull (2019-21)1,183.4%+1,085.4%1162%103
F2 Recovery (2022-24)1,006.5%+772.1%234%58
F3 Lateral (2024-25)473.7%+467.9%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)648.6%+591.9%104%65
F1 Bull (2019-21)1,183.4%+1,085.4%1162%103
F2 Recovery (2022-24)1,006.5%+772.1%234%58
F3 Lateral (2024-25)473.7%+467.9%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)648.6%+591.9%104%
F1 Bull (2019-21)1,183.4%+1,085.4%1162%
F2 Recovery (2022-24)1,006.5%+772.1%234%
F3 Lateral (2024-25)473.6%+467.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)609.3%+505.3%104%
F1 Bull (2019-21)1,125.9%-36.1%1162%
F2 Recovery (2022-24)1,011.7%+777.7%234%
F3 Lateral (2024-25)442.3%+442.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)562.5%+458.5%104%
F1 Bull (2019-21)1,000.9%-161.1%1162%
F2 Recovery (2022-24)945.7%+711.7%234%
F3 Lateral (2024-25)401.5%+401.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)1,000.6%+943.9%104%
F1 Bull (2019-21)1,607.2%+1,509.2%1162%
F2 Recovery (2022-24)709.9%+475.5%234%
F3 Lateral (2024-25)116.4%+110.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)536.8%+480.1%104%
F1 Bull (2019-21)955.9%+857.9%1162%
F2 Recovery (2022-24)798.7%+564.3%234%
F3 Lateral (2024-25)391.6%+385.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)1,055.4%+951.4%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)496.8%+392.8%104%
F1 Bull (2019-21)870.8%-291.2%1162%
F2 Recovery (2022-24)844.0%+610.0%234%
F3 Lateral (2024-25)349.3%+349.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)981.5%+877.5%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)503.3%+446.6%104%
F1 Bull (2019-21)872.1%+774.1%1162%
F2 Recovery (2022-24)722.7%+488.3%234%
F3 Lateral (2024-25)364.3%+358.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)885.1%+781.1%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)880.5%+776.5%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)880.5%+776.5%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)880.5%+776.5%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)834.7%+730.7%104%
F1 Bull (2019-21)845.4%-316.6%1162%
F2 Recovery (2022-24)468.5%+234.5%234%
F3 Lateral (2024-25)282.2%+282.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)735.5%+631.5%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)+480.5%104%
F1 Bull (2019-21)+2,405.6%1162%
F2 Recovery (2022-24)-42.0%234%
F3 Lateral (2024-25)+270.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)+480.5%104%
F1 Bull (2019-21)+2,405.6%1162%
F2 Recovery (2022-24)-42.0%234%
F3 Lateral (2024-25)+270.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)697.3%+593.3%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)687.9%+583.9%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)789.7%+733.0%104%
F1 Bull (2019-21)1,383.7%+1,285.7%1162%
F2 Recovery (2022-24)600.4%+366.0%234%
F3 Lateral (2024-25)81.8%+76.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)749.5%+645.5%104%
F1 Bull (2019-21)831.3%-330.7%1162%
F2 Recovery (2022-24)447.2%+213.2%234%
F3 Lateral (2024-25)261.5%+261.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)812.6%+708.6%104%
F1 Bull (2019-21)738.9%-423.1%1162%
F2 Recovery (2022-24)432.7%+198.7%234%
F3 Lateral (2024-25)253.0%+253.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)423.8%+319.8%104%
F1 Bull (2019-21)730.0%-432.0%1162%
F2 Recovery (2022-24)730.7%+496.7%234%
F3 Lateral (2024-25)291.9%+291.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)698.2%+641.5%104%
F1 Bull (2019-21)853.9%+755.9%1162%
F2 Recovery (2022-24)428.2%+193.8%234%
F3 Lateral (2024-25)239.0%+233.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)770.0%+666.0%104%
F1 Bull (2019-21)732.6%-429.4%1162%
F2 Recovery (2022-24)422.6%+188.6%234%
F3 Lateral (2024-25)243.3%+243.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)206.6%+149.9%104%
F1 Bull (2019-21)926.7%+828.7%1162%
F2 Recovery (2022-24)785.2%+550.8%234%
F3 Lateral (2024-25)358.9%+353.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)630.2%+573.5%104%
F1 Bull (2019-21)853.9%+755.9%1162%
F2 Recovery (2022-24)428.2%+193.8%234%
F3 Lateral (2024-25)239.0%+233.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)575.3%+518.6%104%
F1 Bull (2019-21)853.9%+755.9%1162%
F2 Recovery (2022-24)428.2%+193.8%234%
F3 Lateral (2024-25)239.0%+233.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)384.7%+280.7%104%
F1 Bull (2019-21)629.5%-532.5%1162%
F2 Recovery (2022-24)657.3%+423.3%234%
F3 Lateral (2024-25)327.4%+327.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)567.9%+463.9%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)853.9%-308.1%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)428.2%+194.2%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)239.0%+239.0%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)567.9%+511.2%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)853.9%+755.9%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)428.2%+193.8%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)239.0%+233.2%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)567.9%+511.2%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)853.9%+755.9%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)428.2%+193.8%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)239.0%+233.2%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)567.9%+511.2%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)853.9%+755.9%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)428.2%+193.8%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)239.0%+233.2%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)567.9%+511.2%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)853.9%+755.9%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)428.2%+193.8%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)239.0%+233.2%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)723.0%+666.3%104%103 (L:62, S:41)53.4% (L:52%, S:56%)
F1 Bull (2019-21)1,005.8%+907.8%1162%109 (L:101, S:8)52.3% (L:50%, S:75%)
F2 Recovery (2022-24)429.6%+195.2%234%78 (L:58, S:20)56.4% (L:64%, S:35%)
F3 Lateral (2024-25)130.9%+125.1%0%104 (L:74, S:30)51.0% (L:51%, S:50%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)546.5%+489.8%104%
F1 Bull (2019-21)853.9%+755.9%1162%
F2 Recovery (2022-24)428.2%+193.8%234%
F3 Lateral (2024-25)239.0%+233.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)468.8%+412.1%104%
F1 Bull (2019-21)853.9%+755.9%1162%
F2 Recovery (2022-24)428.2%+193.8%234%
F3 Lateral (2024-25)239.0%+233.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)654.0%+550.0%104%
F1 Bull (2019-21)631.2%-530.8%1162%
F2 Recovery (2022-24)417.3%+183.3%234%
F3 Lateral (2024-25)215.1%+215.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)420.7%+364.0%104%
F1 Bull (2019-21)853.9%+755.9%1162%
F2 Recovery (2022-24)428.2%+193.8%234%
F3 Lateral (2024-25)239.0%+233.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)359.6%+255.6%104%
F1 Bull (2019-21)609.6%-552.4%1162%
F2 Recovery (2022-24)631.0%+397.0%234%
F3 Lateral (2024-25)241.7%+241.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)521.2%+464.5%104%
F1 Bull (2019-21)713.7%+615.7%1162%
F2 Recovery (2022-24)392.1%+157.7%234%
F3 Lateral (2024-25)213.4%+207.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)482.3%+378.3%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)732.8%-429.2%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)412.8%+178.8%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)209.5%+209.5%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)482.3%+425.6%104%
F1 Bull (2019-21)732.8%+634.8%1162%
F2 Recovery (2022-24)412.8%+178.4%234%
F3 Lateral (2024-25)209.5%+203.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)482.3%+425.6%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)732.8%+634.8%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)412.8%+178.4%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)209.5%+203.7%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%6650.0%
F1 Bull (2019-21)618.2%+520.2%1162%10349.5%
F2 Recovery (2022-24)504.6%+270.2%234%5964.4%
F3 Lateral (2024-25)271.7%+265.9%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%6650.0%
F1 Bull (2019-21)618.2%+520.2%1162%10349.5%
F2 Recovery (2022-24)504.6%+270.2%234%5964.4%
F3 Lateral (2024-25)271.7%+265.9%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%6650.0%
F1 Bull (2019-21)618.2%+520.2%1162%10349.5%
F2 Recovery (2022-24)504.6%+270.2%234%5964.4%
F3 Lateral (2024-25)271.7%+265.9%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%6650.0%
F1 Bull (2019-21)618.2%+520.2%1162%10349.5%
F2 Recovery (2022-24)504.6%+270.2%234%5964.4%
F3 Lateral (2024-25)271.7%+265.9%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%
F1 Bull (2019-21)618.2%+520.2%1162%
F2 Recovery (2022-24)504.6%+270.2%234%
F3 Lateral (2024-25)271.7%+265.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%
F1 Bull (2019-21)618.2%+520.2%1162%
F2 Recovery (2022-24)504.6%+270.2%234%
F3 Lateral (2024-25)271.7%+265.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%
F1 Bull (2019-21)618.2%+520.2%1162%
F2 Recovery (2022-24)504.6%+270.2%234%
F3 Lateral (2024-25)271.7%+265.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%
F1 Bull (2019-21)618.2%+520.2%1162%
F2 Recovery (2022-24)504.6%+270.2%234%
F3 Lateral (2024-25)271.7%+265.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%66
F1 Bull (2019-21)618.2%+520.2%1162%103
F2 Recovery (2022-24)504.6%+270.2%234%59
F3 Lateral (2024-25)271.7%+265.9%0%75
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%66
F1 Bull (2019-21)618.2%+520.2%1162%103
F2 Recovery (2022-24)504.6%+270.2%234%59
F3 Lateral (2024-25)271.7%+265.9%0%75
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)376.0%+319.3%104%65
F1 Bull (2019-21)618.2%+520.2%1162%103
F2 Recovery (2022-24)504.6%+270.2%234%58
F3 Lateral (2024-25)271.7%+265.9%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)466.6%+409.9%104%9957.6%
F1 Bull (2019-21)566.4%+468.4%1162%23952.7%
F2 Recovery (2022-24)444.4%+210.0%234%11256.2%
F3 Lateral (2024-25)256.5%+250.7%0%10356.3%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)498.7%+442.0%104%
F1 Bull (2019-21)695.8%+597.8%1162%
F2 Recovery (2022-24)389.0%+154.6%234%
F3 Lateral (2024-25)212.6%+206.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)348.1%+291.4%104%8145.7%
F1 Bull (2019-21)618.2%+520.2%1162%10349.5%
F2 Recovery (2022-24)504.6%+270.2%234%5964.4%
F3 Lateral (2024-25)271.7%+265.9%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)363.2%+306.5%104%
F1 Bull (2019-21)618.2%+520.2%1162%
F2 Recovery (2022-24)486.6%+252.2%234%
F3 Lateral (2024-25)270.2%+264.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)363.2%+306.5%104%
F1 Bull (2019-21)618.2%+520.2%1162%
F2 Recovery (2022-24)486.6%+252.2%234%
F3 Lateral (2024-25)270.2%+264.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)503.3%+446.6%104%
F1 Bull (2019-21)695.8%+597.8%1162%
F2 Recovery (2022-24)394.1%+159.7%234%
F3 Lateral (2024-25)204.1%+198.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)342.9%+286.2%104%6650.0%
F1 Bull (2019-21)624.7%+526.7%1162%10349.5%
F2 Recovery (2022-24)504.1%+269.7%234%5964.4%
F3 Lateral (2024-25)271.1%+265.3%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+378.4%104%
F1 Bull (2019-21)537.3%+439.3%1162%
F2 Recovery (2022-24)473.6%+239.2%234%
F3 Lateral (2024-25)261.3%+255.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+378.4%104%
F1 Bull (2019-21)537.3%+439.3%1162%
F2 Recovery (2022-24)473.6%+239.2%234%
F3 Lateral (2024-25)261.3%+255.5%0%
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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)537.3%-624.7%1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)473.6%+239.6%234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)261.3%+261.3%0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)432.3%+328.3%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)393.8%+337.1%104%7051.4%
F1 Bull (2019-21)528.7%+430.7%1162%10550.5%
F2 Recovery (2022-24)504.6%+270.2%234%5964.4%
F3 Lateral (2024-25)270.1%+264.3%0%7659.2%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)365.7%+309.0%104%
F1 Bull (2019-21)600.1%+502.1%1162%
F2 Recovery (2022-24)470.9%+236.5%234%
F3 Lateral (2024-25)241.1%+235.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)407.6%+350.9%104%
F1 Bull (2019-21)734.2%+636.2%1162%
F2 Recovery (2022-24)392.3%+157.9%234%
F3 Lateral (2024-25)201.9%+196.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)429.9%+373.2%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)670.9%+572.9%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)403.3%+168.9%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)194.9%+189.1%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)353.2%+296.5%104%
F1 Bull (2019-21)600.1%+502.1%1162%
F2 Recovery (2022-24)453.9%+219.5%234%
F3 Lateral (2024-25)239.7%+233.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)404.9%+348.2%104%12055.0%
F1 Bull (2019-21)488.1%+390.1%1162%23151.5%
F2 Recovery (2022-24)446.1%+211.7%234%14260.6%
F3 Lateral (2024-25)240.7%+234.9%0%10354.4%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)370.3%+313.6%104%8855.7%
F1 Bull (2019-21)482.0%+384.0%1162%14158.2%
F2 Recovery (2022-24)447.7%+213.3%234%9066.7%
F3 Lateral (2024-25)263.7%+257.9%0%8159.3%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)182.0%+78.0%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)616.7%-545.3%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)568.3%+334.3%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)301.1%+301.1%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)382.6%-779.4%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)301.7%+197.7%104%
F1 Bull (2019-21)534.0%-628.0%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)256.0%+152.0%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)541.5%+307.5%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)325.5%+221.5%104%
F1 Bull (2019-21)505.8%-656.2%1162%
F2 Recovery (2022-24)464.8%+230.8%234%
F3 Lateral (2024-25)236.8%+236.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)147.1%+90.4%104%65
F1 Bull (2019-21)677.7%+579.7%1162%103
F2 Recovery (2022-24)558.2%+323.8%234%58
F3 Lateral (2024-25)271.4%+265.6%0%74
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)225.0%+121.0%104%
F1 Bull (2019-21)545.0%-617.0%1162%
F2 Recovery (2022-24)469.4%+235.4%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)225.0%+121.0%104%
F1 Bull (2019-21)545.0%-617.0%1162%
F2 Recovery (2022-24)469.4%+235.4%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.0%+171.0%104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)525.2%-636.8%1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)427.2%+193.2%234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)245.8%+245.8%0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.0%+171.0%104%
F1 Bull (2019-21)525.2%-636.8%1162%
F2 Recovery (2022-24)427.2%+193.2%234%
F3 Lateral (2024-25)245.8%+245.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.0%+171.0%104%
F1 Bull (2019-21)525.2%-636.8%1162%
F2 Recovery (2022-24)427.2%+193.2%234%
F3 Lateral (2024-25)245.8%+245.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.0%+171.0%104%
F1 Bull (2019-21)525.2%-636.8%1162%
F2 Recovery (2022-24)427.2%+193.2%234%
F3 Lateral (2024-25)245.8%+245.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.0%+171.0%104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)525.2%-636.8%1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)427.2%+193.2%234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)245.8%+245.8%0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.0%+218.3%104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)525.2%+427.2%1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)427.2%+192.8%234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)245.8%+240.0%0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)317.6%+260.9%104%
F1 Bull (2019-21)443.0%+345.0%1162%
F2 Recovery (2022-24)437.8%+203.4%234%
F3 Lateral (2024-25)220.3%+214.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)279.1%+222.4%104%6650.0%
F1 Bull (2019-21)605.2%+507.2%1162%10349.5%
F2 Recovery (2022-24)334.4%+100.0%234%5964.4%
F3 Lateral (2024-25)223.3%+217.5%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)587.7%+531.0%104%4355.8%
F1 Bull (2019-21)346.4%+248.4%1162%6046.7%
F2 Recovery (2022-24)375.7%+141.3%234%3354.5%
F3 Lateral (2024-25)105.5%+99.7%0%4456.8%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)281.0%+224.3%104%6650.0%
F1 Bull (2019-21)558.0%+460.0%1162%10350.5%
F2 Recovery (2022-24)270.5%+36.1%234%5962.7%
F3 Lateral (2024-25)215.6%+209.8%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)293.8%+189.8%104%
F1 Bull (2019-21)293.1%-868.9%1162%
F2 Recovery (2022-24)474.4%+240.4%234%
F3 Lateral (2024-25)227.7%+227.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)236.0%+179.3%104%6650.0%
F1 Bull (2019-21)577.2%+479.2%1162%10349.5%
F2 Recovery (2022-24)288.0%+53.6%234%5964.4%
F3 Lateral (2024-25)221.4%+215.6%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.3%+171.3%104%
F1 Bull (2019-21)298.8%-863.2%1162%
F2 Recovery (2022-24)474.4%+240.4%234%
F3 Lateral (2024-25)227.7%+227.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)275.3%+171.3%104%
F1 Bull (2019-21)298.8%-863.2%1162%
F2 Recovery (2022-24)474.4%+240.4%234%
F3 Lateral (2024-25)227.7%+227.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)257.9%+201.2%104%6650.0%
F1 Bull (2019-21)592.0%+494.0%1162%10349.5%
F2 Recovery (2022-24)259.4%+25.0%234%5964.4%
F3 Lateral (2024-25)209.6%+203.8%0%7558.7%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)246.4%+142.4%104%
F1 Bull (2019-21)312.6%-849.4%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)212.7%+212.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)476.8%+420.1%104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)218.3%+120.3%1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)363.5%+129.1%234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)197.4%+191.6%0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)449.4%+392.7%104%
F1 Bull (2019-21)217.7%+119.7%1162%
F2 Recovery (2022-24)361.9%+127.5%234%
F3 Lateral (2024-25)194.0%+188.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)1,046.2%+942.2%104%
F1 Bull (2019-21)85.8%-1,076.2%1162%
F2 Recovery (2022-24)449.8%+215.8%234%
F3 Lateral (2024-25)99.3%+99.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)427.5%+370.8%104%
F1 Bull (2019-21)217.3%+119.3%1162%
F2 Recovery (2022-24)360.5%+126.1%234%
F3 Lateral (2024-25)191.1%+185.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)406.5%+349.8%104%
F1 Bull (2019-21)216.8%+118.8%1162%
F2 Recovery (2022-24)359.1%+124.7%234%
F3 Lateral (2024-25)188.3%+182.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)295.1%+191.1%104%
F1 Bull (2019-21)171.9%-990.1%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)237.0%+237.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)379.8%+323.1%104%
F1 Bull (2019-21)216.2%+118.2%1162%
F2 Recovery (2022-24)357.3%+122.9%234%
F3 Lateral (2024-25)184.6%+178.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)802.0%+698.0%104%
F1 Bull (2019-21)161.1%-1,000.9%1162%
F2 Recovery (2022-24)306.8%+72.8%234%
F3 Lateral (2024-25)93.5%+93.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)204.2%+100.2%104%
F1 Bull (2019-21)211.5%-950.5%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)191.5%+191.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)237.2%+133.2%104%
F1 Bull (2019-21)167.0%-995.0%1162%
F2 Recovery (2022-24)417.3%+183.3%234%
F3 Lateral (2024-25)218.6%+218.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)597.3%+493.3%104%
F1 Bull (2019-21)143.7%-1,018.3%1162%
F2 Recovery (2022-24)318.6%+84.6%234%
F3 Lateral (2024-25)101.6%+101.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)240.9%+184.2%104%6443.8%
F1 Bull (2019-21)320.3%+222.3%1162%10248.0%
F2 Recovery (2022-24)268.3%+33.9%234%6065.0%
F3 Lateral (2024-25)147.8%+142.0%0%7656.6%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)620.2%+516.2%104%
F1 Bull (2019-21)145.3%-1,016.7%1162%
F2 Recovery (2022-24)315.9%+81.9%234%
F3 Lateral (2024-25)71.5%+71.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)169.8%+65.8%104%
F1 Bull (2019-21)168.8%-993.2%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)202.7%+202.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)559.8%+503.1%104%4148.8%
F1 Bull (2019-21)163.7%+65.7%1162%6639.4%
F2 Recovery (2022-24)278.8%+44.4%234%4654.4%
F3 Lateral (2024-25)74.5%+68.7%0%6050.0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)425.2%+368.5%104%
F1 Bull (2019-21)325.5%+227.5%1162%
F2 Recovery (2022-24)151.4%-83.0%234%
F3 Lateral (2024-25)66.7%+60.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)327.3%+270.6%104%1346.1%
F1 Bull (2019-21)176.4%+78.4%1162%944.4%
F2 Recovery (2022-24)297.5%+63.1%234%4456.8%
F3 Lateral (2024-25)67.9%+62.1%0%5149.0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)168.7%+64.7%104%
F1 Bull (2019-21)68.2%-1,093.8%1162%
F2 Recovery (2022-24)349.7%+115.7%234%
F3 Lateral (2024-25)246.4%+246.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)65.8%-1,096.2%1162%
F2 Recovery (2022-24)144.0%-90.0%234%
F3 Lateral (2024-25)194.6%+194.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)375.7%+319.0%104%
F1 Bull (2019-21)266.3%+168.3%1162%
F2 Recovery (2022-24)129.1%-105.3%234%
F3 Lateral (2024-25)47.4%+41.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)179.1%+122.4%104%6540.0%
F1 Bull (2019-21)176.6%+78.6%1162%10241.2%
F2 Recovery (2022-24)193.6%-40.8%234%6053.3%
F3 Lateral (2024-25)121.3%+115.5%0%7650.0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)62.8%-1,099.2%1162%
F2 Recovery (2022-24)117.8%-116.2%234%
F3 Lateral (2024-25)136.5%+136.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)-9.0%-1,171.0%1162%
F2 Recovery (2022-24)122.8%-111.2%234%
F3 Lateral (2024-25)260.4%+260.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)167.6%+110.9%104%6442.2%
F1 Bull (2019-21)165.2%+67.2%1162%10248.0%
F2 Recovery (2022-24)169.1%-65.3%234%6065.0%
F3 Lateral (2024-25)99.7%+93.9%0%7656.6%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)-17.8%-1,179.8%1162%
F2 Recovery (2022-24)140.0%-94.0%234%
F3 Lateral (2024-25)258.1%+258.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)152.0%+95.3%104%
F1 Bull (2019-21)135.6%+37.6%1162%
F2 Recovery (2022-24)249.6%+15.2%234%
F3 Lateral (2024-25)76.5%+70.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)188.8%+132.1%104%6450.0%
F1 Bull (2019-21)146.3%+48.3%1162%10250.0%
F2 Recovery (2022-24)150.4%-84.0%234%6065.0%
F3 Lateral (2024-25)101.8%+96.0%0%7657.9%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)20.8%-1,141.2%1162%
F2 Recovery (2022-24)100.8%-133.2%234%
F3 Lateral (2024-25)170.8%+170.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)147.5%+90.8%104%6543.1%
F1 Bull (2019-21)166.9%+68.9%1162%10247.1%
F2 Recovery (2022-24)169.3%-65.1%234%6065.0%
F3 Lateral (2024-25)97.2%+91.4%0%7655.3%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)-12.0%-1,174.0%1162%
F2 Recovery (2022-24)87.3%-146.7%234%
F3 Lateral (2024-25)242.5%+242.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)2.7%-1,159.3%1162%
F2 Recovery (2022-24)76.2%-157.8%234%
F3 Lateral (2024-25)154.2%+154.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)483.0%+379.0%104%
F1 Bull (2019-21)229.0%-933.0%1162%
F2 Recovery (2022-24)-56.5%-290.5%234%
F3 Lateral (2024-25)124.4%+124.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)483.0%+379.0%104%
F1 Bull (2019-21)229.0%-933.0%1162%
F2 Recovery (2022-24)-56.5%-290.5%234%
F3 Lateral (2024-25)124.4%+124.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)-12.0%-1,174.0%1162%
F2 Recovery (2022-24)54.6%-179.4%234%
F3 Lateral (2024-25)130.3%+130.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)253.4%+196.7%104%44652.0%
F1 Bull (2019-21)72.8%-25.2%1162%61551.2%
F2 Recovery (2022-24)144.3%-90.1%234%43154.3%
F3 Lateral (2024-25)5.8%-0.0%0%46150.3%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)-14.3%-1,176.3%1162%
F2 Recovery (2022-24)64.6%-169.4%234%
F3 Lateral (2024-25)89.6%+89.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)200.3%+143.6%104%
F1 Bull (2019-21)108.2%+10.2%1162%
F2 Recovery (2022-24)60.7%-173.7%234%
F3 Lateral (2024-25)-9.1%-14.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)80.5%+23.8%104%
F1 Bull (2019-21)10.0%-88.0%1162%
F2 Recovery (2022-24)28.6%-205.8%234%
F3 Lateral (2024-25)101.4%+95.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)68.5%+11.8%104%
F1 Bull (2019-21)1.3%-96.7%1162%
F2 Recovery (2022-24)22.2%-212.2%234%
F3 Lateral (2024-25)85.2%+79.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)69.2%+12.5%104%
F1 Bull (2019-21)42.2%-55.8%1162%
F2 Recovery (2022-24)15.2%-219.2%234%
F3 Lateral (2024-25)17.9%+12.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)62.4%+5.7%104%
F1 Bull (2019-21)36.1%-61.9%1162%
F2 Recovery (2022-24)13.6%-220.8%234%
F3 Lateral (2024-25)11.7%+5.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)-21.2%104%
F1 Bull (2019-21)-68.9%1162%
F2 Recovery (2022-24)-223.9%234%
F3 Lateral (2024-25)-6.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)26.5%-30.2%104%
F1 Bull (2019-21)1.4%-96.6%1162%
F2 Recovery (2022-24)5.6%-228.8%234%
F3 Lateral (2024-25)0.5%-5.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)39.6%-17.1%104%
F1 Bull (2019-21)-3.9%-101.9%1162%
F2 Recovery (2022-24)7.4%-227.0%234%
F3 Lateral (2024-25)-10.0%-15.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)25.2%-31.5%104%
F1 Bull (2019-21)0.2%-97.8%1162%
F2 Recovery (2022-24)5.4%-229.0%234%
F3 Lateral (2024-25)-2.3%-8.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)27.9%-28.8%104%
F1 Bull (2019-21)-26.0%-124.0%1162%
F2 Recovery (2022-24)-0.3%-234.7%234%
F3 Lateral (2024-25)17.8%+12.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)20.3%-36.4%104%
F1 Bull (2019-21)-4.5%-102.5%1162%
F2 Recovery (2022-24)4.6%-229.8%234%
F3 Lateral (2024-25)-10.5%-16.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)58.2%-45.8%104%
F1 Bull (2019-21)13.7%-1,148.3%1162%
F2 Recovery (2022-24)-72.8%-306.8%234%
F3 Lateral (2024-25)80.7%+80.7%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)-61.7%104%
F1 Bull (2019-21)-139.7%1162%
F2 Recovery (2022-24)-222.2%234%
F3 Lateral (2024-25)-34.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)-57.3%-161.3%104%
F1 Bull (2019-21)-86.4%-1,248.4%1162%
F2 Recovery (2022-24)-69.4%-303.4%234%
F3 Lateral (2024-25)116.9%+116.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)-76.5%-180.5%104%
F1 Bull (2019-21)-83.0%-1,245.0%1162%
F2 Recovery (2022-24)-71.0%-305.0%234%
F3 Lateral (2024-25)-29.2%-29.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)-78.7%-182.7%104%
F1 Bull (2019-21)-82.3%-1,244.3%1162%
F2 Recovery (2022-24)-77.2%-311.2%234%
F3 Lateral (2024-25)-42.0%-42.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%101 (L:61, S:40)55.5% (L:56%, S:55%)
F1 Bull (2019-21)1162%109 (L:100, S:9)54.1% (L:53%, S:67%)
F2 Recovery (2022-24)234%78 (L:60, S:18)56.4% (L:62%, S:39%)
F3 Lateral (2024-25)0%101 (L:74, S:27)54.5% (L:54%, S:56%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)1,321.5%+1,217.5%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)753.4%+519.4%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)675.8%+571.8%104%
F1 Bull (2019-21)764.5%-397.5%1162%
F2 Recovery (2022-24)740.9%+506.9%234%
F3 Lateral (2024-25)378.6%+378.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)748.4%+644.4%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)814.8%+580.8%234%
F3 Lateral (2024-25)421.3%+421.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)673.2%+569.2%104%
F1 Bull (2019-21)650.7%-511.3%1162%
F2 Recovery (2022-24)736.9%+502.9%234%
F3 Lateral (2024-25)376.9%+376.9%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)685.2%+581.2%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)751.4%+517.4%234%
F3 Lateral (2024-25)436.2%+436.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)635.1%+531.1%104%
F1 Bull (2019-21)761.8%-400.2%1162%
F2 Recovery (2022-24)692.1%+458.1%234%
F3 Lateral (2024-25)352.4%+352.4%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)898.0%+794.0%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)501.5%+501.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)880.5%+776.5%104%
F1 Bull (2019-21)852.5%-309.5%1162%
F2 Recovery (2022-24)479.5%+245.5%234%
F3 Lateral (2024-25)293.0%+293.0%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)685.2%+581.2%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)746.7%+512.7%234%
F3 Lateral (2024-25)383.3%+383.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)685.2%+581.2%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)746.7%+512.7%234%
F3 Lateral (2024-25)383.3%+383.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)675.8%+571.8%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)740.9%+506.9%234%
F3 Lateral (2024-25)378.6%+378.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)675.8%+571.8%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)740.9%+506.9%234%
F3 Lateral (2024-25)378.6%+378.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)675.8%+571.8%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)740.9%+506.9%234%
F3 Lateral (2024-25)378.6%+378.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)675.8%+571.8%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)740.9%+506.9%234%
F3 Lateral (2024-25)378.6%+378.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)675.8%+571.8%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)740.9%+506.9%234%
F3 Lateral (2024-25)378.6%+378.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)675.8%+571.8%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)735.9%+501.9%234%
F3 Lateral (2024-25)376.8%+376.8%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)670.4%+566.4%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)727.3%+493.3%234%
F3 Lateral (2024-25)372.1%+372.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)670.4%+566.4%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)727.3%+493.3%234%
F3 Lateral (2024-25)372.1%+372.1%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)627.5%+523.5%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)687.3%+453.3%234%
F3 Lateral (2024-25)348.6%+348.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)623.2%+519.2%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)676.3%+442.3%234%
F3 Lateral (2024-25)343.3%+343.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)585.0%+481.0%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)640.3%+406.3%234%
F3 Lateral (2024-25)366.2%+366.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)585.0%+481.0%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)640.3%+406.3%234%
F3 Lateral (2024-25)366.2%+366.2%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)576.0%+472.0%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)625.5%+391.5%234%
F3 Lateral (2024-25)314.5%+314.5%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)555.2%+451.2%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)607.1%+373.1%234%
F3 Lateral (2024-25)303.6%+303.6%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)435.1%+331.1%104%
F1 Bull (2019-21)537.3%-624.7%1162%
F2 Recovery (2022-24)473.6%+239.6%234%
F3 Lateral (2024-25)261.3%+261.3%0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%64 (L:64, S:0)53.1% (L:53%)
F1 Bull (2019-21)1162%101 (L:101, S:0)52.5% (L:52%)
F2 Recovery (2022-24)234%61 (L:61, S:0)60.7% (L:61%)
F3 Lateral (2024-25)0%76 (L:76, S:0)59.2% (L:59%)
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: 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

FoldPnLαBHTradesWR
F0 Bear (2018)104%
F1 Bull (2019-21)1162%
F2 Recovery (2022-24)234%
F3 Lateral (2024-25)0%
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.py
Experimento: R167: OOT 2026 for COMBINED + comparison
Origen: outputs/round_167_oot_combined/metadata.json · → ver detalle de la ronda