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

Стратегии

Бэктест стратегии: основные рынки Hyperliquid 4H, двойной временной ряд EMA, абсолютный тренд LONG/SHORT (ATR-трейлинг, 3-параметр, стиль управляемых фьючерсов) | Stratmill

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

HyperliquidMajors4hDualEmaTrendLongShortAtrBasket

Порог бэктеста: - метрики ненадёжны: 636 сделок / 956 дней данных — слишком мало свидетельств (нужно не менее 5 сделок за не менее 10 дней); повысь частоту сигналов или расширь окно

Гипотеза

Корзина абсолютного импульса по нескольким инструментам (LONG/SHORT, временной тренд) на ликвидных бессрочных контрактах HYPERLIQUID (BTCUSD, ETHUSD, SOLUSD и ещё 2-3 крупных активах, например AVAXUSD/BNBUSD/ARBUSD, для которых доступна полная история за ~2.3 лет с шагом 4H). Каждый актив торгуется INDEPENDENTLY на основе собственного тренда по простому пересечению двух EMA на 4–HOUR барах: лонг, когда быстрая EMA выше медленной EMA, шорт — когда ниже; размер позиции определяется через ATR, чтобы риск……Показать большеСвернуть

Корзина абсолютного импульса по нескольким инструментам (LONG/SHORT, временной тренд) на ликвидных бессрочных контрактах HYPERLIQUID (BTCUSD, ETHUSD, SOLUSD и ещё 2-3 крупных активах, например AVAXUSD/BNBUSD/ARBUSD, для которых доступна полная история за ~2.3 лет с шагом 4H). Каждый актив торгуется INDEPENDENTLY на основе собственного тренда по простому пересечению двух EMA на 4–HOUR барах: лонг, когда быстрая EMA выше медленной EMA, шорт — когда ниже; размер позиции определяется через ATR, чтобы риск волатильности каждой части был одинаковым. Эта стратегия намеренно одновременно нацелена на THREE наименее представленных сегментов: площадка HYPERLIQUID (5.1% фактически против целевого 20% — аналитик отдельно отметил HL-4H как единственный надёжный путь к данным за ~2.3 лет с частотой OHLCV для будущих гипотез, не связанных с VWAP HL); сегмент long_short DIRECTION (12.6% против лимита 55%; доля long_only чрезмерно велика и составляет 87.4%); а также мультиинструментальный охват. CRITICAL DESIGN CHOICE — это TREND-FOLLOWING, структурный OPPOSITE механизмов возврата к среднему, которые провалились уже 9+ раз за эту сессию. Следование за трендом по своей конструкции имеет выплату типа NON-INVERTED: убытки ограничиваются на стопе ATR/при развороте пересечения, а прибыльным позициям дают следовать за трендом. Это напрямую устраняет инвертированную сигнатуру avg_win<avg_loss, названную аналитиком коренной причиной отказа от каждого случая выхода за пределы VWAP–MR. Кроме того, стратегия избегает: проблемы «падающего ножа» (мы торгуем импульсы WITH, никогда не идём против них), допущений о коинтеграции (каждый актив оценивается относительно собственного тренда, без соотношения между парами), дополнительных данных о финансировании/премии/OI/L-S (блокер инженерии данных с отсечкой 2023, погубивший гипотезы о переносе позиций с учётом финансирования и индексе премии; здесь используются OHLCV ONLY), а также пробелов в покрытии тиковыми данными. Эта стратегия отличается от родственной стратегии HyperliquidMajorsCrossSectionalMomentumRotationLS: там ротация по рангу CROSS-SECTIONAL с недельной частотой/1D; здесь тренд каждого актива ABSOLUTE с частотой 4H. Оставлено всего 3 основных параметров, чтобы снизить риск повторяющейся подгонки под исторические данные.

Итерация 4 устраняет ONLY в указанном Layer-3 sandbox_timeout. Предыдущий код пересчитывал обе EMA и ATR, проходя циклом весь буфер из 500 баров внутри calculate_signal()/on_extra_bar() на каждом баре — примерно 1,500 тяжёлых операций .as_double() на событие бара, всего около 72,000 событий на пяти инструментах с таймфреймом 4H, из-за чего превышался лимит времени 300с. Теперь индикаторы INCREMENTAL: состояние каждого инструмента хранит два значения EMA, деку deque(maxlen=atr_period) истинных диапазонов с текущей……Показать большеСвернуть

Итерация 4 устраняет ONLY в указанном Layer-3 sandbox_timeout. Предыдущий код пересчитывал обе EMA и ATR, проходя циклом весь буфер из 500 баров внутри calculate_signal()/on_extra_bar() на каждом баре — примерно 1,500 тяжёлых операций .as_double() на событие бара, всего около 72,000 событий на пяти инструментах с таймфреймом 4H, из-за чего превышался лимит времени 300с. Теперь индикаторы INCREMENTAL: состояние каждого инструмента хранит два значения EMA, деку deque(maxlen=atr_period) истинных диапазонов с текущей суммой и цену закрытия предыдущего бара; начальная инициализация выполняется один раз (один проход O(len(buffer)) при первом появлении min_bars у инструмента), затем обновление занимает O(1) на каждый новый бар. Время бара проверяется, поэтому повторный вызов для того же бара не обновляет данные дважды. ATR по-прежнему равен простому среднему последних atr_period истинных диапазонов; EMA сходятся к тем же значениям после однократной инициализации. Логика сигналов, правила входа и выхода, размер позиции, конфигурация, импорты и структура класса не менялись, поэтому проверки Layer 1/1.5/2 сохранены.

backtest_failed:data: полный бэктест не удалось запустить 3 раз — test_agent.py", строка 424, в _ensure_funding_for_perp_legs raise RuntimeError( RuntimeError: данные о ставках финансирования недоступны для бессрочного контракта 'AVAXUSD.HYPERLIQUID' — сбор по запросу не удался или на площадке нет истории ставок финансирования (бэктест заблокирован ради точности; задай SF_DISABLE_ONDEMAND_FUNDING=1, чтобы обойти это ограничение) Сбой конвейера/данных, а не вердикт о стратегии; повтори запуск после устранения причины.

Реализация

Корзина с длинными и короткими позициями на основе абсолютного моментума (тренда временного ряда) для пяти ликвидных бессрочных контрактов Hyperliquid (BTCUSD, ETHUSD, SOLUSD, AVAXUSD, BNBUSD) на барах 4-HOUR. Каждый инструмент торгуется независимо: длинная позиция, пока 20-EMA выше 50-EMA, короткая — пока ниже; выход происходит при развороте пересечения EMA или неблагоприятном движении на ATR(14) x 3 от цены входа. Размер позиций выравнивает волатильностный риск (капитал * risk_frac * цена / (atr_stop_mult * ATR)); каждая позиция ограничена 18% капитала. Только OHLCV — без вспомогательных данных.

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

Если задуман трейлинг-стоп, отслеживай максимальную благоприятную цену позиции и закрывай её, когда цена отступит от этого максимума на atr_stop_mult*ATR, а не от цены входа.

В заголовке гипотезы указан стоп «ATR-Trailing», но при выходе применяется стоп FIXED ATR, рассчитанный от цены исполнения (entry - price > atr_stop_mult*ATR), а не трейлинг-стоп от максимума. В описании конфигурации точно указано «неблагоприятное движение на ATR(14) x 3 от цены входа», так что замысел задокументирован. Структурные средства контроля риска, названные в гипотезе (ATR стоп + выход при развороте пересечения EMA), присутствуют, поэтому это расхождение не блокирует проверку; однако настоящий трейлинг-стоп позволил бы зафиксировать больше прибыли в удачном тренде и лучше соответствовал бы заголовку.

Проверь, что base_template направляет warmup через override; если нет, переименуй его в закрытый вспомогательный метод стратегии, чтобы избежать незаметного затенения.

min_bars_required() переопределяет метод фреймворка (предупреждение статического анализатора base_shadow). Переопределение возвращает допустимое целое число (>= ema_slow + 5) и используется для проверки прогрева; поведение выглядит намеренным и корректным, но подтверди, что базовый шаблон использует это переопределение для проверки прогрева, а не собственный расчёт.

Дымовой тест в песочнице дал нестабильный положительный результат: profit_factor 1.002, коэффициент Шарпа 0.497, win_rate 29%, max_drawdown 45.8%. Анализ режимов показывает, что прибыльным был только «спокойный» терциль (+53%), тогда как «обычный» (-31%) и «стрессовый» (-27%) принесли убыток — преимущество сосредоточено в одном режиме волатильности. Пропускная способность низкая (capacity_usd около $109K, impact_cost_pct 95.7%, impact_folded); причина — распределение размера по ATR для пяти позиций, каждая до 18% (avg_position_pct около 19.6%, экспозиция около 487%). На менее ликвидных крупных активах (AVAX/BNB) влияние на рынок может съесть небольшое преимущество на сделку при полном бэктесте. avg_trade_return_pct 0.44% превышает порог комиссий, поэтому стоит провести полный бэктест; однако аналитик должен в первую очередь проверить, что PF едва выше 1, и оценить концентрацию результатов по режимам.

Анализ

Порог бэктеста: - метрики ненадёжны: 636 сделок / 956 дней данных — слишком мало свидетельств (нужно не менее 5 сделок за не менее 10 дней); повысь частоту сигналов или расширь окно

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

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованы параметры: ['ema_fast', 'ema_slow', 'min_notional', 'atr_trail_mult'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692480000) - steady_downtrend: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара:……Показать большеСвернуть

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованы параметры: ['ema_fast', 'ema_slow', 'min_notional', 'atr_trail_mult'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692480000) - steady_downtrend: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692480000) - flat_ranging: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692480000) - volatility_spike: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692480000) - zero_volume: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692480000) - price_gap: TypeError: HlMajorsDualEmaTrendLongShortBasket._ema() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692480000)

Проверка не пройдена (Layer 1 — статический анализ): - Не найден класс, наследующий FactoryStrategy (строка None) - Не реализован обязательный метод: should_enter (строка None) - Не реализован обязательный метод: calculate_signal (строка None) - Не реализован обязательный метод: position_size (строка None) - Не реализован обязательный метод: should_exit (строка None)

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

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованы параметры: ['ema_fast', 'ema_slow', 'risk_frac', 'atr_period', 'max_leg_frac', 'min_notional', 'atr_stop_mult'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: HyperliquidMajors4hDualEmaTrendLongShortAtrBasket._ema_from_bars() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692840000) - steady_downtrend: TypeError:……Показать большеСвернуть

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованы параметры: ['ema_fast', 'ema_slow', 'risk_frac', 'atr_period', 'max_leg_frac', 'min_notional', 'atr_stop_mult'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: HyperliquidMajors4hDualEmaTrendLongShortAtrBasket._ema_from_bars() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692840000) - steady_downtrend: TypeError: HyperliquidMajors4hDualEmaTrendLongShortAtrBasket._ema_from_bars() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692840000) - flat_ranging: TypeError: HyperliquidMajors4hDualEmaTrendLongShortAtrBasket._ema_from_bars() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692840000) - volatility_spike: TypeError: HyperliquidMajors4hDualEmaTrendLongShortAtrBasket._ema_from_bars() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692840000) - zero_volume: TypeError: HyperliquidMajors4hDualEmaTrendLongShortAtrBasket._ema_from_bars() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692840000) - price_gap: TypeError: HyperliquidMajors4hDualEmaTrendLongShortAtrBasket._ema_from_bars() принимает 2 позиционных аргументов, но передано 3 (временная метка бара: 1735692840000)

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

Шарп
0,24
Общая доходность
-4,11%
Максимальная просадка
46,38%
Всего сделок
636
Доля прибыльных
28,3%
Профит-фактор
0,95

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