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

Стратегии

Квант-трейдинг GDX–GLD: точный перевод стратегии QuantRocket с дневными весами Йохансена и полосами Боллинджера, USEQ | Stratmill

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

GdxGldJohansenBollingerPairs

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

GdxGldJohansenBollingerPairs стремилась как можно точнее перенести стратегию парной торговли Йохансена и Боллинджера GDX/GLD на площадку USEQ, повторно реализовав coint_johansen из statsmodels на numpy, поскольку statsmodels недоступен в песочнице. За 3 итераций дымовой тест слоя 3 в песочнице снова и снова превышал лимит в 300 секунд на дневном окне GDX примерно в 20,000 баров. Запуск остановили в этом цикле проверки. Бэктест, оптимизация и оценка аналитика не проводились, поэтому неизвестно, есть ли у стратегии преимущество.

Гипотеза

Переведи исполняемый класс GDX_GLD_Pair QuantRocket, сохранив ежедневные скользящие веса Йохансена, полосы в одно стандартное отклонение, независимые устойчивые состояния длинного и короткого сигналов, ежедневный пересчёт целевых весов и исполнение при открытии следующей сессии. Используй GDX.USEQ как основной инструмент, а GLD.USEQ — как вторую торговую позицию; для обоих возьми бары 1-DAY-LAST-EXTERNAL. Исходные значения по умолчанию: LOOKBACK_WINDOW=20, BBAND_STD=1, DB_FIELDS=['Close','Open']; класс выбирает GDX и GLD из usstock-1d. Исходная комиссия USStockCommission составляет $0.005 за акцию; замени её нулевыми комиссиями платформы USEQ и моделируемыми спредом и влиянием на цену, явно указав разницу. Не заявляй о прибыльности исходной стратегии и не добавляй фильтры, стоп-лоссы, тесты значимости коинтеграции или оптимизацию параметров.

Явная просьба о точном переводе исходника определяет инструменты и механизм. Эта пара добавляет длинную и короткую позиции по двум акциям в корпус, где преобладают стратегии только с длинными позициями на Binance. Она не закрывает квоты Hyperliquid или торговли между площадками. Данные о концентрации корпуса отсутствовали, поэтому оценить долю исследований по отдельным инструментам нельзя. В отличие от предыдущего предложения по акциям разных классов, эта стратегия торгует акциями золотодобытчиков против золота в слитках и ежедневно пересчитывает веса по Йохансену; однако её экономика по-прежнему не подтверждена.

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

Реализация

Точный перевод Stratmill подкласса QuantRocket GDX_GLD_Pair (PairsStrategy, Apache-2.0). На каждой сессии модель оценивает вектор хеджирования Йохансена (det_order=0, k_ar_diff=1) по ценам закрытия за предыдущие 20 сессий для [GLD, GDX]. Для сегодняшнего спреда рассчитываются полосы Боллинджера за 20 сессий с шириной 1 сигм (ddof=1). Независимые сохраняющиеся состояния длинной и короткой позиции по спреду возникают при выходе за полосу и закрываются при возвращении к среднему. Целевые веса равны сигналу × хеджированию × цене закрытия и нормируются до валовой экспозиции 1x. Через одну сессию обе позиции ребалансируются до целевых значений в целых акциях.

Итерация 3 исправляет сбой Layer-1.5: «optimization_plan фиксирует кредитное плечо на уровне 1.0». В конфигурации итерации 2 отсутствовал `leverage` из `parameters`, а валидатор плана требует, чтобы в этом разделе присутствовал каждый фиксированный ключ с тем же типом. `parameters.leverage = 1.0` (float) восстановлен, и validate_plan проходит локальную проверку по плану исследования. Теперь код читает его как документированное зеркало config.leverage, используемого при расчёте размера позиции. Сохранена также не……Показать большеСвернуть

Итерация 3 исправляет сбой Layer-1.5: «optimization_plan фиксирует кредитное плечо на уровне 1.0». В конфигурации итерации 2 отсутствовал `leverage` из `parameters`, а валидатор плана требует, чтобы в этом разделе присутствовал каждый фиксированный ключ с тем же типом. `parameters.leverage = 1.0` (float) восстановлен, и validate_plan проходит локальную проверку по плану исследования. Теперь код читает его как документированное зеркало config.leverage, используемого при расчёте размера позиции. Сохранена также не меняющая поведение чистка кода в итерации -2: очередь closes имеет maxlen=lookback и напрямую передаётся в подбор параметров Йохансена. Сигналы, машина состояний, веса и исполнение не изменены. Адаптации платформы также без изменений: исполнение по цене закрытия следующей сессии вместо её открытия (на дневных барах нет исполнения на аукционе открытия), а также нулевая комиссия USEQ и моделируемые спред и влияние на цену вместо USStockCommission с комиссией $0.005 за акцию. Итерация 1 была запущена локально и не выявила преимущества: коэффициент Шарпа -0.03, PF 0.95, средняя сделка -0.009%, максимальная DD 29%. Это согласуется с гипотезой: «не заявлять о доходности исходной стратегии». Более ранняя задержка Layer-3 была связана с затратами на сканирование каталога и нагрузкой на хост, а не с обработкой отдельных баров стратегией.

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

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

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

Проверка не пройдена (слой 1.5 — согласованность гипотезы и конфигурации) [class=hypothesis_mismatch]: - optimization_plan фиксирует плечо на уровне 1.0

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

При скользящем расчёте Йохансена матрицы пересоздаются и обращаются либо раскладываются на каждом баре. Чтобы такой расчёт на чистом numpy укладывался в лимит времени песочницы, затраты на бар должны быть низкими: например, кэшируй результаты по временным меткам и избегай повторного просмотра буферов.

Запуск остановили после 3 итераций цикла проверки. Бэктест в песочнице слоя 3 превысил лимит в 300 с на окне примерно в 20,000 баров (2400 дней по GDX.USEQ дневных баров), поэтому проверка бэктеста, оптимизация, проверка аналитиком и проверка рисков не проводились.

Это был прямой перенос стратегии парной торговли GDX/GLD на дневные бары USEQ. Каждый день рассчитывалось отношение хеджирования по тесту Йохансена на последних 20 ценах закрытия; спред торговался относительно полос Боллинджера шириной в одно стандартное отклонение, а целевые веса восстанавливались через одну сессию. Комиссии были нулевыми, спред и влияние на цену моделировались.

Данных о доходности нет: отчёты о бэктесте и оптимизации, а также число сделок не получены, поскольку стратегия не прошла проверку.

Анализ

PairsStrategy

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