Стратегии
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.
Гипотеза
Пользователь запросил точный перенос. Исходные значения коннектора и пары по умолчанию (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, поэтому это лишь расхождение в формулировке гипотезы.
Обзор бэктеста
- Шарп
- -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%; эти данные не сопоставлены с периодом, когда капитал стратегии сохранялся.
История итераций
Сохраните правила исходника для числа уровней и квантования, явно обработав случаи с нулём уровней.
В исходнике 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 — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.