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

Стратегии

Hummingbot SimplePMM (точный порт): симметричные мейкерские котировки 10 bp вокруг средней цены ETHUSDT, отмена и замена каждые 15 с, фиксированный объём 0.01 ETH на сторону (ETHUSDT.BINANCE USD-M, тики котировок)

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

EthSimplePmmMakerQuotes

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

EthSimplePmmMakerQuotes пыталась перенести скрипт Hummingbot SimplePMM на бессрочный контракт ETHUSDT.BINANCE USD-M с плечом 1.0, выставляя мейкерские биды и аски с отступом 10 bp каждые 15 с. Бессрочный контракт выбрали вместо спота, чтобы можно было выставлять котировки с обеих сторон с нулевой позиции и избежать спотовой мейкерской комиссии 0.10%, которая поглотила бы весь спред. Разработчик заменил отмену и выставление ордеров их изменением на месте, чтобы сократить число событий движка, но выполнение всё равно застряло на написании кода: за 3 итераций произошло 3 тайм-аутов. Работу прекратили до бэктеста, оптимизации и анализа, поэтому данных о результативности нет.

Гипотеза

Точное изложение скрипта Hummingbot SimplePMM (BotCamp Cohort Sept 2022, Apache-2.0; авторство: hummingbot, https://github.com/hummingbot/hummingbot/blob/9af100d6822da7d2d0291a906c730ef172284ee2/scripts/simple_pmm.py). Это реальная торговая стратегия: чистый пассивный маркет-мейкер без сигнала, контроля позиции, стопа и лимита позиции. Правила из исходного кода, значения по умолчанию — строго как указано: trading_pair ETH-USDT; order_amount = 0.01 ETH; bid_spread = 0.001 (10 bp); ask_spread = 0.001 (10 bp);……Показать большеСвернуть

Точное изложение скрипта Hummingbot SimplePMM (BotCamp Cohort Sept 2022, Apache-2.0; авторство: hummingbot, https://github.com/hummingbot/hummingbot/blob/9af100d6822da7d2d0291a906c730ef172284ee2/scripts/simple_pmm.py). Это реальная торговая стратегия: чистый пассивный маркет-мейкер без сигнала, контроля позиции, стопа и лимита позиции. Правила из исходного кода, значения по умолчанию — строго как указано: trading_pair ETH-USDT; order_amount = 0.01 ETH; bid_spread = 0.001 (10 bp); ask_spread = 0.001 (10 bp); order_refresh_time = 15 секунд; price_type = 'mid' (MidPrice; 'last' переключает базовую цену на LastTrade). На каждом тике, когда create_timestamp <= now: (1) отменить ALL активные ордера по паре; (2) ref_price = средняя цена (или цена последней сделки, если price_type == 'last'); (3) сформировать LIMIT BUY объёмом order_amount по цене ref_price*(1 - bid_spread) и LIMIT SELL объёмом order_amount по цене ref_price*(1 + ask_spread), оба с флагом is_maker=True; (4) запустить проверку бюджета с all_or_none=True (каждый ордер либо сохраняется в полном объёме, либо отбрасывается, если средств на счёте недостаточно; частичного уменьшения объёма нет); (5) разместить прошедшие проверку ордера; (6) установить create_timestamp = now + order_refresh_time. did_fill_order только ведёт журнал; исполнения NOT меняют котировки. Позиция свободно накапливается в том направлении, в котором происходят исполнения. VENUE CHOICE (единственная адаптация): исходный код работает на спотовом рынке binance_paper_trade, где на бумажном счёте изначально есть BOTH ETH и USDT, поэтому котировки всегда выставляются с обеих сторон. На нашем счёте BINANCE_SPOT CASH изначально есть только USDT, поэтому проверка бюджета отбрасывала бы котировку на продажу до исполнения покупки, и бот стал бы покупать только на падении. Мейкерская комиссия на споте также составляет 0.10% с каждой стороны, поэтому полный круг с 10 bp + 10 bp даёт 0.20% до вычета 0.20% мейкерских комиссий: по конструкции преимущество равно нулю. Бессрочный контракт Binance USD-M (ETHUSDT.BINANCE, MARGIN, мейкерская комиссия 0.02%) позволяет выставлять котировки с обеих сторон с нулевой позиции, как в исходной реализации, при плече 1.0. ETHUSDT выбран, поскольку в исходном коде указан ETH-USDT; механизм зависит от площадки и пары, поэтому здесь принято и отмечено сосредоточение корпуса на ETH/BINANCE.

Итерация 2 устраняет тайм-аут песочницы Layer-3 (урок L155, вариант (c): затраты на бар). Три изменения, правила котирования не затронуты: (1) все подписки на тики явно отключены; стратегия выставляет котировки только по закрытию бара, поэтому поток тиков не загружается. (2) Интервал бара меняется с 1-MINUTE на 5-MINUTE. Обновление каждые 15 с происходит чаще, чем закрывается любой бар, поэтому порт повторно выставляет котировки на каждом баре в обоих случаях; бары по 5 мин сокращают число баров в песочнице и……Показать большеСвернуть

Итерация 2 устраняет тайм-аут песочницы Layer-3 (урок L155, вариант (c): затраты на бар). Три изменения, правила котирования не затронуты: (1) все подписки на тики явно отключены; стратегия выставляет котировки только по закрытию бара, поэтому поток тиков не загружается. (2) Интервал бара меняется с 1-MINUTE на 5-MINUTE. Обновление каждые 15 с происходит чаще, чем закрывается любой бар, поэтому порт повторно выставляет котировки на каждом баре в обоих случаях; бары по 5 мин сокращают число баров в песочнице и частоту смены ордеров примерно на 2-5x. Компромисс: котировки остаются в книге 5 мин между обновлениями вместо 15 с. (3) Отмена всех ордеров с заменой превращается в изменение цены и объёма ещё действующей котировки с каждой стороны на месте (modify_order). В симулируемой книге это экономически равнозначно (та же сторона, новая цена и новый объём), но требует 2 события движка на сторону вместо примерно 5. Для исполненной или частично исполненной стороны создаётся новый ордер, а ордер стороны, исключённой проверкой бюджета, отменяется. Работа на каждом баре — O(открытых ордеров) = O(1), без сканирования истории. Другие адаптации к платформе без изменений: ориентир — цена закрытия бара (последняя сделка), поскольку на уровне бара нет средней цены L1; order_amount составляет 1% капитала, а не фиксированные 0.01 ETH; площадка бессрочных контрактов позволяет котировать обе стороны при нулевой начальной позиции. Важная оговорка: котировки с отступом 10 б.п. на барах по 5 мин исполняются при неблагоприятном движении цены; контроля позиции нет, поэтому после комиссий мейкера 0.02% преимущество, вероятно, невелико.

coding_stuck_3_timeouts

Реализация

Точный порт Hummingbot SimplePMM на бессрочном контракте ETHUSDT.BINANCE USD-M: при каждом обновлении снимаются все котировки и выставляется пост-онли LIMIT BUY по ref*(1-10bp) и LIMIT SELL по ref*(1+10bp), каждый объёмом 1% капитала; действует проверка маржи по принципу «всё или ничего». Исполнения не меняют котировки, позиция свободно накапливается.

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

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

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

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

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

Работу прекратили на этапе написания кода с причиной «coding_stuck_3_timeouts» после 3 итераций. До проверки бэктеста, оптимизации, анализа и оценки рисков не дошли.

Точный порт Hummingbot SimplePMM: чистый пассивный маркет-мейкер, выставляющий симметричные мейкерские котировки пост-онли с отступом 10 bp от базовой цены ETHUSDT на бессрочном контракте Binance USD-M. Котировки отменялись и заменялись каждые 15 секунд; сигнала, контроля позиции, стопа и лимита позиции нет.

Данных о результативности нет. Отчёт о бэктесте пуст, отчёта об оптимизации нет, поэтому стратегия не показала доходность, коэффициент Шарпа или число сделок.

Анализ

SimplePMM

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