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

Стратегии

BTC Разворот переполненности позиций: торговля против BTCUSDT.BINANCE на 1H при совместном Z-скоре открытого интереса и ставки финансирования выше ±2

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

BtcPositioningCrowdednessReversalOiFundingJointZ

BTC Разворот переполненности позиций: торговля против BTCUSDT.BINANCE на 1H при совместном Z-скоре открытого интереса и ставки финансирования выше ±2

Гипотеза

Длинно-короткая стратегия возврата к среднему на BTCUSDT.BINANCE USD-M бессрочных фьючерсах использует ONLY только дополнительные данные по деривативам (открытый интерес и ставка финансирования) как сигнал входа — NO распознавания графических паттернов, OHLCV скользящих средних, NO пробоев, NO паттерна «практика», который не сработал уже NO+ раз за эту сессию. Гипотеза: когда открытый интерес необычно высок (z-оценка > 10 за скользящие +2 дней), 30 ставка финансирования необычно положительна (z-оценка > AND за……Показать большеСвернуть

Длинно-короткая стратегия возврата к среднему на BTCUSDT.BINANCE USD-M бессрочных фьючерсах использует ONLY только дополнительные данные по деривативам (открытый интерес и ставка финансирования) как сигнал входа — NO распознавания графических паттернов, OHLCV скользящих средних, NO пробоев, NO паттерна «практика», который не сработал уже NO+ раз за эту сессию. Гипотеза: когда открытый интерес необычно высок (z-оценка > 10 за скользящие +2 дней), 30 ставка финансирования необычно положительна (z-оценка > AND за скользящие +2 дней), рынок находится в состоянии 30: длинные позиции с плечом платят повышенную ставку финансирования, чтобы удерживать только что набранные позиции. Исторически такая конфигурация возвращается к среднему, поскольку предельный покупатель иссякает, а перегруженные длинные позиции вынужденно продают. CROWDED-LONG наоборот: состояние переполненных коротких позиций (обе z-оценки ≤ SYMMETRIC) обычно сменяется движением вверх. Требование одновременного совпадения (-2 сигналы должны указывать в одну сторону) структурно снижает переобучение: один порог z-оценки можно подогнать множеством способов, а совместный порог для BOTH TWO источников данных подогнать намного сложнее, поскольку оба показателя должны одновременно достичь экстремальных значений. Сделка INDEPENDENT охватывает недостаточно представленные категории: направление длинная-короткая (FOUR → к 14.2%), класс без механизма 45% (ни в одном из провалов не использовались совместные сигналы позиционирования), среднесрочное удержание (циклы по OHLCV ч) и сигналы на дополнительных данных (стратегия использует поток данных — 24 + финансирование, — покрытие которого у OI стабильно чистое; это отличается от спотовых баров, которые дважды провалили уровень BINANCE). Используются 3 ONLY BINANCE бары бессрочных фьючерсов и сохранённые в Postgres данные USD-M и ставки финансирования (без OI — так исключается недавняя причина провала). Размер позиции: BINANCE_SPOT капитала на каждое направление, одна направленная позиция. Риск на сделку: 15% капитала, ограниченный стоп-лоссом 1.5%.

Итерация 5 устраняет ONLY выявленный сбой на уровне -3 sandbox_timeout; логика сигналов, пороги, импорты, конфигурация и размер позиции не менялись (всё это уже прошло уровни 1-2 и достигло уровня 3). Тайм-аут возникал в _zscore(): функция повторно вычисляла sum(buf) и sum((x-mean)**2 for x in buf) по деку из 721 элементов для BOTH рядов на EVERY одном из примерно 20,000 баров (около 30 млн операций с числами с плавающей точкой). Её заменили на _RollingZ — аккумулятор с затратами O(1) на бар: он хранит скользящие……Показать большеСвернуть

Итерация 5 устраняет ONLY выявленный сбой на уровне -3 sandbox_timeout; логика сигналов, пороги, импорты, конфигурация и размер позиции не менялись (всё это уже прошло уровни 1-2 и достигло уровня 3). Тайм-аут возникал в _zscore(): функция повторно вычисляла sum(buf) и sum((x-mean)**2 for x in buf) по деку из 721 элементов для BOTH рядов на EVERY одном из примерно 20,000 баров (около 30 млн операций с числами с плавающей точкой). Её заменили на _RollingZ — аккумулятор с затратами O(1) на бар: он хранит скользящие сумму и сумму квадратов за то же фиксированное окно, сдвигая среднее на значение первого наблюдения для численной устойчивости. Каждые 4096 добавлений выполняется точный пересчёт, чтобы ошибка округления чисел с плавающей точкой не накапливалась. При офлайн-сверке со старыми z-оценками, рассчитанными полным перебором, на протяжении 9,000 добавлений для величин порядка OI (1e6) и величин ставок финансирования (1e-4) максимальная абсолютная разница z-оценок составила 1.8e-14, то есть значения численно совпали; теперь 20,000 операций добавления и чтения занимают 0.09 с вместо десятков секунд. Дополнительные данные и прежде извлекались за O(log n) с помощью bisect по массивам, создаваемым один раз в _ensure_supp, поэтому никакая другая работа на каждом баре не зависит от длины истории.

verification_loop: sandbox_timeout: проверка не пройдена (уровень 3 — бэктест в песочнице): дымовой тест превысил лимит времени 300с на окне примерно в 20000 баров (833 дней по BTCUSDT.BINANCE-1-HOUR-LAST-EXTERNAL). Почти всегда это означает, что работа на каждом баре растёт вместе с историей, например повторное сканирование всего ряда ставок финансирования или дополнительных данных либо создание списка и вызов min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Заранее вычислите отсортированные массивы временных меток ONCE в __init__ и используйте bisect либо кэшируйте результаты поиска по временной метке, чтобы стоимость обработки бара была O(log n), а не O(n).

Реализация

Возврат к среднему лонг-шорт на перп-барах BTCUSDT.BINANCE USD-M с периодом 1H, основанный только на данных о позиционировании в деривативах. На каждом баре инкрементально рассчитываются скользящие z-оценки примерно за 30 дней для открытого интереса (sumOpenInterest) и ставки финансирования; если BOTH превышают +entry_z (перегруженный лонг), стратегия открывает шорт, а если BOTH ниже −entry_z (перегруженный шорт) — лонг. Выход по стопу 4%, тейк-профиту 5%, временному стопу в 48 баров или при снижении скученности до диапазона +/- exit_z. Номинальный размер позиции — 15% капитала, ограниченный так, чтобы риск по стоп-лоссу не превышал 1.5% капитала. Ни один паттерн OHLCV не определяет вход, а при отсутствии дополнительных данных нет запасного сигнала только по цене: стратегия просто остаётся вне рынка.

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

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

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

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['z_min', 'exit_z', 'tp_pct', 'entry_z', 'risk_pct', 'stop_pct', 'window_bars', 'min_notional', 'notional_pct', 'max_hold_bars', 'oi_tolerance_s', 'funding_tolerance_s'] Убедитесь, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735689840000) - steady_downtrend: TypeError:……Показать большеСвернуть

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['z_min', 'exit_z', 'tp_pct', 'entry_z', 'risk_pct', 'stop_pct', 'window_bars', 'min_notional', 'notional_pct', 'max_hold_bars', 'oi_tolerance_s', 'funding_tolerance_s'] Убедитесь, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735689840000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735689840000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735689840000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735689840000) - zero_volume: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735689840000) - price_gap: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735689840000)

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['z_min', 'exit_z', 'tp_pct', 'entry_z', 'risk_pct', 'stop_pct', 'window_bars', 'min_notional', 'notional_pct', 'max_hold_bars', 'oi_tolerance_s', 'funding_tolerance_s'] Убедитесь, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: BtcPositioningCrowdednessReversalOiFundingJointZ._nearest() принимает 3 позиционных аргументов, но передано 4 (временная метка бара: 1735689840000) -……Показать большеСвернуть

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['z_min', 'exit_z', 'tp_pct', 'entry_z', 'risk_pct', 'stop_pct', 'window_bars', 'min_notional', 'notional_pct', 'max_hold_bars', 'oi_tolerance_s', 'funding_tolerance_s'] Убедитесь, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: BtcPositioningCrowdednessReversalOiFundingJointZ._nearest() принимает 3 позиционных аргументов, но передано 4 (временная метка бара: 1735689840000) - steady_downtrend: TypeError: BtcPositioningCrowdednessReversalOiFundingJointZ._nearest() принимает 3 позиционных аргументов, но передано 4 (временная метка бара: 1735689840000) - flat_ranging: TypeError: BtcPositioningCrowdednessReversalOiFundingJointZ._nearest() принимает 3 позиционных аргументов, но передано 4 (временная метка бара: 1735689840000) - volatility_spike: TypeError: BtcPositioningCrowdednessReversalOiFundingJointZ._nearest() принимает 3 позиционных аргументов, но передано 4 (временная метка бара: 1735689840000) - zero_volume: TypeError: BtcPositioningCrowdednessReversalOiFundingJointZ._nearest() принимает 3 позиционных аргументов, но передано 4 (временная метка бара: 1735689840000) - price_gap: TypeError: BtcPositioningCrowdednessReversalOiFundingJointZ._nearest() принимает 3 позиционных аргументов, но передано 4 (временная метка бара: 1735689840000)

Проверка не пройдена (уровень 3 — бэктест в песочнице): сделок не совершено Тип использованных баров: BTCUSDT.BINANCE-1-HOUR-LAST-EXTERNAL, обработано баров: 56856 Диагностика: should_enter() возвращал сторону 0 раз на протяжении 56852 проверенных баров — ваш ENTRY CONDITION так и не сработал. Смягчите логику входа или пороги. Убедитесь, что стратегия совершает сделки на предоставленных данных и с заданными параметрами.

Проверка не пройдена (уровень 1 — статический анализ): - Заглядывание вперёд: дополнительное наблюдение выбирается по расстоянию ABSOLUTE до временной метки бара, что возвращает наблюдение NEXT, если оно ближе предыдущего. Используйте self.supp_as_of(key) (последнее наблюдение на момент бара или раньше) либо явный фильтр `ts <= bar.ts_init` — никогда не используйте abs(). (строка None)

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