BtcSpotDualTimeframeMomentumConfluenceLong
Hipótesis
BTC Confluencia de Momentum Spot de Doble Marco Temporal, LONG-ONLY 1x (BTCUSDT.BINANCE_SPOT, Primario 4H + Confirmación 1D, Largo Solo Cuando BOTH Marcos Temporales Apuntan UP, FLAT a Efectivo en Cualquier Otro Caso, Salida con Trailing de ATR + Ruptura del Régimen Diario, Parámetros Optimizados en Origen Conservados)
Hipótesis
Una adaptación LONG-ONLY, 1x, con cuenta CASH, de la estrategia promovida con mejor rendimiento de la fábrica (BtcDualTimeframeMomentumConfluenceLS, Sharpe 1.99, 458 operaciones, +$4,774 durante 29 días de operativa simulada) a BTCUSDT.BINANCE_SPOT, creada específicamente como FIRST LIVE-TRADING CANDIDATE porque el mercado para operar en real es exclusivamente al contado. Mecanismo sin cambios, puramente OHLCV, con un único instrumento: componente FAST = signo del rendimiento de las últimas 18 velas sobre velas de 4-HOUR; componente SLOW = signo del rendimiento de las últimas 15 velas sobre velas de DAILY (leído mediante on_extra_bar como componente de contexto, nunca como barrera de sincronización). Ambos deben AGREE. El único cambio estructural que impone la cuenta CASH es reducir {LONG/FLAT/SHORT} a {LONG/FLAT}: donde la estrategia matriz de futuros adopta SHORT ante una confluencia bajista de ambos componentes, la versión al contado mantiene 100% USDT. Todo lo demás se conserva íntegramente: stop dinámico ATR(14) a 3.033x ATR del extremo registrado hasta el momento, salida por ruptura del régimen diario, dimensionamiento relativo al capital ajustado por volatilidad (risk_pct 1.011% / distancia al stop de 3.033xATR), límite nocional máximo de 49.7%, y el vector exacto de parámetros seleccionado por la optimización de origen (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Tres parámetros ajustables, sin datos complementarios, sin posiciones cortas, sin apalancamiento. Cambios de código específicos para contado: mercado BINANCE_SPOT CASH (sin multiplicador de apalancamiento en position_size), size_precision 5 / price_precision 2, min_notional $10, ventas dimensionadas únicamente según la cantidad mantenida del activo base. Disponibilidad de datos verificada: las velas de BTCUSDT.BINANCE_SPOT de 4-HOUR y 1-DAY forman una serie continua desde 2017-08-17 (~9 años, ~19,800 velas de 4H).
Hipótesis
Adaptación directa de la estrategia matriz de futuros promovida BtcDualTimeframeMomentumConfluenceLS al mercado al contado, porque el mercado previsto para operar en real es exclusivamente al contado. Mecanismo conservado íntegramente: los mismos dos componentes de momentum, el mismo filtro de AGREE o sin posición, el mismo stop dinámico ATR(14) 3.033x desde el extremo registrado hasta el momento, la misma salida por ruptura del régimen diario, el mismo dimensionamiento ajustado por volatilidad de risk_pct / distancia al stop con un límite nocional de 49.7%, y el vector exacto de parámetros seleccionado por la optimización de origen (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). La cuenta CASH obliga a realizar exactamente un cambio estructural, tal como especifica la hipótesis: {LONG,FLAT,SHORT} se reduce a {LONG,FLAT}; should_enter devuelve BUY solo cuando ambos componentes son alcistas y None en caso contrario, de modo que cuando ambos son bajistas el resultado es 100% USDT en lugar de una posición corta. Modificaciones específicas para contado: mercado BINANCE_SPOT con apalancamiento 1.0 y sin término de apalancamiento en position_size, size_precision 5 / price_precision 2 (BTCUSDT al contado), min_notional elevado a $10, y todas las salidas canalizadas a través de close_position de la plantilla base, que solo permite reducir posiciones, de modo que un SELL únicamente puede reducir la cantidad mantenida del activo base (una posición corta descubierta al contado es imposible por construcción, y la protección _would_open_spot_short de la base nunca se activa). calculate_signal devuelve en cada vela el rendimiento continuo de 18 velas de 4H (varía de una vela a otra); el filtro discreto de confluencia reside en should_enter, tal como se exige. El coste por vela es O(1): ATR utiliza una ventana fija de 15 velas y el rendimiento rápido se obtiene mediante una única consulta por índice, por lo que no hay trabajo que crezca con el historial. Una salvedad honesta para el Analista: el coste de una operación completa de entrada y salida al contado es de ~0.20%, frente a ~0.10% en la estrategia matriz de futuros, por lo que la ventaja por operación debe superar el doble de fricción; la estructura de salida de seguimiento de tendencia (stop dinámico + ruptura de régimen, sin toma de beneficios fija) es lo que hace que la duración media de las posiciones sea suficientemente larga para que esto resulte plausible, pero es la primera métrica que hay que vigilar.
Implementación
LONG-ONLY 1x BTCUSDT spot (BINANCE_SPOT, CASH) de confluencia de momentum de doble marco temporal. La pata FAST = signo del retorno trailing de 18 barras sobre barras de 4-HOUR (primaria); la pata SLOW = signo del retorno trailing de 15 barras sobre barras de 1-DAY, consumida mediante on_extra_bar como pata de contexto de marco temporal más lento (marco temporal diferente, por lo que la barrera de alineación entre patas de la plantilla base nunca retrasa la señal de 4H). Ambas patas deben apuntar UP para mantener BTC; la bajada conjunta (donde el futuro principal abre cortos) y la discrepancia significan mantener 100% USDT. Salidas: stop trailing ATR(14) a 3.033x ATR por debajo del máximo acumulado de la posición, OR cuando la pata diaria cambia a bajista bajo el largo (ruptura del régimen de marco temporal superior). El dimensionamiento se escala por volatilidad y es relativo al capital: capital * 1.011% / (3.033 * ATR), limitado a 49.7% del saldo USDT en nocional, con multiplicador de apalancamiento NO (la cuenta CASH no puede pedir prestado), cuantizado a size_precision 5 y rechazado por debajo del nocional mínimo spot de $10. Tres parámetros ajustables, puro OHLCV, sin datos suplementarios, sin cortos.
Resultados de verificación
Usa self._atr (actual) en la comparación del trailing de should_exit para coincidir exactamente con el principal, o indica explícitamente en la descripción que el trailing está anclado al ATR de la barra de entrada, para que el analista no atribuya la divergencia respecto al principal al cambio de venue.
Resultados de verificación
El ATR del stop trailing se FROZEN en la entrada (self._entry_atr, capturado en should_enter / al adoptar la posición) y nunca se actualiza, por lo que la distancia del trailing es 3.033 x ATR de entrada en lugar de 3.033 x ATR actual 14. El futuro principal promovido (BtcDualTimeframeMomentumConfluenceLS4H) ajusta su trailing con el CURRENT ATR en cada barra. La redacción de la hipótesis («stop trailing ATR(14) a 3.033x ATR del extremo acumulado») se cumple de cualquier forma, y como _extreme es monótono, el nivel del stop sigue ajustándose únicamente al alza, por lo que no es un defecto de corrección — pero con una expansión de la volatilidad después de la entrada, el stop efectivo es más ajustado que el del principal, lo que constituye una diferencia de comportamiento real respecto a la estrategia que supuestamente se traslada «literalmente».
Resultados de verificación
Establece el estado de la operación a partir del fill (on_order_filled / primera barra con una posición abierta) en lugar de dentro de should_enter, o restablécelo defensivamente al principio de calculate_signal antes de consultar la posición.
Resultados de verificación
should_enter() muta el estado de la operación (_in_long = True, _extreme, _entry_atr) BEFORE de que la plantilla base haya dimensionado la orden y aplicado la condición de nocional mínimo. Si position_size() devuelve 0 o la comprobación de nocional mínimo de $10 descarta la entrada, la estrategia queda marcada como en-largo con un trailing armado mientras está plana. En la práctica se autocorrige en la siguiente barra (calculate_signal ve que la posición es None y restablece las banderas, y should_exit nunca se alcanza estando plana), por lo que no hay ningún error de comportamiento observable — pero el invariante es frágil si alguna vez se cambia la ruta de salida.
Resultados de verificación
No se requiere ninguna corrección para la exactitud. Si se desea el consumo exacto en la misma barra, recalcula _slow_dir perezosamente desde self._extra_bars[...] dentro de calculate_signal en lugar de almacenarlo en caché en on_extra_bar.
Resultados de verificación
Latencia de una barra en la pata diaria: la barra de DAILY y la última barra de 4H del día comparten la misma marca temporal de cierre. Si el motor entrega primero la barra primaria de 4H, se ejecuta _maybe_process_primary() y se registra _last_processed_ts, y la actualización _slow_dir de la barra diaria (que llega en el mismo ts) solo se consume desde la barra NEXT 4H. Esto es conservador (solo puede retrasar una señal, nunca filtrar datos futuros), pero significa que la salida por ruptura del régimen diario puede activarse hasta 4 horas después del cierre diario en aproximadamente la mitad de los casos, y que la paridad entre backtest y paper trading depende de que el orden de entrega sea estable.
Resultados de verificación
Implementación fiel, pero hay tres aspectos que el analista debería ponderar sobre el historial completo: (1) el coste ida y vuelta en spot es de ~0.20% frente a ~0.10% del futuro principal, por lo que el mismo edge bruto produce netamente aproximadamente la mitad — el sandbox ya muestra una comisión de 10.03% del bruto; (2) el vector de parámetros (rápido 18 / lento 15 / trailing 3.033) fue seleccionado mediante una ejecución de optimización en un conjunto de DIFFERENT de venue, mezcla de marcos temporales y direcciones (LONG/SHORT futuros), por lo que esto es una transferencia fuera de muestra, no una configuración optimizada — el Sharpe del sandbox es 0.527 con sharpe_ci_low -0.233 y information_ratio -0.760 frente al benchmark, es decir, un libro BTC solo largo que tiene un rendimiento inferior al de mantener BTC durante la ventana de prueba; (3) eliminar la pata corta quita aproximadamente la mitad de la población de operaciones del principal (250 operaciones, todas largas, 43.6% de exposición), por lo que cabe esperar que el Sharpe realizado esté muy por debajo del 1.99 del principal, en lugar de cerca de él. Lo primero que hay que comprobar en el backtest real: avg_trade_return_pct frente al mínimo de spot 0.25% (el sandbox muestra 0.82%, pero esa ventana excluye 2017 y solo tiene 2401 días) y si el tercil de volatilidad «normal» (-8.77% en el sandbox) sigue siendo negativo durante todo el historial.
Revisión de backtest
314 operaciones cerradas durante 3146 días (2017-08 → 2026-03), metrics_reliable=true, entry_diag 314/314 entradas enviadas, con 0 descartadas.
Revisión de backtest
Las operaciones implementan la hipótesis: todas 314 LONG / 0 cortas (colapso correcto CASH de las LONG/FLAT/SHORT del principal), nocional máximo/capital 0.50 frente al límite de 0.497, duración media 4d8h y 43.6% de exposición que reproducen el futuro principal.
Revisión de backtest
avg_trade_return_pct 1.20% frente a un ida y vuelta de ~0.20% BINANCE_SPOT; las comisiones son solo 8.97% del bruto, impacto 4.33% — no es marginal por comisiones.
Revisión de backtest
max_drawdown 10.3% (bajo el valor predeterminado de spot 15%), PF 1.41, payoff 2.07 con una tasa de acierto de 40.4% (forma de tendencia correcta), tercil de volatilidad bajo estrés +28.0%.
Revisión de backtest
Concentración extrema: los 10 principales de 314 operaciones = 93.8% del retorno sumado por operación, los 20 principales = 141% (las operaciones 21–314 son netamente negativas).
Revisión de backtest
Solo 6/10 años naturales positivos — exactamente en el mínimo estricto — y ambos años recientes negativos (2025 −10.5%, 2026 −9.9%).
Revisión de backtest
Sharpe 0.664 con sharpe_ci_low 0.0042 y PSR 0.924 (<0.95): ya marginal antes de la barrera de selección de ~225 pruebas.
Revisión de backtest
La preocupación de QA se confirma parcialmente: el tercil de volatilidad «normal» sigue siendo negativo (−7.70%, 16.1% DD), information_ratio −0.757, alfa de solo +2.4%/año — tiene un rendimiento inferior al de mantener BTC, y benchmark_meaningful=true, por lo que ese déficit es real.
Revisión de backtest
Los parámetros son una transferencia fuera de muestra desde otro conjunto de mercado/dirección: sin ajustar, en lugar de sobreajustados, pero tampoco probados aquí.
Stratmill es una herramienta de investigación y paper trading, no asesoramiento financiero ni un bróker. Los resultados de backtest y paper trading son hipotéticos. Operar conlleva riesgo de pérdida.