Стратегии
Hummingbot PMM V1 (чистый маркет-мейкинг от hummingbot) — точный порт на BTCUSDT.BINANCE_SPOT: уровень покупки 1 и продажи 1 по mid ±1%, обновление через 30 с, задержка после исполнения 60 с, перекос инвентаря OFF (значения по умолчанию из исходного кода)
Итог: Отменено
HummingbotPmmV1BtcSpot
Сводка по итогам
В этой гипотезе предпринята попытка перенести симметричного маркет-мейкера Hummingbot PMM V1 на спотовый рынок Binance BTCUSDT. Единственные изменения, вызванные ограничениями платформы: фиксированный размер позиции в 25% стартового капитала, обновление на каждой свече длительностью 1 минут и проверки спотового баланса. Стратегия не прошла этап написания кода: после 3 итераций запуск был остановлен по причине «coding_stuck_3_timeouts». Бэктест, оптимизация и заключение аналитика не проводились.
Гипотеза
Исправление в итерации 2 для сбоя слоя 2. В макете кэша, использованном в синтетических тестах, нет методов orders_inflight() и account_for_venue(). Теперь код ищет их через getattr и пропускает, если их нет. В настоящем кэше NautilusTrader оба метода есть, поэтому поведение бэктеста и бумажной торговли не меняется. Больше ничего не менялось. Адаптации платформы остались прежними: закрытие свечи используется вместо средней цены книги ордеров, обновление котировок и задержка исполнения привязаны к часам свечей, фиксированный базовый объём ордера задаётся на основе капитала, а размещение ордера на каждой стороне зависит от баланса спотового актива. Риск стратегии: спреды составляют 1%, а за каждое исполнение взимается комиссия мейкера 0.10%, поэтому стратегия приносит прибыль, только если BTC колеблется в диапазоне около 2%. При однонаправленном тренде она остаётся с BTC или наличными на одной стороне.
coding_stuck_3_timeouts
Реализация
Точный порт Hummingbot PMM V1 (чистый маркет-мейкинг) для спотового рынка BTCUSDT, где цена закрытия свечи длительностью 1 минут используется как mid. Он выставляет один лимитный ордер на покупку GTC по цене mid × (1 − 1%) и один лимитный ордер на продажу GTC по цене mid × (1 + 1%). На каждой свече текущие котировки отменяются и выставляются заново, поскольку обновление через 30 с происходит чаще, чем формируется свеча. После исполнения ордера эта сторона ждёт 60 с, прежде чем выставить новую котировку. Объём ордера — фиксированное количество базового актива, заданное один раз при старте: 25% стартового капитала делится на цену закрытия первой свечи. Перекос инвентаря отключён, ценовые диапазоны также отключены, как и в исходном коде. Ордер на покупку выставляется, только если достаточно свободного USDT; ордер на продажу — только если имеется достаточно BTC.
История итераций
Проверка не пройдена (слой 2 — синтетические сценарии): Использованные параметры: ['buy_spread', 'price_floor', 'sell_spread', 'price_ceiling', 'filled_order_delay', 'order_refresh_time', 'quote_balance_buffer', 'order_amount_equity_frac'] Убедись, что __init__ задаёт все атрибуты через self.parameters.get(). - steady_uptrend: AttributeError: у '_MockCache' нет атрибута 'orders_inflight' (временная метка свечи: 1735689660000) - steady_downtrend: AttributeError: у '_MockCache' нет атрибута 'orders_inflight' (временная метка свечи: 1735689660000) - flat_ranging: AttributeError: у '_MockCache' нет атрибута 'orders_inflight' (временная метка свечи: 1735689660000) - volatility_spike: AttributeError: у '_MockCache' нет атрибута 'orders_inflight' (временная метка свечи: 1735689660000) - zero_volume: AttributeError: у '_MockCache' нет атрибута 'orders_inflight' (временная метка свечи: 1735689660000) - price_gap: AttributeError: у '_MockCache' нет атрибута 'orders_inflight' (временная метка свечи: 1735689660000)
sandbox_timeout: проверка не пройдена (слой 3 — бэктест в песочнице): дымовой тест превысил лимит времени 300 с на окне примерно в 20000 свечей (30 дней с BTCUSDT.BINANCE_SPOT-1-MINUTE-LAST-EXTERNAL). Почти всегда это означает, что работа на каждой свече растёт вместе с историей — например, полное повторное сканирование серии ставок финансирования/дополнительных данных или повторное создание списка и вызов min()/sorted() внутри calculate_signal()/on_bar() на каждой свече. Предварительно отсортируй массивы временных меток ONCE в __init__ и используй bisect либо кэшируй поиск по временной метке, чтобы затраты на свечу были O(log n), а не O(n).
Сводка по итогам
Реализации с большим объёмом управления ордерами (отмена и перевыставление на каждой свече, ожидание подтверждений отмены, проверка спотового баланса) достаточно сложны, чтобы этап написания кода завершился по тайм-ауту. Следующую попытку стоит начать с более простой и компактной реализации, которую можно завершить в отведённое время.
Запуск был остановлен на этапе написания кода по причине «coding_stuck_3_timeouts» после 3 итераций, поэтому проверка, анализ бэктеста, оптимизация, анализ аналитика и проверка рисков не проводились.
Точный порт чистого маркет-мейкера Hummingbot PMM V1 на BTCUSDT.BINANCE_SPOT, свечи длительностью 1 минут; выставляет один лимитный ордер на покупку и один на продажу по цене mid ±1%, обновляет их на каждой свече и ждёт 60 с после исполнения перед повторной котировкой. Перекос инвентаря отключён; стоп-лосса, тейк-профита и выхода по времени нет.
Данных о результатах нет: отчёт бэктеста пуст, отчёт об оптимизации отсутствует, поэтому доходность, коэффициент Шарпа и число сделок не зафиксированы.
Анализ
PMMV1
Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.