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

Стратегии

Корзина Binance USD-M: лонг-шорт ансамбль тренда с несколькими периодами просмотра (устоявшиеся основные активы, фиксированный набор периодов 20/40/80/160, усреднённая оценка тренда, еженедельная ребалансировка, устойчивость к переобучению)

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

MultiLookbackEnsembleTrendLongShortBasketNoLeverage

Концепция фиксированного набора периодов просмотра с защитой от переобучения в принципе обоснована; стратегия остаётся в рамках подтверждённой области дневных трендовых корзин

Гипотеза

Лонг-шорт корзина тренда на управляемых фьючерсах с дневной ребалансировкой по ~10 устоявшимся основным активам Binance USD-M с подтверждённой полной историей (BTC, ETH, SOL, BNB, XRP, DOGE, ADA, LTC, LINK, BCH), специально сконструированная как OVERFIT-RESISTANT BY CONSTRUCTION — предписанное аналитиком исправление, объясняющее отказ от варианта с таргетированием волатильности и двумя временными рамками. У того варианта было настоящее сильное преимущество (+392%, коэффициент Шарпа 2.59 с настройками по……Показать большеСвернуть

Лонг-шорт корзина тренда на управляемых фьючерсах с дневной ребалансировкой по ~10 устоявшимся основным активам Binance USD-M с подтверждённой полной историей (BTC, ETH, SOL, BNB, XRP, DOGE, ADA, LTC, LINK, BCH), специально сконструированная как OVERFIT-RESISTANT BY CONSTRUCTION — предписанное аналитиком исправление, объясняющее отказ от варианта с таргетированием волатильности и двумя временными рамками. У того варианта было настоящее сильное преимущество (+392%, коэффициент Шарпа 2.59 с настройками по умолчанию), но оптимизатор walk-forward OVERFIT его, подбирая один fast_lookback (20→13), что резко улучшило результаты внутри выборки, тогда как вне выборки они обрушились до отрицательного результата на отложенной выборке. Здесь исправление полностью устраняет этот параметр, который можно было эксплуатировать: вместо одного настраиваемого периода просмотра сигнал тренда каждого актива — это AVERAGE знаков тренда, рассчитанных по FROZEN FAN периодов просмотра (20, 40, 80, 160 дней). Единого периода, на котором оптимизатор мог бы чрезмерно сосредоточиться, нет: набор периодов фиксирован, поэтому режим IS/OOS переобучения и обвала структурно нейтрализован, а стратегия рассчитана на оптимизацию устойчивости OOS, а не максимального коэффициента Шарпа IS. Это стандартный метод устойчивости на нескольких горизонтах CTA. Стратегия остаётся строго в пределах ONLY подтверждённого преимущества (DAILY симметричный тренд по устоявшимся основным активам — у продвигаемого аналога AbsoluteMomentum коэффициент Шарпа 1.48; варианты с направлением на одном внутридневном баре/4H и только короткими позициями опровергнуты), использует дневные данные OHLCV только по основным активам (данные надёжны; корзины широкого набора альткоинов/HL не работают из-за проблем с данными) и существенно отличается от всех включённых корзин с одним сигналом: это многогоризонтный ENSEMBLE, а не один период просмотра, пробой или ранжирование. Симметричные длинные и короткие позиции улучшают перекос в пользу длинных позиций 87%; еженедельная ребалансировка сохраняет комиссии незначительными, а почти полное отсутствие настраиваемых параметров противостоит переобучению, которое регулярно губило стратегии.

Итерация 2 исправляет ровно два дефекта кода QA и ничего больше. (1) Привязка к календарю: недельная периодичность больше не использует счётчик `_rebal_count`, зависящий от процесса (антипаттерн из контрольного списка №18); теперь она определяется только временной меткой самого бара, `day_index = ts // 86_400_000_000_000`, и срабатывает, когда `day_index % rebalance_days == 0`, в день без предыдущей ребалансировки. Поэтому сетка одинакова после перезапуска, в walk-forward-окнах, на отложенной выборке и при……Показать большеСвернуть

Итерация 2 исправляет ровно два дефекта кода QA и ничего больше. (1) Привязка к календарю: недельная периодичность больше не использует счётчик `_rebal_count`, зависящий от процесса (антипаттерн из контрольного списка №18); теперь она определяется только временной меткой самого бара, `day_index = ts // 86_400_000_000_000`, и срабатывает, когда `day_index % rebalance_days == 0`, в день без предыдущей ребалансировки. Поэтому сетка одинакова после перезапуска, в walk-forward-окнах, на отложенной выборке и при бумажном воспроизведении, что устраняет расхождение сетки и нарушение согласованности. (2) Строгий лимит на актив: применение `min(raw/total, max_weight)` с последующей нормализацией могло вернуть ограниченные активы выше лимита; теперь веса формируются алгоритмом последовательного перераспределения с фиксацией превысивших лимит активов на уровне AT и пропорциональным перераспределением остатка между остальными. Проверено, что максимальный вес составляет ровно 0.20, а совокупная экспозиция не превышает 1.0 во всех конфигурациях — как тех, где лимит достижим, так и тех, где он недостижим. edge_concern (просадка / уязвимость к влиянию на рынок) был отмечен аналитиком как вопрос, а не дефект кода, поэтому сигнал, набор периодов просмотра, минимальный порог волатильности, формула размера позиции, поток ордеров и набор активов не изменены.

Искажённый взрыв убытков из-за определения размера позиций и взаимозачёта, уничтоживший счёт, поверх корзины направленных позиций с отрицательным преимуществом — однозначно отказаться; не стоит тратить 2 часов. Кривая капитала несогласованна: CAGR -100% (recovery_factor -1.0, счёт обнулился) при заявленном total_return в размере +1883%, а также физически невозможной доходности за один день: -481.7% (2023-08-17), -206% (2023-07-13) и -198.9% (2024-10-24), плюс return_kurtosis 211 — день с показателем -481%……Показать большеСвернуть

Искажённый взрыв убытков из-за определения размера позиций и взаимозачёта, уничтоживший счёт, поверх корзины направленных позиций с отрицательным преимуществом — однозначно отказаться; не стоит тратить 2 часов. Кривая капитала несогласованна: CAGR -100% (recovery_factor -1.0, счёт обнулился) при заявленном total_return в размере +1883%, а также физически невозможной доходности за один день: -481.7% (2023-08-17), -206% (2023-07-13) и -198.9% (2024-10-24), плюс return_kurtosis 211 — день с показателем -481% означает, что стоимость портфеля стала глубоко отрицательной. Нарушен основной инвариант стратегии «без плеча, gross_cap 1.0» (exposure_pct 789%, end_unrealized_pct 849%, annualized_volatility 107%): путь изменения размера позиций и взаимозачёта накапливает позиции далеко за пределами лимита, и это уже итерация 2 неудачных исправлений контроля экспозиции. Длительные периоды простоя (2023-08 → 2024-04 все 0.0) подтверждают, что счёт был уничтожен. Даже если не учитывать этот артефакт, базовое преимущество отрицательное (avg_trade_return_pct -3.5%) у семейства корзин направленного тренда L45/L52 LS, с показателем max_drawdown 63% (от CI до 99%), максимумом в 31 последовательных убыточных сделок и преимущественно отрицательными стрессовыми периодами. Оптимизацию нельзя проводить на PnL, разрушенном дефектом взаимозачёта; даже после исправления корзина осталась бы с отрицательной доходностью на сделку в классе без единого выжившего варианта. Характер отказа: взрыв из-за нарушенного определения размера позиций и взаимозачёта + направленная корзина тренда no_edge LS (L45/L52).

Реализация

Дневная лонг-шорт корзина тренда на управляемых фьючерсах по 10 устоявшимся основным активам Binance USD-M (BTC, ETH, SOL, BNB, XRP, DOGE, ADA, LTC, LINK, BCH). Оценка тренда каждого актива — это AVERAGE знаков тренда по набору периодов просмотра FROZEN (20/40/80/160 дней), поэтому оптимизатору не на чем чрезмерно концентрироваться на одном периоде. Веса распределяются пропорционально убеждённости с равным учётом риска (|оценка| / реализованная волатильность с нижним порогом), строго ограничиваются для каждого актива на уровне 20% алгоритмом распределения с фиксацией достигших лимита весов и нормируются так, чтобы совокупная экспозиция не превышала 1.0x капитала (без кредитного плеча и множителя таргетирования волатильности). Направление задаётся знаком оценки; ребалансировка проводится еженедельно по календарной сетке (число дней с эпохи по модулю 7) с изменением размера при существенном отклонении, чтобы снизить оборот и комиссии.

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

Проверка не пройдена (уровень 4 — проверка QA) [класс=code_defect]: - [edge_concern] Песочница max_drawdown 86.45% (от CI до 96.6%) — экстремальное значение даже для корзины лонг-шорт с ограниченной совокупной экспозицией -1.0 и без плеча, далеко за пределом порога безусловного отказа >50%-DD. Совокупная экспозиция действительно ограничена уровнем 1.0x (веса нормируются до суммы 1; avg_position_pct 18.9%), поэтому причина — убытки из-за длительного неблагоприятного рыночного режима, а не взрыв из-за кредитного……Показать большеСвернуть

Проверка не пройдена (уровень 4 — проверка QA) [класс=code_defect]: - [edge_concern] Песочница max_drawdown 86.45% (от CI до 96.6%) — экстремальное значение даже для корзины лонг-шорт с ограниченной совокупной экспозицией -1.0 и без плеча, далеко за пределом порога безусловного отказа >50%-DD. Совокупная экспозиция действительно ограничена уровнем 1.0x (веса нормируются до суммы 1; avg_position_pct 18.9%), поэтому причина — убытки из-за длительного неблагоприятного рыночного режима, а не взрыв из-за кредитного плеча, но они серьёзны. Ситуацию усугубляют impact_cost_pct 14.77%, ёмкость всего около $4.6M и оборот 55.6, поэтому чистое преимущество уязвимо к влиянию на рынок. total_return +55.9%, коэффициент Шарпа 0.33 (CI пересекает ноль). Конструкция с защитой от переобучения в принципе обоснована, но просадка и уязвимость к влиянию на рынок — главные вопросы для аналитика по полной истории. - Частота еженедельной ребалансировки определяется счётчиком баров, зависящим от процесса (self._rebal_count += 1; if (self._rebal_count - 1) % self._rebalance_days == 0: self._rebalance()), при этом _extract_ts используется только для обнаружения нового бара и никогда не привязывает расписание ко времени — это антипаттерн привязки к времени работы процесса (контрольный список №18). После перезапуска реальной торговли _rebal_count сбрасывается до 0, и ребалансировка происходит сразу на первом баре, привязывая недельную сетку к моменту перезапуска и смещая даты ребалансировки относительно фиксированной календарной сетки. Следствие: нарушение согласованности бэктеста, бумажной и реальной торговли (запущенный в другой день прогон в любой момент времени будет держать другой портфель). Целевой портфель детерминирован, поэтому вызванная перезапуском смена позиций ограничена, но вред от смещения сетки и нарушения согласованности сохраняется в полной мере. Бэктест детерминирован (допустимая песочница), но расписание не подходит для реальной торговли и нестабильно при воспроизведении. - Ограничение весов выполняет min(raw/total, max_weight), затем нормирует сумму до 1; это может поднять некоторые активы выше max_weight (мягкий лимит). Совокупная экспозиция остаётся 1.0x, поэтому это не ошибка корректности, но лимит на каждый актив строго не соблюдается.

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

Шарп
0,48
Общая доходность
1883,15%
Максимальная просадка
63,13%
Всего сделок
494
Доля прибыльных
36,2%
Профит-фактор
1,27

Концепция фиксированного набора периодов просмотра с защитой от переобучения в принципе обоснована; стратегия остаётся в рамках подтверждённой области дневных трендовых корзин

Чистые данные (10 основных активов с полной историей); исправление расписания с привязкой к календарю корректно

Искажённый катастрофический бэктест: CAGR -100% (счёт уничтожен) при recovery_factor -1.0, но total_return +1883% — данные несовместимы

Физически невозможная дневная доходность (-481.7%, -206%, -198.9%; эксцесс 211) — стоимость счёта стала глубоко отрицательной

Нарушен инвариант «без кредитного плеча gross_cap 1.0»: exposure_pct 789%, end_unrealized_pct 849%, волатильность 107% — путь изменения размера позиций и взаимозачёта накапливает экспозицию намного выше лимита, несмотря на две предыдущие итерации контроля экспозиции

Отрицательное базовое преимущество (avg_trade_return_pct -3.5%); семейство корзин направленного тренда L45/L52 LS; max_drawdown 63% (от CI до 99%), максимум последовательных убыточных сделок — 31

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

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['assets', 'gross_cap', 'vol_floor', 'max_weight', 'resize_frac', 'lookback_fan', 'min_notional', 'vol_lookback', 'qty_precision', 'rebalance_days', 'default_qty_precision'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735699260000) -……Показать большеСвернуть

Проверка не пройдена (уровень 2 — синтетические сценарии): Использованные параметры: ['assets', 'gross_cap', 'vol_floor', 'max_weight', 'resize_frac', 'lookback_fan', 'min_notional', 'vol_lookback', 'qty_precision', 'rebalance_days', 'default_qty_precision'] Убедись, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735699260000) - steady_downtrend: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735699260000) - flat_ranging: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735699260000) - volatility_spike: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735699260000) - zero_volume: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735699260000) - price_gap: TypeError: MultiLookbackEnsembleTrendLongShortBasketNoLeverage._bar_ts() принимает 1 позиционный аргумент, но передано 2 (временная метка бара: 1735699260000)

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