Saltar al contenido
Todas las estrategias

Estrategias

Deribit ETH Venta semanal de puts OTM con garantía en efectivo — solo con filtro de tendencia, delta fijo de ~25, sin filtro IV de ventana larga NO (captura de VRP con una sola pata; corrige directamente el muro de ventana de 4 operaciones que llevó al abandono del programa hermano semanal de ETH)

Resultado: Abandonada

DeribitEthWeeklyPutWriteTrendGatedOnly

Deribit ETH Venta semanal de puts OTM con garantía en efectivo — solo con filtro de tendencia, delta fijo de ~25, sin filtro IV de ventana larga NO (captura de VRP con una sola pata; corrige directamente el muro de…

Hipótesis

Un programa SINGLE-LEG semanal PUT-WRITING totalmente colateralizado en efectivo sobre opciones ETH de Deribit — el segundo subyacente de opciones cripto más líquido, reutilizando la ruta de ejecución EXACT (selección de strike mediante griegas, liquidación semanal en efectivo) del programa de venta de puts semanal Deribit-BTC promovido por Sharpe-12.2 de la fábrica. Está deliberadamente diseñado para FIX la única razón, diagnosticada repetidamente, por la que el programa hermano ETH-semanal fue abandonado a lo……Ver másVer menos

Un programa SINGLE-LEG semanal PUT-WRITING totalmente colateralizado en efectivo sobre opciones ETH de Deribit — el segundo subyacente de opciones cripto más líquido, reutilizando la ruta de ejecución EXACT (selección de strike mediante griegas, liquidación semanal en efectivo) del programa de venta de puts semanal Deribit-BTC promovido por Sharpe-12.2 de la fábrica. Está deliberadamente diseñado para FIX la única razón, diagnosticada repetidamente, por la que el programa hermano ETH-semanal fue abandonado a lo largo de 8 iteraciones: su doble-filtro IV-rank + IV>RV requería una ventana retrospectiva móvil de ~560 días, que lo redujo a tan solo 4 operaciones / metrics_reliable=false — un callejón sin salida estructural que el desarrollador nunca pudo resolver. Esta versión DROPS el filtro de ventana larga IV por completo y mantiene ONLY el filtro de tendencia (el filtro demostrado como crítico en el ganador promovido BTC), vendiendo un put OTM ETH de delta fija ~25 cada semana elegible. Sin dependencia de percentiles IV multi-año, se activa ~40-52 veces/año sobre el historial semanal ETH de Deribit disponible → un conteo de operaciones estadísticamente confiable, eliminando exactamente el muro de 4 operaciones. Llena el venue más subrepresentado (opciones: 5.5% Deribit + 0.1% Binance vs un objetivo ≥15%) y diversifica el libro de opciones desde solo BTC a un segundo subyacente de volatilidad no correlacionada. Es NOT una estructura multi-pierna (L2), NOT una celda con muro de datos (la cadena semanal ETH + las griegas están catalogadas y demostradas como ejecutables mediante el programa hermano BTC), NOT direccional. Parámetros deliberadamente 2 (delta del put, longitud del filtro de tendencia) para resistir el sobreajuste.

La iteración 3 corrige el timeout de reloj de pared de la Capa-3 con un cambio solo de configuración; la estrategia CODE no cambia (ya pasó las Capas 1-2, el trabajo por barra es O(1) mediante un SMA de suma acumulada incremental, y no hay escaneos por barra de min()/sorted()/historial). Diagnóstico: la iteración 2 movió correctamente la resolución primaria+pierna a 1-DAY pero STILL agotó el tiempo, lo que prueba que el cuello de botella no es el conteo de barras. Leyendo src/data/option_chain.py:……Ver másVer menos

La iteración 3 corrige el timeout de reloj de pared de la Capa-3 con un cambio solo de configuración; la estrategia CODE no cambia (ya pasó las Capas 1-2, el trabajo por barra es O(1) mediante un SMA de suma acumulada incremental, y no hay escaneos por barra de min()/sorted()/historial). Diagnóstico: la iteración 2 movió correctamente la resolución primaria+pierna a 1-DAY pero STILL agotó el tiempo, lo que prueba que el cuello de botella no es el conteo de barras. Leyendo src/data/option_chain.py: discover_deribit_chain emite una sonda de red fetch_ohlcv por cada strike candidato de cada vencimiento semanal EACH, y el sandbox de la Capa-3 abarca lookback_days (expand_rolling_options / default de pipeline 365). Por lo tanto, el costo de expansión escala con el número de vencimientos semanales = lookback_days, independientemente del timeframe. La configuración de iter-2 llevaba lookback_days ~730 (~104 vencimientos, duplicando el conteo de sondas), lo que agotó el presupuesto de 300s. Revirtiendo lookback_days a 365 (~52 vencimientos) se reducen a la mitad las sondas de vencimiento y las descargas de piernas, igualando la escala exacta a la que los programas hermanos de venta de puts semanal ETH/BTC probados superan la Capa 3, mientras se siguen cubriendo ~52 semanas elegibles para que el conteo de operaciones se mantenga estadísticamente confiable (~30-52 escrituras después del filtro de tendencia) y muy por encima del callejón sin salida de 4 operaciones. Todo lo demás se preserva y está demostrado: subclasificación directa de RollingOptionsStrategy (la Capa-1 lo reconoce; los hooks abstractos 4 están físicamente presentes), sin ruta de humo (las piernas de opciones reales se operan mediante el cronograma expandido, satisfaciendo options_no_option_trades), el filtro único de tendencia solo por precio en _enter_leg, resolución primaria ETH-PERPETUAL 1-DAY + de pierna 1-DAY (la resolución que usa el programa hermano de venta de puts ETH que pasa), dimensionamiento con garantía en efectivo (risk_frac 0.8, apalancamiento 1.0 según el tope del venue de opciones), y el diseño de 2 parámetros (offset del put + sma_window).

backtest_failed: RuntimeError: la expansión de rolling_options falló (ConnectError: ); negándose a ejecutarse con un calendario de opciones vacío Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 101, en map_httpcore_exceptions yield Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 394, en handle_async_request resp = await self._pool.handle_async_request(req)……Ver másVer menos

backtest_failed: RuntimeError: la expansión de rolling_options falló (ConnectError: ); negándose a ejecutarse con un calendario de opciones vacío Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 101, en map_httpcore_exceptions yield Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 394, en handle_async_request resp = await self._pool.handle_async_request(req) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", línea 256, en handle_async_request raise exc from None Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", línea 236, en handle_async_request response = await connection.handle_async_request( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", línea 101, en handle_async_request raise exc Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", línea 78, en handle_async_request stream = await self._connect(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", línea 156, en _connect stream = await stream.start_tls(**kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py", línea 67, en start_tls with map_exceptions(exc_map): Archivo "/usr/lib/python3.12/contextlib.py", línea 158, en __exit__ self.gen.throw(value) Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_exceptions.py", línea 14, en map_exceptions raise to_exc(exc) from exc httpcore.ConnectError La excepción anterior fue la causa directa de la siguiente excepción: Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 49, en expand_rolling_options_into_config extra_i, extra_bt, sched = await expand_rolling_options(collector, spec, start, end) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/option_chain.py", línea 242, en expand_rolling_options contracts = await discover_deribit_chain( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/option_chain.py", línea 143, en discover_deribit_chain perp_bars = await collector.fetch_ohlcv(perp, start_ms, end_ms, "1D") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/collectors/deribit_collector.py", línea 169, en fetch_ohlcv result = await self._get("/public/get_tradingview_chart_data", { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/collectors/deribit_collector.py", línea 86, en _get response = await self._client.get(f"{DERIBIT_API_URL}{endpoint}", params=params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1768, en get return await self.request( ^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1540, en request return await self.send(request, auth=auth, follow_redirects=follow_redirects) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1629, en send response = await self._send_handling_auth( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1657, en _send_handling_auth response = await self._send_handling_redirects( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1694, en _send_handling_redirects response = await self._send_single_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1730, en _send_single_request response = await transport.handle_async_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 393, en handle_async_request with map_httpcore_exceptions(): Archivo "/usr/lib/python3.12/contextlib.py", línea 158, en __exit__ self.gen.throw(value) Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 118, en map_httpcore_exceptions raise mapped_exc(message) from exc httpx.ConnectError La excepción anterior fue la causa directa de la siguiente excepción: Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 184, en _run_backtest config = await self._maybe_expand_rolling_options(config, catalog_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 427, en _maybe_expand_rolling_options config = await expand_rolling_options_into_config(config, catalog_path, self._logger) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 59, en expand_rolling_options_into_config raise RuntimeError( RuntimeError: la expansión de rolling_options falló (ConnectError: ); negándose a ejecutarse con un calendario de opciones vacío

Implementación

Venta de puts semanal OTM de pierna única, con garantía en efectivo, sobre opciones europeas de Deribit ETH, solo con filtro de tendencia. Cada semana el marco resuelve la cadena histórica de puts semanales ETH de Deribit (apuntando a un strike OTM de delta ~25 mediante un offset de moneyness -6%) y la renueva; la estrategia SELLS un put a ~7 días del vencimiento y lo cierra ~24h antes de la liquidación. El filtro ONLY es un filtro de tendencia basado solo en precio: vende el put solo cuando el spot ETH está por……Ver másVer menos

Venta de puts semanal OTM de pierna única, con garantía en efectivo, sobre opciones europeas de Deribit ETH, solo con filtro de tendencia. Cada semana el marco resuelve la cadena histórica de puts semanales ETH de Deribit (apuntando a un strike OTM de delta ~25 mediante un offset de moneyness -6%) y la renueva; la estrategia SELLS un put a ~7 días del vencimiento y lo cierra ~24h antes de la liquidación. El filtro ONLY es un filtro de tendencia basado solo en precio: vende el put solo cuando el spot ETH está por encima de su SMA de ~50 días (barras diarias), permaneciendo fuera durante las tendencias bajistas confirmadas. Sin una ventana de percentiles IV multi-año, opera cada semana elegible (~52/año sobre la ventana de 365 días) para un conteo de operaciones estadísticamente confiable, eliminando directamente el muro de ventana retrospectiva de 4 operaciones que abandonó al programa hermano ETH-semanal con filtro IV. Primario = ETH-PERPETUAL.DERIBIT en barras 1-DAY (solo reloj de roll-over, nunca operado). Dimensionamiento con garantía en efectivo (risk_frac 0.8), sin apalancamiento, parámetros 2 ajustados (offset del put, sma_window).

Resultados de verificación

CLEAN RESTART 2026-09-04 — el historial de veredictos y los registros de aprendizaje de esta ejecución se eliminaron y se reinició desde la verificación. El abandono anterior se debió al pipeline, no al mercado: el arnés de Layer-2 vinculó incorrectamente los métodos auxiliares @staticmethod (corregido), QA emitió veredictos de rendimiento definitivos sobre una prueba de humo sin optimizar (eliminado: ahora QA evalúa solo la corrección), y los tiempos de espera del sandbox se debieron a la falta de disponibilidad de slots de backtest (corregido). La hipótesis y el código de la estrategia no han cambiado. Verifica el código por sus propios méritos; el rendimiento se decidirá más adelante mediante el backtest completo y el optimizador.

No se necesita nada.

Layer-1 marcó self._win.append() como no acotado, pero on_bar recorta el deque en cada barra (while len > sma_window: popleft()), por lo que el crecimiento está limitado a sma_window. Falso positivo.

Historial de iteraciones

La verificación falló (Layer 3 — backtest en sandbox): la prueba de humo superó el límite de tiempo de pared de 300s. Casi siempre esto indica trabajo por barra que aumenta con el historial, por ejemplo, volver a recorrer toda la serie de financiación/suplementaria o reconstruir una lista y llamar a min()/sorted() dentro de calculate_signal()/on_bar() en cada barra. Precalcula los arrays ordenados de marcas de tiempo ONCE en __init__ y usa bisect, o almacena en caché las búsquedas con la marca de tiempo como clave, para que el coste por barra sea O(log n), no O(n).

RuntimeError: falló la expansión de rolling_options (ConnectError: ); se rehúsa ejecutar con un calendario de opciones vacío Traceback (most recent call last): File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", line 101, in map_httpcore_exceptions yield File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", line 394, in handle_async_request resp = await self._pool.handle_async_request(req) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^……Ver másVer menos

RuntimeError: falló la expansión de rolling_options (ConnectError: ); se rehúsa ejecutar con un calendario de opciones vacío Traceback (most recent call last): File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", line 101, in map_httpcore_exceptions yield File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", line 394, in handle_async_request resp = await self._pool.handle_async_request(req) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", line 256, in handle_async_request raise exc from None File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", line 236, in handle_async_request response = await connection.handle_async_request( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", line 101, in handle_async_request raise exc File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", line 78, in handle_async_request stream = await self._connect(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", line 156, in _connect stream = await stream.start_tls(**kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py", line 67, in start_tls with map_exceptions(exc_map): File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__ self.gen.throw(value) File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_exceptions.py", line 14, in map_exceptions raise to_exc(exc) from exc httpcore.ConnectError La excepción anterior fue la causa directa de la siguiente: Traceback (most recent call last): File "/opt/strategy-factory/src/agents/backtest_agent.py", line 49, in expand_rolling_options_into_config extra_i, extra_bt, sched = await expand_rolling_options(collector, spec, start, end) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/src/data/option_chain.py", line 242, in expand_rolling_options contracts = await discover_deribit_chain( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/src/data/option_chain.py", line 143, in discover_deribit_chain perp_bars = await collector.fetch_ohlcv(perp, start_ms, end_ms, "1D") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/src/data/collectors/deribit_collector.py", line 169, in fetch_ohlcv result = await self._get("/public/get_tradingview_chart_data", { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/src/data/collectors/deribit_collector.py", line 86, in _get response = await self._client.get(f"{DERIBIT_API_URL}{endpoint}", params=params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1768, in get return await self.request( ^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1540, in request return await self.send(request, auth=auth, follow_redirects=follow_redirects) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1629, in send response = await self._send_handling_auth( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1657, in _send_handling_auth response = await self._send_handling_redirects( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1694, in _send_handling_redirects response = await self._send_single_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", line 1730, in _send_single_request response = await transport.handle_async_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", line 393, in handle_async_request with map_httpcore_exceptions(): File "/usr/lib/python3.12/contextlib.py", line 158, in __exit__ self.gen.throw(value) File "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", line 118, in map_httpcore_exceptions raise mapped_exc(message) from exc httpx.ConnectError La excepción anterior fue la causa directa de la siguiente: Traceback (most recent call last): File "/opt/strategy-factory/src/agents/backtest_agent.py", line 184, in _run_backtest config = await self._maybe_expand_rolling_options(config, catalog_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/src/agents/backtest_agent.py", line 427, in _maybe_expand_rolling_options config = await expand_rolling_options_into_config(config, catalog_path, self._logger) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/opt/strategy-factory/src/agents/backtest_agent.py", line 59, in expand_rolling_options_into_config raise RuntimeError( RuntimeError: falló la expansión de rolling_options (ConnectError: ); se rehúsa ejecutar con un calendario de opciones vacío

Motivo de abandono

backtest_failed: RuntimeError: la expansión de rolling_options falló (ConnectError: ); negándose a ejecutarse con un calendario de opciones vacío Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 101, en map_httpcore_exceptions yield Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 394, en handle_async_request resp = await self._pool.handle_async_request(req)……Ver másVer menos

backtest_failed: RuntimeError: la expansión de rolling_options falló (ConnectError: ); negándose a ejecutarse con un calendario de opciones vacío Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 101, en map_httpcore_exceptions yield Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 394, en handle_async_request resp = await self._pool.handle_async_request(req) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", línea 256, en handle_async_request raise exc from None Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", línea 236, en handle_async_request response = await connection.handle_async_request( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", línea 101, en handle_async_request raise exc Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", línea 78, en handle_async_request stream = await self._connect(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", línea 156, en _connect stream = await stream.start_tls(**kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py", línea 67, en start_tls with map_exceptions(exc_map): Archivo "/usr/lib/python3.12/contextlib.py", línea 158, en __exit__ self.gen.throw(value) Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_exceptions.py", línea 14, en map_exceptions raise to_exc(exc) from exc httpcore.ConnectError La excepción anterior fue la causa directa de la siguiente excepción: Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 49, en expand_rolling_options_into_config extra_i, extra_bt, sched = await expand_rolling_options(collector, spec, start, end) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/option_chain.py", línea 242, en expand_rolling_options contracts = await discover_deribit_chain( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/option_chain.py", línea 143, en discover_deribit_chain perp_bars = await collector.fetch_ohlcv(perp, start_ms, end_ms, "1D") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/collectors/deribit_collector.py", línea 169, en fetch_ohlcv result = await self._get("/public/get_tradingview_chart_data", { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/data/collectors/deribit_collector.py", línea 86, en _get response = await self._client.get(f"{DERIBIT_API_URL}{endpoint}", params=params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1768, en get return await self.request( ^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1540, en request return await self.send(request, auth=auth, follow_redirects=follow_redirects) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1629, en send response = await self._send_handling_auth( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1657, en _send_handling_auth response = await self._send_handling_redirects( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1694, en _send_handling_redirects response = await self._send_single_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", línea 1730, en _send_single_request response = await transport.handle_async_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 393, en handle_async_request with map_httpcore_exceptions(): Archivo "/usr/lib/python3.12/contextlib.py", línea 158, en __exit__ self.gen.throw(value) Archivo "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", línea 118, en map_httpcore_exceptions raise mapped_exc(message) from exc httpx.ConnectError La excepción anterior fue la causa directa de la siguiente excepción: Traza (llamada más reciente al final): Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 184, en _run_backtest config = await self._maybe_expand_rolling_options(config, catalog_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 427, en _maybe_expand_rolling_options config = await expand_rolling_options_into_config(config, catalog_path, self._logger) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Archivo "/opt/strategy-factory/src/agents/backtest_agent.py", línea 59, en expand_rolling_options_into_config raise RuntimeError( RuntimeError: la expansión de rolling_options falló (ConnectError: ); negándose a ejecutarse con un calendario de opciones vacío

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.