Passer au contenu
Toutes les stratégies

Stratégies

Put-Write hebdomadaire Deribit ETH garanti en cash OTM — Filtre de tendance uniquement, Delta fixe ~25, NO barrière IV à long lookback (Récolte VRP en une seule jambe ; Corrige directement le mur de lookback à 4 trades qui a fait abandonner le sibling hebdomadaire ETH)

Résultat: Abandonné

DeribitEthWeeklyPutWriteTrendGatedOnly

Put-Write hebdomadaire Deribit ETH garanti en cash OTM — Filtre de tendance uniquement, Delta fixe ~25, NO barrière IV à long lookback (Récolte VRP en une seule jambe ; Corrige directement le mur de lookback à 4 trades…

Hypothèse

Un SINGLE-LEG, programme hebdomadaire PUT-WRITING entièrement collatéralisé en cash sur options Deribit ETH — le deuxième sous-jacent d'options crypto le plus liquide, réutilisant le chemin d'exécution EXACT (sélection du strike via les grecques, règlement hebdomadaire en cash) du put-write hebdomadaire Deribit-BTC promu Sharpe-12.2 de la factory. Il est délibérément conçu pour FIX l'unique raison, diagnostiquée à plusieurs reprises, pour laquelle le sibling hebdomadaire ETH a été abandonné au fil de 8 itérations……Afficher plusAfficher moins

Un SINGLE-LEG, programme hebdomadaire PUT-WRITING entièrement collatéralisé en cash sur options Deribit ETH — le deuxième sous-jacent d'options crypto le plus liquide, réutilisant le chemin d'exécution EXACT (sélection du strike via les grecques, règlement hebdomadaire en cash) du put-write hebdomadaire Deribit-BTC promu Sharpe-12.2 de la factory. Il est délibérément conçu pour FIX l'unique raison, diagnostiquée à plusieurs reprises, pour laquelle le sibling hebdomadaire ETH a été abandonné au fil de 8 itérations : sa double-barrière IV-rank + IV>RV exigeait un lookback glissant d'environ 560 jours, ce qui le réduisait à seulement 4 trades / metrics_reliable=false — une impasse structurelle que le développeur n'a jamais pu résoudre. Cette version DROPS entièrement la barrière IV à long lookback et conserve ONLY le filtre de tendance (la barrière prouvée porteuse dans le winner BTC promu), vendant un put OTM ETH à delta fixe d'environ 25 chaque semaine éligible. Sans dépendance à un percentile IV pluriannuel, il déclenche environ 40-52 fois/an sur l'historique hebdomadaire Deribit ETH disponible → un nombre de trades statistiquement fiable, éliminant exactement le mur des 4 trades. Il remplit la venue la plus sous-représentée (options : 5.5% Deribit + 0.1% Binance vs un objectif ≥15%) et diversifie le book d'options d'un BTC-only vers un deuxième sous-jacent à vol non corrélée. Il est NOT une structure multi-legs (L2), NOT une cellule murée par les données (chaîne hebdomadaire ETH + grecques sont cataloguées et prouvées exécutables via le sibling BTC), NOT directionnel. Avec des paramètres délibérément 2 (delta du put, longueur du filtre de tendance) pour résister au sur-ajustement.

L’itération 3 corrige le délai d’attente mural de Layer-3 par un changement de configuration uniquement ; la stratégie CODE reste inchangée (elle avait déjà réussi les Layers 1-2, le travail par barre est en O(1) grâce à une somme glissante incrémentale SMA, et il n’y a aucun parcours min()/sorted()/de l’historique par barre). Diagnostic : l’itération 2 a correctement déplacé la résolution du sous-jacent et de la jambe vers 1-DAY, mais STILL a expiré, ce qui prouve que le goulot d’étranglement n’est pas le nombre……Afficher plusAfficher moins

L’itération 3 corrige le délai d’attente mural de Layer-3 par un changement de configuration uniquement ; la stratégie CODE reste inchangée (elle avait déjà réussi les Layers 1-2, le travail par barre est en O(1) grâce à une somme glissante incrémentale SMA, et il n’y a aucun parcours min()/sorted()/de l’historique par barre). Diagnostic : l’itération 2 a correctement déplacé la résolution du sous-jacent et de la jambe vers 1-DAY, mais STILL a expiré, ce qui prouve que le goulot d’étranglement n’est pas le nombre de barres. Lecture de src/data/option_chain.py : discover_deribit_chain effectue une sonde réseau fetch_ohlcv pour chaque prix d’exercice candidat de l’échéance hebdomadaire EACH, et le bac à sable Layer-3 s’étend sur lookback_days (expand_rolling_options / valeur par défaut du pipeline 365). Le coût de l’expansion évolue donc avec le nombre d’échéances hebdomadaires = lookback_days, indépendamment de l’unité de temps. La configuration d’iter-2 contenait lookback_days ~730 (~104 échéances, doublant le nombre de sondes), ce qui a dépassé le budget de 300s. Revenir de lookback_days à 365 (~52 échéances) réduit de moitié les sondes d’échéance et les téléchargements de jambes, ce qui correspond à l’échelle exacte à laquelle les stratégies sœurs de vente hebdomadaire de puts ETH/BTC éprouvées passent Layer 3, tout en couvrant ~52 semaines admissibles afin que le nombre de transactions reste statistiquement fiable (~30-52 ventes après filtrage de tendance) et nettement supérieur à l’impasse des 4 transactions. Tout le reste est préservé et éprouvé : héritage direct de RollingOptionsStrategy (Layer-1 le reconnaît ; les hooks abstraits 4 sont présents physiquement), aucun parcours de simulation (les vraies jambes d’options sont négociées via le calendrier étendu, satisfaisant options_no_option_trades), l’unique filtre de tendance fondé sur les prix dans _enter_leg, résolution du sous-jacent 1-DAY ETH-PERPETUAL et de la jambe 1-DAY (la résolution utilisée par la stratégie sœur de vente de puts ETH qui a réussi), dimensionnement couvert en espèces (risk_frac 0.8, levier 1.0 selon la limite de la plateforme d’options), et conception à 2 paramètres (décalage du put + sma_window).

backtest_failed: RuntimeError: échec de l'expansion de rolling_options (ConnectError: ); refus d'exécuter avec un calendrier d'options vide Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 101, dans map_httpcore_exceptions yield Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 394, dans handle_async_request resp = await self._pool.handle_async_request(req)……Afficher plusAfficher moins

backtest_failed: RuntimeError: échec de l'expansion de rolling_options (ConnectError: ); refus d'exécuter avec un calendrier d'options vide Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 101, dans map_httpcore_exceptions yield Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 394, dans handle_async_request resp = await self._pool.handle_async_request(req) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", ligne 256, dans handle_async_request raise exc from None Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", ligne 236, dans handle_async_request response = await connection.handle_async_request( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", ligne 101, dans handle_async_request raise exc Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", ligne 78, dans handle_async_request stream = await self._connect(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", ligne 156, dans _connect stream = await stream.start_tls(**kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py", ligne 67, dans start_tls with map_exceptions(exc_map): Fichier "/usr/lib/python3.12/contextlib.py", ligne 158, dans __exit__ self.gen.throw(value) Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_exceptions.py", ligne 14, dans map_exceptions raise to_exc(exc) from exc httpcore.ConnectError L'exception ci-dessus a été la cause directe de l'exception suivante: Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 49, dans expand_rolling_options_into_config extra_i, extra_bt, sched = await expand_rolling_options(collector, spec, start, end) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/option_chain.py", ligne 242, dans expand_rolling_options contracts = await discover_deribit_chain( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/option_chain.py", ligne 143, dans discover_deribit_chain perp_bars = await collector.fetch_ohlcv(perp, start_ms, end_ms, "1D") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/collectors/deribit_collector.py", ligne 169, dans fetch_ohlcv result = await self._get("/public/get_tradingview_chart_data", { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/collectors/deribit_collector.py", ligne 86, dans _get response = await self._client.get(f"{DERIBIT_API_URL}{endpoint}", params=params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1768, dans get return await self.request( ^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1540, dans request return await self.send(request, auth=auth, follow_redirects=follow_redirects) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1629, dans send response = await self._send_handling_auth( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1657, dans _send_handling_auth response = await self._send_handling_redirects( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1694, dans _send_handling_redirects response = await self._send_single_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1730, dans _send_single_request response = await transport.handle_async_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 393, dans handle_async_request with map_httpcore_exceptions(): Fichier "/usr/lib/python3.12/contextlib.py", ligne 158, dans __exit__ self.gen.throw(value) Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 118, dans map_httpcore_exceptions raise mapped_exc(message) from exc httpx.ConnectError L'exception ci-dessus a été la cause directe de l'exception suivante: Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 184, dans _run_backtest config = await self._maybe_expand_rolling_options(config, catalog_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 427, dans _maybe_expand_rolling_options config = await expand_rolling_options_into_config(config, catalog_path, self._logger) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 59, dans expand_rolling_options_into_config raise RuntimeError( RuntimeError: échec de l'expansion de rolling_options (ConnectError: ); refus d'exécuter avec un calendrier d'options vide

Implémentation

Vente de puts hebdomadaire OTM en une seule jambe, garantie en cash, sur options européennes Deribit ETH, avec filtre de tendance uniquement. Chaque semaine, le framework résout la chaîne historique des puts hebdomadaires Deribit ETH (visant un strike OTM à ~25-delta via un offset de moneyness -6%) et la roule ; la stratégie SELLS un put à ~7 jours de l'expiration et le clôture ~24h avant le règlement. La barrière ONLY est un filtre de tendance prix uniquement : elle vend le put seulement lorsque le spot ETH est……Afficher plusAfficher moins

Vente de puts hebdomadaire OTM en une seule jambe, garantie en cash, sur options européennes Deribit ETH, avec filtre de tendance uniquement. Chaque semaine, le framework résout la chaîne historique des puts hebdomadaires Deribit ETH (visant un strike OTM à ~25-delta via un offset de moneyness -6%) et la roule ; la stratégie SELLS un put à ~7 jours de l'expiration et le clôture ~24h avant le règlement. La barrière ONLY est un filtre de tendance prix uniquement : elle vend le put seulement lorsque le spot ETH est au-dessus de sa SMA à ~50 jours (barres quotidiennes), en restant à l'écart des baisses confirmées. Sans fenêtre percentile IV pluriannuelle, elle traite chaque semaine éligible (~52/an sur la fenêtre de 365 jours) pour un nombre de trades statistiquement fiable, éliminant directement le mur de lookback à 4 trades qui a fait abandonner le sibling hebdomadaire ETH à barrière IV. Primaire = ETH-PERPETUAL.DERIBIT sur barres 1-DAY (horloge de roulement uniquement, jamais tradé). Dimensionnement garanti en cash (risk_frac 0.8), sans levier, 2 paramètres ajustés (offset du put, sma_window).

Résultats de vérification

CLEAN RESTART 2026-09-04 — l’historique des verdicts et les enregistrements d’apprentissage de cette exécution ont été supprimés, puis elle a été relancée depuis la vérification. Son abandon précédent était dû au pipeline, pas au marché : le banc de test Layer-2 associait incorrectement les méthodes auxiliaires @staticmethod (corrigé), QA rendait des verdicts définitifs sur les performances à partir d’un test de fumée non optimisé (supprimé — QA évalue désormais uniquement la correction), et les délais d’attente du bac à sable étaient dus à la pénurie de créneaux de backtest (corrigée). L’hypothèse et le code de la stratégie n’ont pas changé. Évaluez le code sur ses mérites ; les performances seront déterminées plus tard par le backtest complet et l’optimiseur.

Aucun nécessaire.

Layer-1 a signalé self._win.append() comme non borné, mais on_bar tronque la deque à chaque barre (while len > sma_window: popleft()), de sorte que sa croissance est limitée à sma_window. Faux positif.

Historique des itérations

Échec de la vérification (Layer 3 — backtest en bac à sable) : le test de fumée a dépassé la limite de temps réel de 300s. Cela signifie presque toujours que le travail effectué à chaque barre augmente avec la longueur de l’historique — par exemple, rescanner toute la série de financement/supplémentaire, ou reconstruire une liste et appeler min()/sorted() dans calculate_signal()/on_bar() à chaque barre. Pré-calculer les tableaux triés d’horodatages ONCE dans __init__ et utiliser bisect, ou mettre en cache les recherches indexées par horodatage, afin que le coût par barre soit O(log n) plutôt que O(n).

RuntimeError: rolling_options expansion failed (ConnectError: ); refusing to run with an empty option schedule 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……Afficher plusAfficher moins

RuntimeError: rolling_options expansion failed (ConnectError: ); refusing to run with an empty option schedule 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 The above exception was the direct cause of the following exception: 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 The above exception was the direct cause of the following exception: 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: rolling_options expansion failed (ConnectError: ); refusing to run with an empty option schedule

Raison d'abandon

backtest_failed: RuntimeError: échec de l'expansion de rolling_options (ConnectError: ); refus d'exécuter avec un calendrier d'options vide Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 101, dans map_httpcore_exceptions yield Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 394, dans handle_async_request resp = await self._pool.handle_async_request(req)……Afficher plusAfficher moins

backtest_failed: RuntimeError: échec de l'expansion de rolling_options (ConnectError: ); refus d'exécuter avec un calendrier d'options vide Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 101, dans map_httpcore_exceptions yield Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 394, dans handle_async_request resp = await self._pool.handle_async_request(req) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", ligne 256, dans handle_async_request raise exc from None Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection_pool.py", ligne 236, dans handle_async_request response = await connection.handle_async_request( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", ligne 101, dans handle_async_request raise exc Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", ligne 78, dans handle_async_request stream = await self._connect(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_async/connection.py", ligne 156, dans _connect stream = await stream.start_tls(**kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_backends/anyio.py", ligne 67, dans start_tls with map_exceptions(exc_map): Fichier "/usr/lib/python3.12/contextlib.py", ligne 158, dans __exit__ self.gen.throw(value) Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpcore/_exceptions.py", ligne 14, dans map_exceptions raise to_exc(exc) from exc httpcore.ConnectError L'exception ci-dessus a été la cause directe de l'exception suivante: Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 49, dans expand_rolling_options_into_config extra_i, extra_bt, sched = await expand_rolling_options(collector, spec, start, end) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/option_chain.py", ligne 242, dans expand_rolling_options contracts = await discover_deribit_chain( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/option_chain.py", ligne 143, dans discover_deribit_chain perp_bars = await collector.fetch_ohlcv(perp, start_ms, end_ms, "1D") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/collectors/deribit_collector.py", ligne 169, dans fetch_ohlcv result = await self._get("/public/get_tradingview_chart_data", { ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/data/collectors/deribit_collector.py", ligne 86, dans _get response = await self._client.get(f"{DERIBIT_API_URL}{endpoint}", params=params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1768, dans get return await self.request( ^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1540, dans request return await self.send(request, auth=auth, follow_redirects=follow_redirects) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1629, dans send response = await self._send_handling_auth( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1657, dans _send_handling_auth response = await self._send_handling_redirects( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1694, dans _send_handling_redirects response = await self._send_single_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_client.py", ligne 1730, dans _send_single_request response = await transport.handle_async_request(request) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 393, dans handle_async_request with map_httpcore_exceptions(): Fichier "/usr/lib/python3.12/contextlib.py", ligne 158, dans __exit__ self.gen.throw(value) Fichier "/opt/strategy-factory/.venv/lib/python3.12/site-packages/httpx/_transports/default.py", ligne 118, dans map_httpcore_exceptions raise mapped_exc(message) from exc httpx.ConnectError L'exception ci-dessus a été la cause directe de l'exception suivante: Trace d'appels (appel le plus récent en dernier): Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 184, dans _run_backtest config = await self._maybe_expand_rolling_options(config, catalog_path) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 427, dans _maybe_expand_rolling_options config = await expand_rolling_options_into_config(config, catalog_path, self._logger) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Fichier "/opt/strategy-factory/src/agents/backtest_agent.py", ligne 59, dans expand_rolling_options_into_config raise RuntimeError( RuntimeError: échec de l'expansion de rolling_options (ConnectError: ); refus d'exécuter avec un calendrier d'options vide

Stratmill est un outil de recherche et de paper trading, pas un conseil financier ni un courtier. Les résultats de backtest et de paper trading sont hypothétiques. Le trading comporte un risque de perte.