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

Просмотреть оригинал

BtcSpotDualTimeframeMomentumConfluenceLong

Гипотезы

BTC Spot Dual-Timeframe Momentum Confluence, LONG-ONLY 1x (BTCUSDT.BINANCE_SPOT, 4H Primary + 1D Confirm, только лонг, когда BOTH таймфреймов указывают UP, иначе FLAT в кэш, выход по трейлингу ATR + слому дневного режима, параметры сохранены с исходной оптимизацией)

Гипотезы

LONG-ONLY, 1x, CASH-счётный перенос лучшей продвинутой стратегии фабрики (BtcDualTimeframeMomentumConfluenceLS, Шарп 1.99, 458 сделок, +$4,774 за 29 дней бумажной торговли) на BTCUSDT.BINANCE_SPOT, созданный специально как FIRST LIVE-TRADING CANDIDATE, поскольку live-площадка только спотовая. Механизм не изменён, чисто-OHLCV, для одного инструмента: нога FAST = знак скользящей 18-баровой доходности на барах 4-HOUR; нога SLOW = знак скользящей 15-баровой доходности на барах DAILY (считывается через on_extra_bar как контекстная нога, никогда не как барьер синхронизации). Обе должны AGREE. Единственное структурное изменение, которое требует счёт CASH, — это схлопывание {LONG/FLAT/SHORT} в {LONG/FLAT}: там, где фьючерсный родитель уходит в SHORT при совместном движении вниз, спотовая версия удерживает 100% USDT. Всё остальное сохранено дословно: трейлинг-стоп ATR(14) на 3.033x ATR от текущего экстремума, выход по слому дневного режима, размер позиции с поправкой на волатильность относительно капитала (risk_pct 1.011% / дистанция стопа 3.033xATR), максимальный номинал 49.7%, и тот же самый вектор параметров, выбранный исходной оптимизацией (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Три настраиваемых параметра, никаких дополнительных данных, никаких шортов, никакого плеча. Специфичные для спота изменения кода: площадка BINANCE_SPOT CASH (без множителя плеча в position_size), size_precision 5 / price_precision 2, min_notional $10, продажи рассчитаны только по удерживаемому базовому количеству. Проверено наличие данных: BTCUSDT.BINANCE_SPOT бары 4-HOUR и 1-DAY идут непрерывно с 2017-08-17 (~9 лет, ~19,800 баров 4H).

Гипотезы

Прямой перенос продвинутой родительской фьючерсной стратегии BtcDualTimeframeMomentumConfluenceLS на спотовую площадку, поскольку целевая live-площадка только спотовая. Механизм сохранён дословно: те же две ноги моментума, тот же вентиль AGREE-или-плоская-позиция, тот же трейлинг-стоп ATR(14) 3.033x от текущего экстремума, тот же выход по слому дневного режима, тот же размер позиции с поправкой на волатильность risk_pct / дистанцию до стопа с ограничением по номиналу 49.7%, и тот же самый вектор параметров, выбранный исходной оптимизацией (fast_lookback 18, slow_lookback 15, trail_atr_mult 3.033). Счёт CASH требует ровно одного структурного изменения, как и указано в гипотезе: {LONG,FLAT,SHORT} схлопывается в {LONG,FLAT} — should_enter возвращает BUY только при совместном движении вверх и None в остальных случаях, так что совместное движение вниз означает 100% USDT, а не шорт. Специфичные для спота правки: площадка BINANCE_SPOT с плечом 1.0 и без слагаемого плеча в position_size, size_precision 5 / price_precision 2 (BTCUSDT спот), min_notional повышен до $10, а все выходы проведены через reduce-only close_position базового шаблона, так что SELL может только сокращать удерживаемое базовое количество (голый спотовый шорт невозможен по построению, и защита базового шаблона _would_open_spot_short никогда не срабатывает). calculate_signal возвращает непрерывную 18-баровую доходность 4H на каждом баре (она меняется от бара к бару); дискретный вентиль слияния находится в should_enter, как и требуется. Стоимость на бар O(1): ATR использует фиксированное окно в 15 баров, а быстрая доходность — это одно индексированное обращение, так что масштабирования с историей не происходит. Одна честная оговорка для аналитика: стоимость кругового оборота на споте составляет ~0.20% против ~0.10% у фьючерсного родителя, так что преимущество на сделку должно перекрывать вдвое большее трение — структура выхода в стиле следования за трендом (трейл + слом режима, без фиксированного тейк-профита) делает средний период удержания достаточно долгим, чтобы это было правдоподобно, но именно эту метрику нужно отслеживать в первую очередь.

Реализация

LONG-ONLY 1x BTCUSDT спот (BINANCE_SPOT, CASH) — слияние моментума двух таймфреймов. Нога FAST = знак скользящей 18-баровой доходности на барах 4-HOUR (основная); нога SLOW = знак скользящей 15-баровой доходности на барах 1-DAY, потребляется через on_extra_bar как контекстная нога более медленного таймфрейма (другой таймфрейм, поэтому барьер выравнивания ног базового шаблона никогда не откладывает сигнал 4H). Обе ноги должны указывать UP, чтобы удерживать BTC; совместное движение вниз (где фьючерсный родитель шортит) и разногласие обе означают удержание 100% USDT. Выходы: трейлинг-стоп ATR(14) на 3.033x ATR ниже текущего пика позиции, OR переворот дневной ноги вниз под лонгом (слом режима на более высоком таймфрейме). Размер позиции масштабируется по волатильности и относителен к капиталу: equity * 1.011% / (3.033 * ATR), ограничен 49.7% от баланса USDT в номинале, с NO множителем плеча (счёт CASH не может занимать), квантован до size_precision 5 и отклоняется ниже спотового минимального номинала $10. Три настраиваемых параметра, чисто OHLCV, никаких дополнительных данных, никаких шортов.

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

Либо использовать self._atr (текущий) в сравнении трейла в should_exit, чтобы точно соответствовать родительской стратегии, либо явно указать в описании, что трейл привязан к ATR на баре входа, чтобы аналитик не приписывал расхождение с родителем смене площадки.

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

ATR трейлинг-стопа FROZEN на момент входа (self._entry_atr, зафиксирован в should_enter / при принятии позиции) и никогда не обновляется, так что дистанция трейла — это 3.033 x ATR на момент входа, а не 3.033 x текущий ATR(14). Продвинутый фьючерсный родитель (BtcDualTimeframeMomentumConfluenceLS4H) подтягивает свой трейл текущим CURRENT ATR на каждом баре. Формулировка гипотезы ('трейлинг-стоп ATR(14) на 3.033x ATR от текущего экстремума') выполняется в обоих случаях, и поскольку _extreme монотонен, уровень стопа всё равно только подтягивается вверх, так что это не дефект корректности — но при расширении волатильности после входа эффективный стоп оказывается более жёстким, чем у родителя, что является реальным поведенческим отличием от стратегии, которую заявлено переносить 'дословно'.

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

Устанавливать состояние сделки по факту исполнения (on_order_filled / первый бар с открытой позицией), а не внутри should_enter, либо сбрасывать его защитно в начале calculate_signal перед поиском позиции.

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

should_enter() изменяет состояние сделки (_in_long = True, _extreme, _entry_atr) BEFORE того, как базовый шаблон рассчитал размер ордера и применил вентиль минимального номинала. Если position_size() возвращает 0 или проверка минимального номинала $10 отклоняет вход, стратегия остаётся помеченной как в-лонге со взведённым трейлом, находясь при этом вне позиции. На практике это самоисправляется на следующем баре (calculate_signal видит, что позиция равна None, и сбрасывает флаги, а should_exit никогда не достигается, пока позиция плоская), так что наблюдаемого поведенческого бага нет — но этот инвариант хрупок, если путь выхода когда-либо изменится.

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

Исправление для корректности не требуется. Если нужно точное потребление в рамках того же бара, пересчитывать _slow_dir лениво из self._extra_bars[...] внутри calculate_signal, вместо того чтобы кэшировать его в on_extra_bar.

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

Задержка в один бар на дневной ноге: бар DAILY и последний 4H-бар дня имеют одинаковую метку времени закрытия. Если движок сначала доставляет основной 4H-бар, выполняется _maybe_process_primary() и фиксируется _last_processed_ts, а обновление _slow_dir дневного бара (пришедшего с той же меткой времени) учитывается только со следующего NEXT 4H-бара. Это консервативно (сигнал может только задержаться, но никогда не произойдёт утечка будущих данных), но означает, что выход по слому дневного режима может сработать до 4 часов после дневного закрытия примерно в половине случаев, а паритет бэктеста и бумажной торговли зависит от стабильности порядка доставки.

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

Добросовестная реализация, но три момента, которые аналитику стоит учесть на полной истории: (1) круговой оборот на споте составляет ~0.20% против ~0.10% у родительской фьючерсной стратегии, так что то же валовое преимущество даёт примерно вдвое меньше в чистом виде — в песочнице комиссия уже составляет 10.03% от валовой прибыли; (2) вектор параметров (быстрый 18 / медленный 15 / трейл 3.033) был подобран оптимизационным прогоном на DIFFERENT площадке, наборе таймфреймов и направлений (LONG/SHORT фьючерсы), так что это перенос вне выборки (out-of-sample), а не оптимизированная конфигурация — коэффициент Шарпа в песочнице равен 0.527 при sharpe_ci_low -0.233 и information_ratio -0.760 относительно бенчмарка, т.е. книга только-лонг BTC, которая уступает удержанию BTC на окне дымового теста; (3) отбрасывание короткой ноги убирает примерно половину популяции сделок родительской стратегии (250 сделок, все лонговые, 43.6% экспозиция), поэтому реализованный коэффициент Шарпа следует ожидать заметно ниже родительского 1.99, а не близким к нему. Первое, что нужно проверить на реальном бэктесте: avg_trade_return_pct против спотового минимума 0.25% (в песочнице показано 0.82%, но это окно исключает 2017 и составляет всего 2401 дней), а также сохраняется ли отрицательным 'нормальный' терциль волатильности (-8.77% в песочнице) на полной истории.

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

314 закрытых сделок за 3146 дней (2017-08 → 2026-03), metrics_reliable=true, entry_diag 314/314 заявок отправлено, 0 отклонено.

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

Сделки реализуют гипотезу: все 314 LONG / 0 шорт (корректное схлопывание CASH родительского LONG/FLAT/SHORT), максимальный номинал/капитал 0.50 против ограничения 0.497, средний период удержания 4д8ч, а экспозиция 43.6% воспроизводит фьючерсного родителя.

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

avg_trade_return_pct 1.20% против ~0.20% BINANCE_SPOT за круговой оборот; комиссии всего 8.97% от валовой прибыли, влияние 4.33% — не на грани по комиссиям.

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

max_drawdown 10.3% (при спотовом дефолте 15%), PF 1.41, выплата 2.07 при доле выигрышных сделок 40.4% (правильная форма тренда), терциль волатильности под стрессом +28.0%.

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

Экстремальная концентрация: топ 10 из 314 сделок = 93.8% суммарной прибыли по сделкам, топ 20 = 141% (сделки 21–314 в чистом минусе).

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

Только 6/10 календарных лет положительны — ровно на жёстком пороге — и оба последних года отрицательны (2025 −10.5%, 2026 −9.9%).

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

Шарп 0.664 при sharpe_ci_low 0.0042 и PSR 0.924 (<0.95): уже маргинально до планки отбора из ~225 испытаний.

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

Опасение QA частично подтвердилось: 'нормальный' терциль волатильности остаётся отрицательным (−7.70%, 16.1% DD), information_ratio −0.757, альфа всего +2.4%/год — стратегия уступает удержанию BTC, и benchmark_meaningful=true, так что это отставание реально.

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

Параметры представляют собой перенос вне выборки с другой площадки/набора направлений — не переподогнаны, но и не протестированы здесь.
Отчёт по стратегии

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