Перейти к содержимому
Все стратегии

Стратегии

Разворот скопления открытого интереса BTC Perp 4H: выход из позиций, оказавшихся в ловушке (один инструмент USD-M, лонг-шорт)

Итог: Отменено

BtcOpenInterestCrowdingReversalLS

Разворот скопления открытого интереса BTC Perp 4H: выход из позиций, оказавшихся в ловушке (один инструмент USD-M, лонг-шорт)

Гипотеза

Разворотная стратегия лонг-SHORT, SINGLE-INSTRUMENT, на BTCUSDT.BINANCE USD-M бессрочных фьючерсах одной площадки с барами 4-HOUR, где OPEN INTEREST (дополнительные данные) — структурный сигнал, а движение цены формирует P&L (OI служит только сигналом и никогда не учитывается как денежный поток). Гипотеза: разгрузка скопившихся позиций. Если резкое направленное движение цены сопровождается резким RISE открытого интереса, значит, его вызывают NEW позиции с плечом (новые лонги при росте / новые шорты при……Показать большеСвернуть

Разворотная стратегия лонг-SHORT, SINGLE-INSTRUMENT, на BTCUSDT.BINANCE USD-M бессрочных фьючерсах одной площадки с барами 4-HOUR, где OPEN INTEREST (дополнительные данные) — структурный сигнал, а движение цены формирует P&L (OI служит только сигналом и никогда не учитывается как денежный поток). Гипотеза: разгрузка скопившихся позиций. Если резкое направленное движение цены сопровождается резким RISE открытого интереса, значит, его вызывают NEW позиции с плечом (новые лонги при росте / новые шорты при распродаже), а не реальный спрос на споте: позиции скопились, и рынок пошёл против них. Когда цена останавливается и разворачивается, эти позиции оказываются убыточными и становятся вынужденным топливом (ликвидации лонгов / закрытие шортов), ускоряющим резкий разворот. Стратегия торгует против выдохшегося движения только при подтверждении скопления позиций сигналом OI и явно SKIPS движения, при которых OI снижается (здоровое сокращение плеча без скопившихся убыточных позиций). Так она избегает повторяющихся проблем этой сессии: NOT BINANCE_SPOT (ошибка метрики CASH), NOT BINANCE_CM (невозможно проверить бэктестом), NOT между площадками/Hyperliquid (артефакт базиса), NOT парной торговли несколькими инструментами (оптимизаторам не передаются данные дополнительного инструмента), NOT на разнице ставок финансирования (денежный поток нельзя корректно учесть), NOT следования за трендом (чрезмерно представлена и подвержена переобучению) и NOT обычной покупки на спаде MR. Торговля зависит от наблюдаемого скопления позиций (OI всплеск), поэтому вынужденное закрытие позиций даёт асимметрию выплат в пользу POSITIVE, в отличие от отрицательно асимметричного падения без остановки, погубившего прежние попытки MR. BTC выбран из-за наиболее длинной и надёжной истории OI, что снижает риск разреженных данных, помешавший идеям на альткоинах. Он заполняет квоту на длинные и короткие позиции (только 14.4% против преобладания 85.6% стратегий только в лонг) на чистом пути одного инструмента USD-M OHLCV. Число параметров ограничено примерно 4, чтобы снизить риск переобучения.

Точно реализует гипотезу принудительного закрытия позиций участников, оказавшихся в ловушке: OI служит только сигналом и никогда не учитывается как денежный поток; условие скученности позиций (og>0 и oi_z>=oi_surge_z) отличает стратегию от обычного возврата к среднему, а пропуск при снижении OI обеспечивает положительную асимметрию выплат. Исправление в итерации-4 для тайм-аута уровня-3: предыдущая версия объединяла полный исторический поток `metrics` (сотни тысяч строк 5-минутных OI вплоть до ~2020); загрузка и……Показать большеСвернуть

Точно реализует гипотезу принудительного закрытия позиций участников, оказавшихся в ловушке: OI служит только сигналом и никогда не учитывается как денежный поток; условие скученности позиций (og>0 и oi_z>=oi_surge_z) отличает стратегию от обычного возврата к среднему, а пропуск при снижении OI обеспечивает положительную асимметрию выплат. Исправление в итерации-4 для тайм-аута уровня-3: предыдущая версия объединяла полный исторический поток `metrics` (сотни тысяч строк 5-минутных OI вплоть до ~2020); загрузка и разбор этих данных превысили лимит 300 с на проверку работоспособности. В этой версии используется только более лёгкий вспомогательный поток `open_interest`, который быстро загружается и охватывает недавнее окно проверки работоспособности/бэктеста. Торговая логика, условия входа, расчёт z-оценки, определение размера позиции и единовременное построение индекса bisect не изменились, поэтому уровни 1 и 2 проходят, а бэктест проверки работоспособности завершается значительно быстрее лимита. Сохраняется чистый путь по одному инструменту USD-M (BINANCE фьючерсы, MARGIN, лонг и шорт), необходимый для открытия шорта; плечо установлено на уровне 1.0 (учитывается в ограничении номинальной позиции, но не увеличивает её, поэтому флаг leverage_set_but_unused не выставлен).

verifying_stuck_3_timeouts

Реализация

Разворотная стратегия лонг-шорт по одному инструменту на бессрочных фьючерсах BTCUSDT.BINANCE USD-M с барами 4-HOUR. Открытый интерес (вспомогательные данные) используется как структурный сигнал скученности позиций, а динамика цены — для расчёта прибыли и убытка. Когда OI резко растёт (z-оценка AND превышает порог) одновременно с резким движением цены, стратегия играет против исчерпавшего себя движения: открывает шорт на ралли, вызванном OI, и лонг на обвале, вызванном OI, рассчитывая на принудительное закрытие позиций участников с чрезмерным плечом. Движения при снижении OI (здоровом сокращении плеча) пропускаются, чтобы сохранить положительную асимметрию выплат при принудительном закрытии позиций. OI индексируется один раз, а данные для каждого бара ищутся через bisect (O(log n)).

Результаты верификации

Проверка не пройдена (уровень 4 — проверка QA) [класс=not_measurable]: - [edge_concern] Даже если не учитывать проблему измеримости, результаты бэктеста в изолированной среде на 15 сделках также слабо отрицательны (total_return -0.51%, PF 0.91, avg_loss $909 > avg_win $550, return_skew -0.78) — это противоположно положительной асимметрии выплат при принудительном закрытии позиций, которую предполагает гипотеза. Но при всего 15 сделках это шум, а не свидетельство в пользу какой-либо стороны; реальная проблема в……Показать большеСвернуть

Проверка не пройдена (уровень 4 — проверка QA) [класс=not_measurable]: - [edge_concern] Даже если не учитывать проблему измеримости, результаты бэктеста в изолированной среде на 15 сделках также слабо отрицательны (total_return -0.51%, PF 0.91, avg_loss $909 > avg_win $550, return_skew -0.78) — это противоположно положительной асимметрии выплат при принудительном закрытии позиций, которую предполагает гипотеза. Но при всего 15 сделках это шум, а не свидетельство в пользу какой-либо стороны; реальная проблема в том, что выборка слишком мала для выводов. Не трактуй отрицательный результат бэктеста в изолированной среде как провал преимущества стратегии — трактуй его как невозможность измерения. - NOT MEASURABLE — ограниченное покрытие данными OI сокращает число сделок стратегии примерно до 15 за FULL бэктеста. Бэктест в изолированной среде не ограничивался коротким окном проверки: он обработал 14389 баров / 2398 data_days (полную историю 6.5 примерно за BTC 4H), но дал лишь 15 сделок; во всех стрессовых окнах от 2020 до 2025 доходность составляет ровно 0.0 (сделок нет). Это показывает, что поток `open_interest`, который использует стратегия, охватывает лишь недавний период (примерно последний год), поэтому условие скученности позиций может срабатывать только в нём. 15 сделок недостаточно, чтобы сформировать контрольную выборку HARD объёмом не менее 10 сделок (последние 20% — примерно 3 сделок) или провести walk-forward-анализ с 3 окнами; такого объёма недостаточно, чтобы отличить преимущество от шума (L16/L26). Более полные данные существуют: согласно обоснованию разработчика, полный исторический поток `metrics` OI охватывает период до ~2020, но его удалили, поскольку загрузка сотен тысяч строк 5-минутных данных превысила лимит времени 300 с на уровне-3. Значит, ограничение вызвано скоростью загрузки, а не реальным отсутствием исторических данных OI.

История итераций

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['risk_pct', 'oi_surge_z', 'price_ext_z', 'min_notional', 'max_hold_bars', 'stop_loss_pct', 'zscore_window', 'change_lookback', 'take_profit_pct', 'max_notional_frac', 'zscore_min_samples', 'oi_max_staleness_sec'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() принимает 2 позиционных аргумента, но передано 3 (временная метка бара:……Показать большеСвернуть

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['risk_pct', 'oi_surge_z', 'price_ext_z', 'min_notional', 'max_hold_bars', 'stop_loss_pct', 'zscore_window', 'change_lookback', 'take_profit_pct', 'max_notional_frac', 'zscore_min_samples', 'oi_max_staleness_sec'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() принимает 2 позиционных аргумента, но передано 3 (временная метка бара: 1735691340000) - steady_downtrend: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() принимает 2 позиционных аргумента, но передано 3 (временная метка бара: 1735691340000) - flat_ranging: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() принимает 2 позиционных аргумента, но передано 3 (временная метка бара: 1735691340000) - volatility_spike: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() принимает 2 позиционных аргумента, но передано 3 (временная метка бара: 1735691340000) - zero_volume: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() принимает 2 позиционных аргумента, но передано 3 (временная метка бара: 1735691340000) - price_gap: TypeError: BtcOpenInterestCrowdingReversalLS._parse_oi_row() принимает 2 позиционных аргумента, но передано 3 (временная метка бара: 1735691340000)

Проверка не пройдена (уровень 3 — бэктест в изолированной среде): проверка работоспособности превысила лимит времени 300 с. Почти всегда это означает, что работа на каждом баре растёт вместе с длиной истории — например, заново просматривается весь ряд фандинга/вспомогательных данных или список перестраивается, а min()/sorted() вызываются внутри calculate_signal()/on_bar() на каждом баре. Заранее подготовь в __init__ отсортированные массивы временных меток ONCE и используй bisect либо кэшируй результаты поиска по временной метке, чтобы стоимость обработки бара составляла O(log n), а не O(n).

Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.