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

Стратегии

Hummingbot 'BollinGridController' (автор hummingbot, Apache-2.0), точный перенос: затухание пробоя %B по BB(100,2.0), запускающее одностороннюю мейкерскую сетку с размером по ширине BB, с тройным барьером (3% SL / 2% на уровень TP / лимит времени 45 мин / трейлинг 1.5%-0.3%) на WLDUSDT.BINANCE 3m, лонг и шорт

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

HummingbotBollinGridWld

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

После двух итераций HummingbotBollinGridWld проверил стратегию на отскок от полос Боллинджера с мейкерскими сетками на свечах 3 минут для WLDUSDT. Бэктест зафиксировал 886 закрытых позиций, доходность -100% и коэффициент Шарпа -11.91. Проверка бэктеста привела к отказу от неё до оптимизации из-за отрицательного матожидания; отдельно были отмечены опасения по точности исполнения. Вывод относится к этому переносу на платформу и его размеру позиции, а не к исходному контроллеру с номиналом $100.

Гипотеза

Точный перевод контроллера Hummingbot с открытым исходным кодом controllers/directional_trading/bollingrid.py (автор: hummingbot, коммит 9af100d6, Apache-2.0; признательность авторам). Контроллер вычисляет pandas_ta полос Боллинджера (длина 100, стандартное отклонение 2.0) на свечах торговой пары длительностью 3 минут. BBP = %B = (close - lower)/(upper - lower); BBB = ширина полос = (upper - lower)/middle * 100. Сигнал = +1, если BBP < bb_long_threshold (0.0, то есть закрытие ниже нижней полосы), -1, если BBP >……Показать большеСвернуть

Точный перевод контроллера Hummingbot с открытым исходным кодом controllers/directional_trading/bollingrid.py (автор: hummingbot, коммит 9af100d6, Apache-2.0; признательность авторам). Контроллер вычисляет pandas_ta полос Боллинджера (длина 100, стандартное отклонение 2.0) на свечах торговой пары длительностью 3 минут. BBP = %B = (close - lower)/(upper - lower); BBB = ширина полос = (upper - lower)/middle * 100. Сигнал = +1, если BBP < bb_long_threshold (0.0, то есть закрытие ниже нижней полосы), -1, если BBP > bb_short_threshold (1.0, закрытие выше верхней полосы), иначе 0. При ненулевом сигнале запускается GridExecutor в направлении сигнала; его ценовой диапазон масштабируется по текущей ширине полос w = BBB/100: LONG (сетка BUY): start_price = close*(1 - 0.25w), end_price = close*(1 + 0.75w), limit_price = close*(1 - 0.35w). SHORT (сетка SELL): start_price = close*(1 - 0.75w), end_price = close*(1 + 0.25w), limit_price = close*(1 + 0.35w). Параметры сетки передаются без изменений: min_spread_between_orders 0.005, order_frequency 2s, max_orders_per_batch 1, min_order_amount_quote 6, max_open_orders 5. Все остальные настройки взяты из значений по умолчанию DirectionalTradingControllerConfigBase (в исходнике они не заданы): коннектор binance_perpetual, trading_pair WLD-USDT, total_amount_quote 100, max_executors_per_side 2, cooldown_time 300s, плечо 20, position_mode HEDGE, stop_loss 0.03, take_profit 0.02, time_limit 2700s (мин. 45), take_profit_order_type LIMIT, активация trailing_stop 0.015 / trailing_delta 0.003. Объём исполнителя = total_amount_quote / max_executors_per_side = номинал 50 USDT для каждого. У контроллера нет действий остановки по сигналу; исполнители завершаются только при срабатывании собственных барьеров. PLATFORM MAPPING: площадка BINANCE USD-M (коннектор по умолчанию в исходнике — binance_perpetual, а торговая пара по умолчанию — WLD-USDT, поэтому WLDUSDT.BINANCE — точный инструмент; это также не BTC, а у WLD почти нет истории в корпусе данных). В каталоге есть WLDUSDT.BINANCE-3-MINUTE-LAST-EXTERNAL за период с 2023-07-24 по 2026-10-01 (около 3.2 лет, около 560 тыс. баров), поэтому исходный интервал 3m сохранён без изменений. Размер позиции масштабирован с 100 USDT до нашего счёта в $100k с сохранением тех же пропорций: total_amount_quote = 100% капитала, каждый исполнитель получает номинал в размере 50% капитала, максимум — 2 исполнителей на сторону. min_order_amount_quote сохраняет соотношение с бюджетом исполнителя (6/50 = 12% номинала исполнителя), ограничивая сетку 8 уровнями, как и в исходной версии 100-USDT. Плечо фиксировано на уровне 2.0. В исходнике используется 20x, но это только маржа; номинальная экспозиция задаётся через total_amount_quote, а 2x достаточно для маржи 2 исполнителей в одну сторону (номинал 100% капитала) и пары в противоположную сторону. Hummingbot работает в режиме HEDGE, но наш счёт объединяет позиции; разработчик должен отслеживать уровни и объём каждого исполнителя во внутреннем учёте стратегии и отправлять нетто-заявки. Комиссии: Binance USD-M, мейкер 0.02%, тейкер 0.05%. Открытие сетки и тейк-профиты на каждом уровне — LIMIT (мейкер); стоп-лосс, лимитная цена, ограничение по времени и трейлинг-выходы — MARKET (тейкер). Это класс стратегий, которые ловят отскок от уровня BB на коротком таймфрейме и здесь в основном не работают. Предлагается точный перенос, в котором сеточные сделки только мейкером и 2% TP на каждом уровне — единственная особенность, способная покрыть издержки. Результат определит наш собственный бэктест; предполагаемая доходность не заявляется.

Пользователь запросил точный перенос. Исходные значения коннектора и пары по умолчанию (binance_perpetual, WLD-USDT) и интервал (3m) сохранены без изменений; данные WLDUSDT.BINANCE-3-MINUTE доступны начиная с 2023-07-24. Доля BINANCE завышена как площадки (61.5%), но инструмента нет в корпусе, стратегия охватывает лонг и шорт (17% bucket), горизонт короткий (1m-15m), а механизм (односторонняя мейкерская сетка с тройным барьером) структурно отличается от тейкерских входов по z-score в конвейере. Перенос на другую площадку нарушил бы точность. Размер позиции пропорционально масштабирован с 100 USDT до счёта на $100k. Плечо фиксировано на уровне 2.0 только как запас маржи; гипотеза и конфигурация должны совпадать по этому значению.

Измеренное отрицательное матожидание по 886 закрытым позициям не оправдывает оптимизацию. Этот вывод относится к заданному переносу на платформу WLD с периодом 3 минуты, пропорциональным размером позиции по капиталу и смоделированными издержками исполнения, а не к контроллеру Hummingbot с исходным номиналом $100. Отдельно проверьте остаточную позицию, исполнения при закрытии исполнителя и размер после исчерпания лимита, прежде чем считать эту реализацию точным воспроизведением исполнения.

Реализация

Перевод Stratmill BollinGridController из Hummingbot: сделки против пробоя полос Боллинджера на интервале 3 минут с односторонними сетками лимитных ордеров, тейк-профитами на исходных уровнях LIMIT и барьерами исполнения. Исправляет квантование ёмкости сетки, входы лимитными ордерами, прибыльные границы сетки и учёт затрат для оставшихся уровней.

Сохраняет ранее прошедший проверку сигнал Боллинджера, рынок WLD и параметры исследования. Устранены все пять замечаний QA с использованием закреплённого исходника GridExecutor: подсчёт уровней через floor без добавочного уровня, буферизованная и квантованная минимальная ёмкость, цели TP на исходных уровнях с пассивной корректировкой, завершение исполнителя на прибыльной границе, вычитание и сверка стоимости по уровням, а также post-only входы с округлением в сторону от рынка. Исправленную экономику ещё предстоит оценить конвейеру; прежняя ликвидация не доказывает, что у исправленной реализации нет преимущества.

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

Необязательно: укажите в описании замену барьерной проверки на закрытии свечи. Стопы внутри свечи для каждого исполнителя сложно выразить при неттинге позиции, поэтому текущий подход приемлем.

Барьерные условия исполнителя (stop_loss 3%, трейлинг 1.5%/0.3%, limit_price, time_limit, конечная/начальная граница) проверяются только при закрытии каждой свечи 3m. GridExecutor в Hummingbot проверяет их на каждом цикле управления (примерно каждые 1s). Трейлинг-дельта 0.3%, измеренная по закрытиям свечей 3m, может отдать гораздо больше, чем 0.3% внутри свечи, а выходы по стоп-лоссу могут превысить 3% (наибольший единичный убыток составил $6.2k). Это вынужденное отклонение платформы: счёт использует неттинг, поэтому нет дедлайнов и стоп-ордеров на каждом исполнителе. Это не расхождение с письменной гипотезой.

Оставьте тег в сопоставлении до события отмены или исполнения, чтобы позднее исполнение попало в существующий путь закрытия позиции по рынку при 'ex is None'.

_close_executor удаляет тег каждого незавершённого ордера из _omap до подтверждения отмены. Если вход на уровне исполнится между запросом отмены и её подтверждением, on_order_filled не найдёт тег и вернётся, оставив неотслеживаемую чистую позицию, которую ни один исполнитель не закроет. Эта гонка невозможна при бэктесте с нулевой задержкой или на симулированной площадке бумажной торговли (отмены обрабатываются сразу), поэтому замечание носит информационный характер.

Не требуется.

В тексте гипотезы сказано, что min_order_amount_quote ограничивает сетку 8 уровнями. В коде применяется буфер 5% из исходника: 6% x 1.05 = 6.3% номинала исполнителя, поэтому max_possible = 7. На практике выражение int(grid_range/0.005) обычно срабатывает раньше (2-5 уровней при типичной ширине полос). Код следует арифметике закреплённого GridExecutor, поэтому это лишь расхождение в формулировке гипотезы.

Счёт в песочнице потерял 100% и был ликвидирован, но сделки и издержки соответствуют механизму исходника. Неконтролируемого роста позиции нет: пиковое плечо входа составило 1.06, пиковая маржа — 0.53. Убытки вызваны издержками. Комиссия составила $24.2k при номинале торгов $51.7M, в среднем 0.047%, что близко к ставке тейкера, поскольку большинство выходов — закрытия по барьеру MARKET. Кроме того, учтено моделируемое влияние на цену в размере $113.8k, около 0.22% от номинала. Обе издержки уплачиваются примерно за……Показать большеСвернуть

Счёт в песочнице потерял 100% и был ликвидирован, но сделки и издержки соответствуют механизму исходника. Неконтролируемого роста позиции нет: пиковое плечо входа составило 1.06, пиковая маржа — 0.53. Убытки вызваны издержками. Комиссия составила $24.2k при номинале торгов $51.7M, в среднем 0.047%, что близко к ставке тейкера, поскольку большинство выходов — закрытия по барьеру MARKET. Кроме того, учтено моделируемое влияние на цену в размере $113.8k, около 0.22% от номинала. Обе издержки уплачиваются примерно за 517 циклов исполнения за 31 дней. Средняя доходность сделки составила -0.41% при пороге 0.15%, с PF 0.30. Входы выставляются по close*(1-0.0001), поэтому уровни сетки сходятся к лучшей цене, а издержки определяются выходами по барьеру. Сначала проверьте: плату модели влияния на цену за исполнение при номинале исполнителя 50% от капитала на WLD 3m и то, ухудшают ли цены выхода проверки трейлинга/SL при закрытии свечи 3m (исходник проверяет примерно каждую секунду). Этот класс стратегий на отскок от BB на коротком таймфрейме здесь в основном не работает, поэтому полный бэктест должен подтвердить fee_edge, если доля мейкерских TP не окажется намного выше, чем показывает эта песочница.

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

Шарп
-11,91
Общая доходность
-100,00%
Максимальная просадка
100,00%
Всего сделок
886
Доля прибыльных
36,2%
Профит-фактор
0,23

Закрытые позиции 886 включают оба направления: лонги 454 и шорты 432.

Опасение QA подтвердилось: средняя чистая доходность сделки составляет -0.341% против порогового значения, установленного при проверке фьючерсов Binance, +0.15%; PF равен 0.230, а счёт несёт убыток 100%.

Сумма PnL по закрытым сделкам равна -$246,648; даже после возврата $39,449 комиссий остаются существенные убытки. Учтённое моделью влияние на цену добавляет издержки в размере $148,198.

Точность исполнения также требует проверки: итоговая чистая короткая позиция остаётся открытой почти 49 дней, несмотря на лимит исполнителя в 45 минут. Само по себе это не устанавливает причину.

Каталог охватывает 3.2 лет, но эффективные данные дневной доходности включают лишь 31 дней до исчерпания капитала. Доходность стратегии «купи и держи» за весь период по выборке составляет -73.69% при просадке около 97.62%; эти данные не сопоставлены с периодом, когда капитал стратегии сохранялся.

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

Проверка не пройдена (уровень 4 — проверка QA) [класс=hypothesis_mismatch]: - [edge_concern] Тестовый прогон закрыл позиции с ликвидацией, значительными издержками влияния на рынок и комиссиями. Повторно оцените экономические показатели после исправления реализации; эти результаты не стали причиной провала. - [критично] В исходнике grid_executor.py, строки 148-150, используется floor(range/min_step), без +1. В переносе, строка 243, добавлен уровень, что меняет шаг сетки и распределение средств. В исходнике также……Показать большеСвернуть

Проверка не пройдена (уровень 4 — проверка QA) [класс=hypothesis_mismatch]: - [edge_concern] Тестовый прогон закрыл позиции с ликвидацией, значительными издержками влияния на рынок и комиссиями. Повторно оцените экономические показатели после исправления реализации; эти результаты не стали причиной провала. - [критично] В исходнике grid_executor.py, строки 148-150, используется floor(range/min_step), без +1. В переносе, строка 243, добавлен уровень, что меняет шаг сетки и распределение средств. В исходнике также применяются буфер минимального номинала 5% и квантование количества до определения доступной ёмкости. [Зафиксированный исходник](https://raw.githubusercontent.com/hummingbot/hummingbot/9af100d6822da7d2d0291a906c730ef172284ee2/hummingbot/strategy_v2/executors/grid_executor/grid_executor.py). (строка 243) — исправление: сохраните исходные правила подсчёта уровней и квантования, явно обработав случаи с нулевым числом уровней. - [критично] В исходнике grid_executor.py, строки 397-429, TP привязывается к исходной цене уровня, а рыночные цели корректируются. В переносе, строка 360, вместо этого TP привязывается к фактической цене исполнения. Поэтому для входов с ограничением устанавливаются иные цены выхода. [Зафиксированный исходник](https://raw.githubusercontent.com/hummingbot/hummingbot/9af100d6822da7d2d0291a906c730ef172284ee2/hummingbot/strategy_v2/executors/grid_executor/grid_executor.py). (строка 360) — исправление: рассчитывайте цели от lv['p'] и сохраните корректировку пассивной цены из исходника. - [критично] В исходнике grid_executor.py, строки 554-563, сетка BUY завершается выше end_price, а сетка SELL — ниже start_price. В _check_barriers переноса этот выход отсутствует, и эти границы не сохраняются. [Зафиксированный исходник](https://raw.githubusercontent.com/hummingbot/hummingbot/9af100d6822da7d2d0291a906c730ef172284ee2/hummingbot/strategy_v2/executors/grid_executor/grid_executor.py). (строка 287) — исправление: сохраняйте начальную и конечную границы и реализуйте выход исполнителя при достижении прибыльной границы. - [критично] Уровень TP вычитает себестоимость по среднему значению исполнителя, а не стоимость закрываемого уровня. При равных количествах, исполненных по 1 и 2, закрытие первого уровня оставляет себестоимость 1.5 для запаса, фактически набранного по 2. Последующие решения по стоп-лоссу и трейлингу используют неверную цену безубыточности. (строка 365) — исправление: вычитайте закрытое количество, умноженное на lv['fp']; после каждого исполнения сверяйте себестоимость исполнителя и запас с остатками по уровням. - [критично] Для входных ордеров используется post_only=False, хотя зафиксированное open_order_type равно LIMIT_MAKER. Нормализация цены может округлить предполагаемое пассивное смещение до рыночной цены, допуская исполнение тейкером. (строка 122) — исправление: используйте post_only=True для входов в сетку и нормализуйте цены в сторону от рынка. Для тейк-профитов LIMIT сохраните отдельную обработку.

Сохраните правила исходника для числа уровней и квантования, явно обработав случаи с нулём уровней.

В исходнике grid_executor.py строка 148-150 использует floor(range/min_step) без +1. Строка 243 в переносе добавляет уровень, меняя шаг и распределение объёма. В исходнике также применяется буфер минимального номинала 5% и квантование количества до определения ёмкости. [Закреплённый исходник](https://raw.githubusercontent.com/hummingbot/hummingbot/9af100d6822da7d2d0291a906c730ef172284ee2/hummingbot/strategy_v2/executors/grid_executor/grid_executor.py).

Рассчитывайте цели от lv['p'] и сохраните пассивную корректировку цены из исходника.

В исходнике grid_executor.py, строки 397-429, TP привязывается к исходной цене уровня, а рыночные цели корректируются. В переносе, строка 360, вместо этого TP привязывается к фактической цене исполнения. Поэтому для входов с ограничением устанавливаются иные цены выхода. [Зафиксированный исходник](https://raw.githubusercontent.com/hummingbot/hummingbot/9af100d6822da7d2d0291a906c730ef172284ee2/hummingbot/strategy_v2/executors/grid_executor/grid_executor.py).

Сохранить границы начала и конца и реализовать выход исполнителя на прибыльной границе.

В исходнике grid_executor.py строка 554-563 завершает сетку BUY выше end_price или сетку SELL ниже start_price. В переносе _check_barriers этот выход отсутствует, и границы не сохраняются. [Закреплённый исходник](https://raw.githubusercontent.com/hummingbot/hummingbot/9af100d6822da7d2d0291a906c730ef172284ee2/hummingbot/strategy_v2/executors/grid_executor/grid_executor.py).

Вычитайте закрытое количество, умноженное на lv['fp']; после каждого исполнения сверяйте стоимость исполнителя и позицию с остатками по уровням.

Уровень TP вычитает среднюю стоимость исполнителя, а не стоимость закрываемого уровня. Если равные объёмы исполнены по 1 и 2, закрытие первого уровня оставляет себестоимость 1.5 для инвентаря, фактически набранного по 2. Последующие решения о стоп-лоссе и трейлинге используют неверную цену безубыточности.

Используйте post_only=True для входов сетки и нормализуйте цены в сторону от рынка. Сохраните отдельную обработку тейк-профитов LIMIT.

Входные ордера используют post_only=False, хотя замороженное значение open_order_type — LIMIT_MAKER. Нормализация цены может округлить заданное пассивное смещение до рыночной цены и допустить исполнение тейкером.

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

Проверьте исполнения при закрытии исполнителя, остаточную позицию и размер после исчерпания лимита, прежде чем считать эту версию с масштабированием по капиталу точным воспроизведением исходного контроллера.

По итогам проверки бэктеста вынесен вердикт отказаться: измеренное отрицательное математическое ожидание не оправдывает оптимизацию; до оптимизации и последующих проверок не дошли. Также требовалась проверка точности исполнения, поскольку конечный инвентарь сохранялся значительно дольше лимита исполнителя в 45 минут.

Перенесите BollinGridController из Hummingbot на свечи WLDUSDT Binance с периодом 3 минут: стратегия отрабатывает пробои полос Боллинджера мейкерскими сетками и выходит по барьерам, масштабируя размер позиции пропорционально капиталу.

В бэктесте указаны доходность -100%, коэффициент Шарпа -11.91 и максимальная просадка 100% по 886 закрытым позициям. Средняя чистая доходность сделки составила -0.341%, коэффициент прибыльности — 0.230.

Анализ

BollinGridController

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