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

Стратегии

Бэктест стратегии: тренд Quantiacs (WMA200 / ROCP20 / диапазон 2%), дневная корзина из 7 инструментов — бессрочные фьючерсы OKX USDT; лонг/шорт, равный вес активных ног

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

QuantiacsTrendFollowingOkxBasket

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

В этом запуске автомат состояний стратегии следования за трендом Quantiacs WMA/ROCP перенесён на корзину из семи инструментов OKX бессрочных фьючерсов USDT с ежедневной торговлей в лонг и шорт и равными весами. На бэктесте первой итерации корзина потеряла 15.57% примерно за 4.7 лет: 58 сделок, фактор прибыли 0.920, коэффициент Шарпа 0.19 и просадка 64.31%. Движение цены дало лишь небольшую прибыль, а расходы на финансирование превратили результат в убыток. При разборе бэктеста аналитик отказался от стратегии до оптимизации, отметив, что это не опровергает исходную стратегию Quantiacs или все возможные варианты параметров.

Гипотеза

Точный перенос стратегии Quantiacs «strategy-futures-trend-following» с лицензией MIT (strategy.ipynb, функция `strategy(data)` с несколькими проходами); авторство принадлежит Quantiacs. В исходнике используется вселенная фьючерсов Quantiacs. Наша платформа не поддерживает торговлю фьючерсами CME, поэтому корзина состоит из OKX бессрочных фьючерсов USDT с дневной историей как минимум с 2021-01-24: BTC, ETH, SOL, ADA, LINK, BCH и TRX. OKX недостаточно представлен в корпусе — 2.7%. RULES, одинаковый для каждого……Показать большеСвернуть

Точный перенос стратегии Quantiacs «strategy-futures-trend-following» с лицензией MIT (strategy.ipynb, функция `strategy(data)` с несколькими проходами); авторство принадлежит Quantiacs. В исходнике используется вселенная фьючерсов Quantiacs. Наша платформа не поддерживает торговлю фьючерсами CME, поэтому корзина состоит из OKX бессрочных фьючерсов USDT с дневной историей как минимум с 2021-01-24: BTC, ETH, SOL, ADA, LINK, BCH и TRX. OKX недостаточно представлен в корпусе — 2.7%. RULES, одинаковый для каждого актива, рассчитывается по цене закрытия самого актива за 1-DAY: ma = WMA(close, 200), линейно-взвешенное скользящее среднее из TA-Lib с весами 1..200; самый свежий бар имеет наибольший вес. roc = ROCP(ma, 20) = ma[t]/ma[t-20] - 1. sideways_threshold = 0.02. positive_trend = roc > 0.02; negative_trend = roc < -0.02; боковой режим = |roc| <= 0.02. side_positive_trend = последнее состояние вне бокового режима было положительным; side_negative_trend = последнее состояние вне бокового режима было отрицательным; до появления бара вне бокового режима оба значения равны False. Автомат состояний позиции для каждого актива — перенос кода xarray: начальное значение 0. Для каждого бара по порядку: если positive_trend, raw = +1; если negative_trend, raw = -1; иначе raw не задан. fp — заполненная вперёд предыдущая позиция с учётом raw. Если side_negative_trend и fp > 0, raw = 0. Если side_positive_trend и fp < 0, raw = 0. position = raw, если задана, иначе предыдущая позиция (ffill), начальное значение 0. Таким образом, актив открывает лонг, когда изменение WMA за 20 дней превышает +2%, и шорт, когда оно ниже -2%. В боковом режиме позиция сохраняется. Положительный тренд задаёт side_positive_trend, поэтому закрыть лонг может только отрицательный режим, который уже меняет его на шорт через sell_signal. Поэтому ветви стопа редко приводят к нулевой позиции, а разработчик должен в точности воспроизвести порядок действий в исходнике, а не упрощать его. WEIGHTS: output = position / сумма модулей position по корзине; значит, вес каждого актива с ненулевой позицией равен ±1/N_active валовой позиции, а при нулевых позициях всех активов позиции нет. PLATFORM ADAPTATIONS (отсутствует в исходнике): (1) Валовой номинал = капитал счёта × плечо 1.0, поэтому номинал каждой активной ноги = капитал / N_active, со знаком позиции. (2) Исполнение: Quantiacs применяет веса дня t со следующего дня. На площадке 24/7 наша возможность `next_bar_open_fill` равна `use_equivalent`, поэтому выставляются рыночные ордера по цене закрытия сигнального бара, которая равна цене открытия следующего дневного бара. (3) Исходник ежедневно ребалансирует веса до целевых. Чтобы не платить комиссию тейкера за небольшие сделки из-за отклонения, размер ноги меняется только при смене целевого знака, изменении N_active или отклонении номинала от цели более чем на rebalance_tolerance (фиксировано на уровне 20%). Это единственное добавленное правило. (4) В исходнике нет стоп-лосса, и он не добавлен; выходы определяются только автоматом состояний. (5) Комиссии OKX составляют 0.05% для тейкера, около 0.10% за оборот туда и обратно; финансирование учитывается через реестр. WARM-UP: индикаторам нужны бары 200 + 20. Зарегистрированный период прогрева — 360 дневных баров, этого также хватает для настраиваемого максимума 300 + 40. Так исправлен период прогрева в 1825 баров, заданный в предыдущем контракте: это было окно данных 5 `lookback_period` из исходника, а не требование индикаторов, и оно превышало общую историю корзины. Заявления исходника о результатах не проверены; вывод зависит от нашего бэктеста.

Исправление повторной попытки: в предыдущем контракте для прогрева использовались 5*365 lookback_period из исходника. Индикаторам нужно 220 баров (360 с настраиваемыми максимумами), что укладывается в общую дневную историю корзины с 2021-01-24 (около 2,070 дней). Сохранён фьючерсный характер исходника и позиции лонг/шорт; OKX заполняет недостаточно представленную категорию площадок.

negative_expectancy: измеренная реализация корзины OKX убыточна после учёта финансирования и издержек исполнения; показатель PF 0.920 и avg_trade_return_pct -4.194% по сравнению с +0.15%. Издержки финансирования перекрывают небольшой положительный вклад price_pnl. Эти базовые результаты не оправдывают двухчасовой поиск параметров. Вывод относится к этой версии для криптовалютных бессрочных контрактов с добавленным допуском на ребалансировку; он не опровергает исходную стратегию Quantiacs для фьючерсного набора инструментов и не доказывает, что все варианты параметров убыточны.

Реализация

Перенос стратегии Quantiacs strategy-futures-trend-following на бессрочные фьючерсы 7 OKX USDT (BTC, ETH, SOL, ADA, LINK, BCH, TRX), дневные бары. Для каждого актива вычисляется WMA(200) -> ROCP(20) с боковым диапазоном 2% и исходным автоматом состояний стопа по последнему заполненному трендовому состоянию. Лонг открывается при roc > +2%, шорт — при roc < -2%; в боковом режиме позиция сохраняется. Вес портфеля равный: размер каждой активной ноги — +-MTM капитала x плечо / N_active; если все ноги имеют нулевую позицию, позиция стратегии тоже нулевая.

Перевод, сохраняющий логику многошаговой функции strategy(data). Для WMA используются линейные веса 1..n из TA-Lib; максимальный вес получает самый свежий бар. ROCP = ma[t]/ma[t-20]-1. side_positive и side_negative воспроизводят where(sideways==False).ffill().fillna(False) из xarray, поэтому бар с неопределённым roc считается баром вне бокового режима, а оба флага равны False. Ветви стопа используют fp — заполненный вперёд ряд raw для стопа PRE — и исполняются в порядке исходника. Итоговая позиция — заполненный……Показать большеСвернуть

Перевод, сохраняющий логику многошаговой функции strategy(data). Для WMA используются линейные веса 1..n из TA-Lib; максимальный вес получает самый свежий бар. ROCP = ma[t]/ma[t-20]-1. side_positive и side_negative воспроизводят where(sideways==False).ffill().fillna(False) из xarray, поэтому бар с неопределённым roc считается баром вне бокового режима, а оба флага равны False. Ветви стопа используют fp — заполненный вперёд ряд raw для стопа PRE — и исполняются в порядке исходника. Итоговая позиция — заполненный вперёд ряд после применения стопа. Реализация кода xarray на pandas совпала с этой логикой в 200 из 200 случайных испытаний. Веса рассчитываются как position/sum|position|. Каждая нога — отдельный рыночный ордер по своему инструменту; ордер выставляется с calculate_signal на основном баре после того, как барьер базового инструмента на том же таймфрейме синхронизировал все 7 ног по временной отметке этого бара. На первом оцениваемом баре автомат состояний повторно обрабатывает буферизованную историю каждой ноги и стартует с учётом истории, как и окно 5 лет в исходнике. Параметры сохраняют значения по умолчанию из исходника. rebalance_tolerance (0.2) и плечо (1.0) фиксированы согласно плану; wma_period, roc_period и sideways_threshold можно настраивать. Ограничения не применяются, поэтому _param_bounds не заданы. Ожидается мало сделок: около 7 ног, несколько смен тренда в год, плюс изменения размера при смене N_active.

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

В полном бэктесте проверьте, что финансирование OKX (PG funding_rates, биржа okx) прикреплено к каждой ноге. До этого считайте доходность симулятора рассчитанной до вычета финансирования.

В симуляторе финансирование не учитывается (funding_folded=false, funding_events_available=0), хотя в гипотезе указано, что оно применяется через реестр. Это вопрос платформы или подключения данных, а не кода стратегии. Стратегия не считывает данные о финансировании, что правильно для этого правила, основанного только на цене.

Изменения не нужны. Аудитор пробелов в данных должен сохранять все OKX дневные ноги без пропусков.

Автомат состояний каждой ноги продвигается только тогда, когда барьер базового инструмента на том же таймфрейме выпускает основной бар; для этого на момент времени ts должны быть бары у всех 7 ног. Если у одной ноги OKX нет дневного бара, этот день пропускается для всей корзины. Следующий бар наверстывает пропуск, поскольку _update_leg обрабатывает все буферизованные бары с ts > leg_last_ts, поэтому состояние остаётся корректным, но ребалансировка за этот день пропускается. Заглядывания вперёд нет: барьер обеспечивает одновременность цен закрытия.

Нет. Статическое предупреждение base_shadow здесь ложно срабатывает.

min_bars_required() намеренно переопределена: max(360, wma+roc+1). Это удерживает calculate_signal, пока не буферизованы 360 основных баров. Наихудший требуемый объём — 300+40 — помещается в базовый буфер _max_bars=500, поэтому история WMA никогда не обрезается.

В песочнице указана максимальная просадка 48.4%, превышающая ограничение плана 35%; бутстрэп DD CI составляет 33-84%. При открытии любой позиции портфель всегда имеет валовую экспозицию 1x; стоп-лосса нет — это соответствует исходному варианту. Короткие позиции оказываются прибыльными лишь в 29% случаев, а спокойный режим приносит убыток -19.7%. Также песочница сообщает funding_folded=false и funding_events_available=0, поэтому OKX фондирования при удержании позиций в течение нескольких месяцев (в среднем 209 дней) NOT учтено в PnL. Прежде чем доверять результату, проверь, что в полный бэктест включён реестр фондирования OKX: во время бычьего рынка криптовалют длинные позиции долго платят положительное фондирование. Комиссии не вызывают опасений: средняя доходность сделки 5.0% от номинала против примерно 0.10% за полный круг, а комиссии составляют 0.75% от валовой суммы. В реестре учтено 37 закрытых позиций, но 368 исполнений, поскольку размер позиции меняется при каждом изменении N_active.

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

Шарп
0,19
Общая доходность
-15,57%
Максимальная просадка
64,31%
Всего сделок
58
Доля прибыльных
36,2%
Профит-фактор
0,92

В торговых записях есть длинные и короткие позиции по всем семи инструментам, что соответствует предполагаемым направлениям торговли корзины и низкой частоте оборота.

Финансирование учтено: доступные события (36,185) и явные денежные потоки финансирования в закрытых сделках снимают опасения QA по поводу отсутствия финансирования.

За 1,725 оценённых дней 58 закрытых позиций принесли убыток $15,573.51: PF 0.920 и средняя доходность сделки -4.194% против заданного минимального уровня OKX для фьючерсов +0.15%.

Торговые записи согласуют $2,348.73 от price_pnl с -$17,922.24 финансирования и показывают чистый убыток. Реализованный портфель с долгим удержанием не зарабатывает достаточно, чтобы покрыть фактические расходы на удержание.

Опасения QA по поводу риска подтвердились: просадка достигает 64.31%, при этом 2025 убыточных 44.05%. Просадка служит дополнительным свидетельством, но не является единственной причиной отказа.

Бенчмарк корзины помечен как неинформативный; вывод об альфе относительно стратегии «купи и держи» не обоснован.

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

Для медленных трендовых портфелей с долгим удержанием позиций в криптовалютных бессрочных фьючерсах ценовое преимущество нужно оценивать за вычетом расходов на финансирование, поскольку финансирование (здесь -$17.9 тыс.) может легко перевесить умеренное преимущество от направления цены.

Аналитик разбора бэктеста проголосовал за отказ от стратегии из-за отрицательного матожидания: avg_trade_return_pct из -4.194% против нижней границы по фьючерсам +0.15% OKX; влияние финансирования перевесило небольшой положительный PnL от движения цены, поэтому двухчасовая оптимизация признана неоправданной. Аналитик уточнил, что этот вердикт относится только к переносу на криптовалютные бессрочные фьючерсы и добавленному допуску ребалансировки, а не к исходной стратегии Quantiacs для фьючерсного рынка.

Точный перенос фьючерсной стратегии следования за трендом Quantiacs с лицензией MIT (WMA200, 20-дневный ROCP для WMA, боковой диапазон ±2%, автомат состояний лонг/шорт для каждого актива) на дневную корзину 7 бессрочных фьючерсов OKX USDT с равными весами (BTC, ETH, SOL, ADA, LINK, BCH, TRX) и плечом 1.0x; добавлен допуск ребалансировки 20%.

За 1,725 оценённых дней (2022-01-19 — 2026-10-09) закрыто 58 позиций; общая доходность — -15.57% (CAGR -3.52%), коэффициент Шарпа — 0.19, фактор прибыли — 0.920, доля прибыльных сделок — 36.2%, avg_trade_return_pct -4.194%, максимальная просадка — 64.31%. Торговые записи показывают +$2,348.73 PnL от цены и -$17,922.24 от финансирования.

Анализ

strategy-futures-trend-following

Анализ

strategy.ipynb

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