Перейти до вмісту

Переглянути оригінал

DeribitEthWeeklyPutWriteTrendGatedOnly

Гіпотези

Щотижневий Put-Write OTM на Deribit ETH, Забезпечений Готівкою — Лише З Фільтром Тренду, Фіксована ~25-Delta, NO Довговіконний Фільтр IV (Одноногий Збір VRP; Безпосередньо Усуває Стіну Обмеження у 4 Угод, Через Яку Було Залишено Споріднену Стратегію ETH-Weekly)

Гіпотези

SINGLE-LEG, повністю забезпечена готівкою (cash-collateralized) щотижнева PUT-WRITING програма на опціонах ETH Deribit — другий за ліквідністю базовий актив крипто-опціонів, що повторно використовує шлях виконання EXACT (вибір страйку через грецькі коефіцієнти, щотижневий розрахунок у готівці) з просунутого фабрикою Sharpe-12.2 put-write Deribit-BTC-weekly. Він навмисно розроблений, щоб FIX єдину, неодноразово діагностовану причину, через яку споріднена стратегія ETH-weekly була залишена протягом 8 ітерацій: її подвійний фільтр IV-rank + IV>RV вимагав ~560-денного плаваючого вікна перегляду (rolling lookback), що обмежило її лише 4 угодами / metrics_reliable=false — структурний глухий кут, який розробник так і не зміг вирішити. Ця версія DROPS довговіконний фільтр IV повністю та зберігає ONLY фільтр тренду (фільтр, який довів свою значущість у просунутому переможці BTC), виписуючи фіксований пут ~25-delta OTM ETH щотижня, коли це можливо. Без багаторічної залежності від IV-перцентиля, вона спрацьовує ~40-52 разів/рік за наявну історію щотижневих опціонів ETH на Deribit → статистично надійна кількість угод, що усуває саме ту стіну обмеження в 4 угод. Вона заповнює найменш представлений майданчик (опціони: 5.5% Deribit + 0.1% Binance проти цілі ≥15%) та диверсифікує портфель опціонів від BTC-only до другого некорельованого за волатильністю базового активу. Це NOT багатоногова структура (L2), NOT комірка, обмежена даними (щотижневий ланцюг ETH та грецькі коефіцієнти каталогізовані та доведено виконувані через споріднену стратегію BTC), NOT спрямована (directional). Навмисно 2 параметри (дельта путу, довжина фільтра тренду), щоб протистояти перенавчанню (overfit).

Гіпотези

Ітерація 3 виправляє таймаут реального часу Layer-3 лише зміною конфігурації; CODE стратегії залишається незмінним (він вже пройшов Layers 1-2, робота на кожному барі має складність O(1) через інкрементну накопичувальну суму SMA, і немає жодних сканувань min()/sorted()/історії на кожному барі). Діагностика: ітерація 2 правильно перенесла визначення первинного інструменту та ноги (primary+leg resolution) на 1-DAY, але STILL все одно перевищила час очікування, що доводить, що вузьким місцем є не кількість барів. Читання src/data/option_chain.py: discover_deribit_chain надсилає мережевий запит fetch_ohlcv для кожного кандидата-страйку кожної щотижневої експірації EACH, а пісочниця Layer-3 охоплює lookback_days (expand_rolling_options / стандартне значення конвеєра 365). Тож вартість розгортання масштабується з кількістю щотижневих експірацій = lookback_days, незалежно від таймфрейму. Конфігурація iter-2 містила lookback_days ~730 (~104 експірацій, подвоюючи кількість запитів), що перевищило бюджет у 300с. Повернення lookback_days до 365 (~52 експірацій) вдвічі скорочує запити на експірації та завантаження ніг, відповідаючи саме тому масштабу, за якого доведені споріднені стратегії ETH/BTC weekly put-write проходять Layer 3, при цьому все ще охоплюючи ~52 придатних тижнів, тому кількість угод залишається статистично надійною (~30-52 виписувань після фільтра тренду) і значно перевищує глухий кут у 4 угод. Все інше збережено та доведено: пряме успадкування від RollingOptionsStrategy (Layer-1 розпізнає це; абстрактні хуки 4 фізично присутні), відсутність смоук-шляху (реальні ноги опціонів торгуються через розгорнутий розклад, що задовольняє options_no_option_trades), єдиний ціновий фільтр тренду в _enter_leg, визначення первинного інструменту 1-DAY ETH-PERPETUAL + визначення ноги 1-DAY (те саме визначення, яке використовує успішна споріднена стратегія ETH put-write), розмір позиції, забезпечений готівкою (risk_frac 0.8, кредитне плече 1.0 відповідно до обмеження майданчика опціонів), та дизайн із 2 параметрами (зсув путу + sma_window).

Гіпотези

backtest_failed: RuntimeError: не вдалося розгорнути rolling_options (ConnectError: ); відмова від запуску з порожнім розкладом опціонів Traceback (найновіший виклик - останній): 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 Наведений вище виняток є безпосередньою причиною наступного винятку: Traceback (найновіший виклик - останній): 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 Наведений вище виняток є безпосередньою причиною наступного винятку: Traceback (найновіший виклик - останній): 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 (ConnectError: ); відмова від запуску з порожнім розкладом опціонів

Реалізація

Однонога, забезпечена готівкою щотижнева стратегія OTM put-writing на європейських опціонах ETH Deribit, лише з фільтром тренду. Щотижня фреймворк визначає історичний щотижневий ланцюг путів ETH на Deribit (націлюючись на страйк ~25-delta OTM через зсув мані-несу (moneyness offset) -6%) і перегортає його (rolls it); стратегія SELLS один пут за ~7 днів до експірації та закриває його за ~24год до розрахунку. Фільтр ONLY — це виключно ціновий фільтр тренду: він виписує пут лише тоді, коли спот ETH перевищує його ~50-денну SMA (денні бари), пропускаючи підтверджені низхідні тренди. Без багаторічного вікна IV-перцентиля вона торгує кожного придатного тижня (~52/рік за вікно у 365 днів) для статистично надійної кількості угод, безпосередньо усуваючи стіну обмеження у 4 угод, через яку було залишено споріднену стратегію IV-gated ETH-weekly. Первинний = ETH-PERPETUAL.DERIBIT на барах 1-DAY (лише годинник перегортання, ніколи не торгується). Розмір позиції забезпечений готівкою (risk_frac 0.8), без кредитного плеча, 2 налаштованих параметра (зсув путу, sma_window).

Результати перевірки

CLEAN RESTART 2026-09-04 — історію вердиктів та записи навчання цього запуску було видалено, і його перезапущено з етапу верифікації. Його попереднє припинення було спричинене конвеєром (pipeline), а не ринком: тестовий стенд Layer-2 неправильно прив'язував допоміжні функції @staticmethod (виправлено), QA видавав остаточні вердикти щодо продуктивності на неоптимізованому смоук-тесті (видалено — QA тепер оцінює лише коректність), а таймаути пісочниці виникали через нестачу слотів для бектестів (виправлено). Гіпотеза та код стратегії не змінилися. Перевіряйте код за його суттю; продуктивність визначається пізніше повним бектестом та оптимізатором.

Результати перевірки

Не потрібно.

Результати перевірки

Layer-1 позначив self._win.append() як необмежений, але on_bar обрізає деку (deque) на кожному барі (while len > sma_window: popleft()), тому зростання обмежене до sma_window. Хибне спрацювання (false positive).

Iteration History

Верифікацію не пройдено (Layer 3 — бектест у пісочниці): смоук-тест перевищив ліміт реального часу у 300с. Це майже завжди означає роботу для кожного бара, що масштабується з історією — наприклад, повторне сканування всієї серії funding/додаткових даних, або перебудову списку та виклик min()/sorted() всередині calculate_signal()/on_bar() на кожному барі. Попередньо обчисліть відсортовані масиви часових міток ONCE у __init__ та використовуйте bisect, або кешуйте пошук за ключем часової мітки, щоб вартість на бар була O(log n), а не O(n).

Iteration History

RuntimeError: не вдалося розгорнути rolling_options (ConnectError: ); відмова від запуску з порожнім розкладом опціонів 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 Наведений вище виняток був безпосередньою причиною наступного винятку: 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 Наведений вище виняток був безпосередньою причиною наступного винятку: 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 (ConnectError: ); відмова від запуску з порожнім розкладом опціонів

Причина відмови

backtest_failed: RuntimeError: не вдалося розгорнути rolling_options (ConnectError: ); відмова від запуску з порожнім розкладом опціонів Traceback (найновіший виклик - останній): 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 Наведений вище виняток є безпосередньою причиною наступного винятку: Traceback (найновіший виклик - останній): 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 Наведений вище виняток є безпосередньою причиною наступного винятку: Traceback (найновіший виклик - останній): 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 (ConnectError: ); відмова від запуску з порожнім розкладом опціонів
Звіт про стратегію

Stratmill — це інструмент для дослідження та паперової торгівлі, а не фінансова консультація чи брокер. Результати бектестів і паперової торгівлі є гіпотетичними. Торгівля пов'язана з ризиком втрати коштів.