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

Стратегии

BTC Perp: импульс по потоку тейкеров (USD-M, лонг-шорт, 1H, тренд с фильтром дисбаланса агрессивных сделок, выход при расхождении потока)

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

BtcTakerFlowConfirmedMomentumLS

Сводка по итогам

BtcTakerFlowConfirmedMomentumLS работала точно по замыслу: 2064 сделок за всю историю 2019-2026 BTC, активны длинные и короткие позиции, разумная экспозиция 41.6%, ликвидаций нет. Но тезис о продолжении движения с подтверждением потоком тейкеров не дал преимущества. Бэктест показал -21.1%, Sharpe -1.39 (доверительный интервал полностью отрицательный), фактор прибыли 0.797 и убытки каждый год после 2020; при ребалансировке 1H комиссии съели 22.4% валовой прибыли. Поскольку сигнал был везде отрицательным и не имел прибыльной области для оптимизации, аналитик отказался от него на этапе проверки бэктеста, не тратя часы на walk-forward-оптимизацию; этапы оптимизации и анализа после неё не проводились. В записи указано, что симметричные убытки в обе стороны отчасти подсказывают инвертированную гипотезу возврата к среднему, но это идея для будущей проверки, а не исправление данной стратегии.

Гипотеза

Направленная стратегия лонг-SHORT, SINGLE-INSTRUMENT на одной площадке для бессрочных фьючерсов BTCUSDT.BINANCE USD-M с барами 1–HOUR: позиция открывается только ONLY, когда устойчивый поток TAKER AGGRESSOR FLOW подтверждает направление ценового тренда CONFIRMED. Это третья стратегия класса механизма ONLY с прошедшей отбор стратегией на этой фабрике (одна стратегия с доходностью, объяснимой движением цены, и фильтром по криптонативному подтверждающему сигналу — ср. прошедший отбор тренд с подтверждением ставками……Показать большеСвернуть

Направленная стратегия лонг-SHORT, SINGLE-INSTRUMENT на одной площадке для бессрочных фьючерсов BTCUSDT.BINANCE USD-M с барами 1–HOUR: позиция открывается только ONLY, когда устойчивый поток TAKER AGGRESSOR FLOW подтверждает направление ценового тренда CONFIRMED. Это третья стратегия класса механизма ONLY с прошедшей отбор стратегией на этой фабрике (одна стратегия с доходностью, объяснимой движением цены, и фильтром по криптонативному подтверждающему сигналу — ср. прошедший отбор тренд с подтверждением ставками финансирования ETH), но здесь используется сигнал ORTHOGONAL, которого нет у родственных стратегий: дисбаланс объёма покупок и продаж тейкеров (какая сторона агрессивно поднимает оферы или бьёт по биду), отличный от ставок финансирования (стратегия-родственник ETH) и изменения открытого интереса (стратегия-родственник SOL). Основной тезис: движение цены при устойчивом преобладании покупок тейкерами-BUY отражает реальный спрос, готовый платить больше по стакану (подлинное продолжение движения); движение при устойчивом преобладании продаж тейкерами-SELL отражает реальное предложение, бьющее по биду (подлинное продолжение снижения). Если направление цены и агрессивный поток DISAGREE (например, цена растёт, а в ленте преобладают продавцы), движение не подкреплено и, вероятно, выдохнется — стратегия остаётся вне рынка. CRITICAL DESIGN NOTES, отличающие эту стратегию от закрытых семейств: (1) SINGLE стратегия с доходностью, объяснимой движением цены, — без дельта-нейтральной пары и без CARRY ставок финансирования/базиса (ставки финансирования здесь никогда не учитываются как денежный поток), что исключает ловушки неподтверждённого переносимого дохода и базиса ниже комиссий; (2) поток тейкеров — только SIGNAL, подтверждённая роль криптонативных данных; (3) NOT без межбиржевого арбитража / HYPERLIQUID, NOT COIN-M, NOT спотового базиса к бессрочным фьючерсам, NOT поперечного среза, NOT диспетчеризации тиков (движок баров полностью учитывает агрегированный объём тейкеров за бар); (4) у BTC самая глубокая и длинная история потока тейкеров и цен среди криптоактивов, поэтому данных для окон walk-forward достаточно — ограничения из-за скудных данных нет; (5) фильтр срабатывает CONTINUOUSLY на протяжении каждого трендового периода (а не только при редких событиях), поэтому окна OOS плотно заполнены — это противоположно характерной для класса накопления просадки сигнатуре «OOS — одни нули» с редкими событиями, из-за которой класс был отклонён. Намеренно простая конструкция: 3 настраиваемых параметров (trend_lookback, taker_window, taker_threshold), чтобы снизить риск переобучения.

Итерация 4: исправление тайм-аута песочницы Layer-3 (более 300с реального времени). Прежний код на каждом баре `_flow_over_window` заново создавал срез `self._taker_ratio_vals[lo:hi]` и вызывал `sum()` примерно на каждом из ~70 тыс. баров 1H — работа O(окно), объём которой вырос после объединения с плотным потоком 5-минутных данных `metrics` (~525 тыс. строк с 2021). Исправление заранее вычисляет кумулятивный массив PREFIX-SUM ONCE в `_build_taker` (вместе с уже отсортированным списком временных меток), поэтому……Показать большеСвернуть

Итерация 4: исправление тайм-аута песочницы Layer-3 (более 300с реального времени). Прежний код на каждом баре `_flow_over_window` заново создавал срез `self._taker_ratio_vals[lo:hi]` и вызывал `sum()` примерно на каждом из ~70 тыс. баров 1H — работа O(окно), объём которой вырос после объединения с плотным потоком 5-минутных данных `metrics` (~525 тыс. строк с 2021). Исправление заранее вычисляет кумулятивный массив PREFIX-SUM ONCE в `_build_taker` (вместе с уже отсортированным списком временных меток), поэтому скользящее среднее теперь вычисляется за `(prefix[hi]-prefix[lo])/(hi-lo)` — O(1), без выделения памяти и суммирования на каждом баре. В запасной ветке теперь повторно используется существующий индекс bisect `hi` (`j = hi - 1`) вместо вычисления второго `bisect_right`, что убирает ещё один вызов O(log n) на каждом баре. Логика сигнала, импорты, условия входа/выхода и размер позиции не менялись, поэтому Layers 1 и 2 (уже проходят) не затронуты; снижены лишь вычислительные затраты на бар. Площадка остаётся BINANCE futures (используются короткие позиции), плечо=1.0 (при расчёте размера используется только position_pct, поэтому нет риска ограничения из-за неиспользуемого плеча).

Преимущества нет, и это не ошибка кода, которую разработчик может исправить: стратегия работает точно по замыслу (2064 чистых сделок, полная история, верная фильтрация по потоку тейкеров), но сигнал продолжения импульса с подтверждением потоком тейкеров имеет отрицательное математическое ожидание на всей выборке за ENTIRE 6.5 года: Sharpe -1.39 (полностью отрицательный CI), profit_factor 0.797, убыток в каждом году после -2020 (2022 -5.9%, 2023 -10.5%, 2024 -3.8%, 2025 -7.1%), при этом information_ratio -0.78 относительно бенчмарка BTC. Оптимизация не спасёт сигнал, который стабильно убыточен: нет прибыльной области параметров для настройки, поэтому 2 часов walk-forward-оптимизации пропадут зря. Устойчивый симметричный убыток по длинным и коротким позициям отчасти согласуется с гипотезой об инвертированном сигнале, но это гипотеза для переосмысления руководителем исследований (возврат к среднему на неподкреплённых движениях вместо продолжения тренда), а не настройка параметров; здесь она не подтверждена. Не оптимизируй.

Реализация

Импульсная стратегия лонг-шорт по бессрочному контракту BTC USD-M с барами 1H открывает направленную позицию ONLY, если ценовой тренд за последние trend_lookback часов подтверждён устойчивым потоком агрессивных сделок тейкеров в том же направлении (среднее отношение покупок к продажам тейкеров за последние taker_window часов пересекает симметричный порог 1.0). Длинная позиция открывается при восходящем тренде и доминировании покупок, короткая — при нисходящем тренде и доминировании продаж. Выход в нейтральную позицию происходит при расхождении потока и тренда (развороте тренда или смене доминирующего направления потока), защитном стопе или достижении максимального срока удержания. Поток тейкеров используется только как сигнал; он объединён из отдельного потока taker_ratio и потока метрик (taker_long_short_vol_ratio истории, начиная примерно с 2021), поэтому бэктест охватывает всю историю.

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

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

Обзор бэктеста

Шарп
-1,39
Общая доходность
-21,15%
Максимальная просадка
27,53%
Всего сделок
2064
Доля прибыльных
23,8%
Профит-фактор
0,80

Реализация корректна: 2064 сделок открыты без ошибок (нет отбрасывания из-за нулевого размера, минимального номинала или нехватки средств); охвачена вся история 2020-2026 благодаря объединённым потокам taker_ratio+metrics, разумная экспозиция 41.6%, ликвидаций нет

Сигнал действительно открывает длинные и короткие позиции, активны оба направления (1356 длинных / 708 коротких)

NO EDGE: Sharpe -1.39 (весь CI отрицательный: -2.27–-0.59), Sortino -2.75, profit_factor 0.797, total_return -21.1%

Убыток за EVERY год после -2020 (2022 -5.9%, 2023 -10.5%, 2024 -3.8%, 2025 -7.1%) — это не артефакт рыночного режима, а устойчивое отрицательное математическое ожидание

win_rate 23.8%; обе стороны убыточны (длинная 24.6% / короткая 22.3%); information_ratio -0.78 относительно содержательного бенчмарка BTC — строго хуже стратегии «купи и держи»

commission_pct_of_gross 22.4% — частая ребалансировка раз в 1H увеличивает комиссии поверх убыточного валового сигнала

Анализ

Не оптимизируй NOT: всего 62 сделок, все за последние ~2 месяцев (2026); 2020-2025 не дал ни одной сделки, поэтому окна walk-forward OOS и период отложенной проверки окажутся пустыми. Главная причина — охват данных тейкеров, а не (пока это нельзя доказать) сигнал. Проверяй в таком порядке: (1) PRINT THE TAKER COVERAGE SPAN: в _build_taker записывай len(self._taker_ts) и min/max(self._taker_ts) после разбора supplementary_data['taker_ratio'] для BTCUSDT. Выясни, есть ли вообще строки по тейкерам до 2026. (2) IF……Показать большеСвернуть

Не оптимизируй NOT: всего 62 сделок, все за последние ~2 месяцев (2026); 2020-2025 не дал ни одной сделки, поэтому окна walk-forward OOS и период отложенной проверки окажутся пустыми. Главная причина — охват данных тейкеров, а не (пока это нельзя доказать) сигнал. Проверяй в таком порядке: (1) PRINT THE TAKER COVERAGE SPAN: в _build_taker записывай len(self._taker_ts) и min/max(self._taker_ts) после разбора supplementary_data['taker_ratio'] для BTCUSDT. Выясни, есть ли вообще строки по тейкерам до 2026. (2) IF ROWS EXIST, но они не выравниваются: ошибка в разборе/формате. _parse_taker_ratio перебирает имена ключей (buySellRatio/buy_sell_ratio/ratio/...) и шкалы временных меток (мс или нс по эвристике <10^15), а также запасной вариант buyVol/sellVol — проверь, соответствует ли переданная стратегии схема тейкеров Binance Vision «metrics» ACTUAL одному из вариантов и правильно ли преобразуются временные метки; несоответствие единиц могло оставить только недавние строки. (3) IF TAKER HISTORY GENUINELY STARTS ~2026: действующий API Binance takerlongshortRatio предоставляет данные лишь примерно за 30 дней, но архивы «metrics» на data.binance.vision содержат объём покупок/продаж тейкеров примерно с 2021 — подтверди, что сборщик загрузил метрики тейкеров BTCUSDT за весь период бэктеста; если данных за более ранний период нет, многолетний замысел нежизнеспособен, и гипотезу следует ABANDONED (ограничение данных) либо сузить до периода, достаточного для walk-forward-анализа с 3 окнами и отложенной проверкой (не менее ~18 месяцев). (4) SECONDARY (следи после исправления данных, не игнорируй): даже в окне 2026 стратегия сильно теряет (PF 0.50, доля прибыльных сделок 25.8%, 13 убытков подряд), а комиссии съедают 37.6% при частоте 1H. Доля прибыльных сделок 26% для сигнала импульса-CONFIRMATION говорит о том, что выход по расхождению потока может закрывать прибыльные сделки и удерживать убыточные — пересмотри логику should_exit (мгновенный выход, когда поток пересекает 1.0, может быть слишком чувствительным). Если после полного охвата данных тейкеров преимущество останется отрицательным или комиссии при 1H будут доминировать, откажись от стратегии, не продолжай итерации. Сохрани конструкцию без запасного перехода на цены, которая явно сообщает об ошибке: именно поэтому обнаружились нулевые сделки, а не прошёл незаметно тест ценового импульса.

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

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованные параметры: ['min_notional', 'position_pct', 'taker_window', 'stop_loss_pct', 'trend_lookback', 'taker_threshold', 'max_holding_bars'] Проверь, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735691100000) - steady_downtrend: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1……Показать большеСвернуть

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованные параметры: ['min_notional', 'position_pct', 'taker_window', 'stop_loss_pct', 'trend_lookback', 'taker_threshold', 'max_holding_bars'] Проверь, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735691100000) - steady_downtrend: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735691100000) - flat_ranging: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735691100000) - volatility_spike: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735691100000) - zero_volume: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735691100000) - price_gap: TypeError: BtcTakerFlowConfirmedMomentumLS._ts_to_ns() получает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735691100000)

Сводка по итогам

Даже чистый, корректно реализованный криптонативный подтверждающий сигнал может иметь устойчивое отрицательное математическое ожидание, поэтому не следует повторно запускать без изменений продолжение импульса по BTC 1H с подтверждением потоком тейкеров: симметричный убыток по обеим сторонам подсказывает идею возврата к среднему, но это гипотеза уровня руководителя исследований, а не настройка параметров.

Стратегию отклонили на этапе проверки бэктеста до оптимизации: аналитик вынес вердикт «отказаться». Сигнал был убыточным на всей выборке за 6.5 лет и приносил убыток каждый год после -2020 (2022 -5.9%, 2023 -10.5%, 2024 -3.8%, 2025 -7.1%), поэтому не было прибыльной области параметров для оптимизации.

Открывала длинные или короткие позиции по бессрочному контракту BTCUSDT USD-M (1H-бары) только при подтверждении ценового тренда устойчивым потоком агрессивных сделок тейкеров в том же направлении; при расхождении цены и дисбаланса покупок/продаж тейкеров оставалась вне рынка.

Примерно за 1600 дней (2019-2026) стратегия открыла 2064 чистых сделок (1356 длинных / 708 коротких), но преимущества не было: Sharpe -1.39 (полностью отрицательный CI, от -2.27 до -0.59), общая доходность -21.1%, фактор прибыли 0.797, доля прибыльных сделок 23.8% и информационный коэффициент -0.78 относительно бенчмарка BTC; комиссии съели 22.4% валовой прибыли.

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