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

Стратегии

XLE/USO возврат логарифмического спреда акций энергетики и нефти OU (USEQ дневной, нейтральный по долларовой стоимости, подгонка OU с учётом доступности данных)

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

XleUsoOuLogSpreadReversion

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

XleUsoOuLogSpreadReversion пыталась перенести модель парной торговли товарами со стохастическим спредом на XLE относительно USO, используя 20 лет дневных данных по акциям US и торгуя крайние значения z-оценки бета-хеджированного логарифмического спреда на уровне OU. В гипотезе указано скромное преимущество предварительного исследования (средняя сделка около +0.5%, коэффициент Шарпа около 0.3) и отмечено существенное смещение отбора. За 3 итераций код так и не прошёл проверку: слой 1.5 отклонял каждую попытку, поскольку optimization_plan фиксирует плечо на уровне 1.0. Запуск прекратили до бэктеста, оптимизации или заключения аналитика, поэтому преимущество в рамках конвейера не проверено.

Гипотеза

Перевод работы Махаджана и др. (2019), «Парная торговля со стохастическим спредом на индийском товарном рынке» (arXiv:1907.08397, аннотация: коинтегрированные товарные пары, однофакторная стохастическая модель (OU) для спреда LOG, параметры торговых правил подбираются на обучающих данных). Спотовые товары MCX недоступны на наших площадках, поэтому используется ближайшая товарная пара с длинной историей, пригодная для бэктеста: XLE.USEQ (акции интегрированных нефтегазовых компаний) против USO.USEQ (фьючерсы на……Показать большеСвернуть

Перевод работы Махаджана и др. (2019), «Парная торговля со стохастическим спредом на индийском товарном рынке» (arXiv:1907.08397, аннотация: коинтегрированные товарные пары, однофакторная стохастическая модель (OU) для спреда LOG, параметры торговых правил подбираются на обучающих данных). Спотовые товары MCX недоступны на наших площадках, поэтому используется ближайшая товарная пара с длинной историей, пригодная для бэктеста: XLE.USEQ (акции интегрированных нефтегазовых компаний) против USO.USEQ (фьючерсы на нефть WTI с ближайшим месяцем поставки ETF), оба инструмента представлены барами 1-DAY с 2006 (~20 лет, ~5,100 совпадающих сессий). Экономическая связь: денежные потоки компаний из состава XLE зависят от цены нефти, поэтому логарифмический спред log(XLE) - beta*log(USO) в среднесрочной перспективе возвращается к среднему. Краткосрочные разрывы возникают из-за потоков, связанных только с акциями, переноса фьючерсов на нефть и шоков контанго; они закрываются, когда рынок акций переоценивает нефтяную экспозицию. Реализация модели статьи с использованием только данных, доступных на момент принятия решения: (1) коэффициент хеджирования beta — наклон дневных логарифмических доходностей XLE относительно USO за скользящий период в 252 сессий OLS, с задержкой на один бар. (2) спред s_t = log(XLE_t) - beta_{t-1}*log(USO_t). (3) параметры OU (theta — долгосрочное среднее, sigma_eq — стационарное стандартное отклонение, kappa рассчитывается по коэффициенту AR(1)) подбираются регрессией AR(1) спреда s на его значение с задержкой за последние `z_window` сессий, используя только завершённые бары. Вместо подгонки дифференциальной эволюцией, использованной в статье, применяется замкнутая формула AR(1); для однофакторной модели OU она эквивалентна и не требует дополнительных вычислений. (4) z = (s_t - theta)/sigma_eq. Длинные и короткие позиции, нейтральные по долларовой стоимости; 2 ноги, большую часть времени позиции нет. Альтернативы на криптовалютах сначала проверили и отклонили из-за данных. Бессрочные контракты на золото и серебро Binance/OKX (XAU/XAG/XPT/COPPER) имеют лишь около 7-10 месяцев истории с барами 1h. Спреды токенизированного золота (XAU против PAXG против XAUT на Binance, XAG Binance против OKX) имеют стандартное отклонение часового спреда 3-6 б.п. и после комиссий принесли убыток во всех вариантах (средняя сделка от -0.01% до -0.06%). Предварительное исследование на дневных данных USEQ (скользящая бета, z за 60 сессий, вход при |z|>1.5-2.0, выход у среднего, ограничение в 20 сессий, затраты 6 б.п.) даёт для XLE/USO около 100-158 сделок, среднюю сделку от +0.51% до +0.58%, долю прибыльных сделок ~0.6, коэффициент Шарпа ~0.30-0.33, положительный результат в 60-70% годах. HONEST CAVEAT: XLE/USO оказалась лучшей среди 21 проверенных товарных пар ETF (GLD, SLV, GDX, XLE, XOP, USO, UNG). У GLD/SLV и GLD/GDX, «классических» товарных пар, преимущества не обнаружено, поэтому смещение отбора существенно, а ожидаемый коэффициент Шарпа OOS скромен. Что должна подтвердить полная версия статьи: точную форму торговых правил (уровни входа и выхода в единицах OU сигма, наличие уровня стоп-лосса), были ли уровни фиксированными или оптимизированными для каждой пары и рассчитан ли заявленный коэффициент Шарпа > 1.4 за вычетом затрат. В аннотации сказано, что параметры «оптимизировали с помощью бэктестинга на обучающем периоде», поэтому показатель 1.4, вероятно, настроен на внутривыборочных данных. source_ref: аннотация arXiv:1907.08397 (абзац о методе: отбор коинтеграции Йохансена + однофакторный стохастический спред на логарифмическом спреде + торговое правило, настроенное на обучающей выборке 80%).

Недостаточно представленные категории: площадка USEQ (4.7%), long_short (15.3% против цели для стратегии только с длинными позициями <= 55%), пары. Криптовалютная версия была протестирована и после уплаты комиссий оказывается убыточной, а по криптовалютным бессрочным контрактам на металлы нет исторических данных. Для товарных ETF на акции доступны ежедневные данные за 20 лет. Всего 3 настраиваемых параметров, все имеют экономический смысл. Заранее зарегистрированные показатели намеренно скромны из-за оговорки о систематической ошибке отбора.

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

Реализация

Парная торговля XLE/USO с нейтральностью по долларовой стоимости на дневных барах USEQ. Коэффициент хеджирования — скользящая бета 252 за OLS сессий для дневных логарифмических доходностей XLE относительно USO, с задержкой на один бар. Спред s = log(XLE) - beta*log(USO). Параметры OU получены замкнутой подгонкой AR(1) на последних z_window завершённых сессиях; все спреды в окне пересчитаны с одной и той же запаздывающей бетой. z = (s - theta)/sigma_eq. Вход в длинный спред при z <= -entry_z и в короткий при z >= entry_z, только если период полураспада <= max_half_life и |z| < stop_z. Выход у среднего (exit_z), на уровне стопа (stop_z) или через max_hold сессий. Каждая нога учитывается как отдельная позиция размером gross_notional_frac/2 капитала.

Итерация 3 исправляет критический дефект разогрева. Теперь min_bars_required() возвращает 2, поэтому calculate_signal работает с бара 1, а торговля запускается только при внутренних флагах _beta_ok/_fit_ok. Логарифмы цен буферизуются с бара 1, а для беты нужны 252 пар доходностей, поэтому первый допустимый z появляется на баре 254 для каждого z_window в [40,120]. Это укладывается в зарегистрированный разогрев длиной 380 баров, поэтому после сброса окон walk-forward-анализа больше не теряются 15-24 месяцев. Также……Показать большеСвернуть

Итерация 3 исправляет критический дефект разогрева. Теперь min_bars_required() возвращает 2, поэтому calculate_signal работает с бара 1, а торговля запускается только при внутренних флагах _beta_ok/_fit_ok. Логарифмы цен буферизуются с бара 1, а для беты нужны 252 пар доходностей, поэтому первый допустимый z появляется на баре 254 для каждого z_window в [40,120]. Это укладывается в зарегистрированный разогрев длиной 380 баров, поэтому после сброса окон walk-forward-анализа больше не теряются 15-24 месяцев. Также устранено предупреждение о смешивании бет QA: окно OU теперь хранит (log XLE, log USO) и пересобирает каждый спред с текущей запаздывающей бетой; затраты составляют O(z_window) на бар, поэтому дрейф коэффициента хеджирования не может создавать ложные выбросы z. Ноги остаются равными по долларовой стоимости, как указано в гипотезе; это сделано намеренно, хотя бета обычно ниже 1 (альтернатива — размер позиции, нейтральный по бете). Очистка осиротевшего хеджа не менялась; на дневных барах экспозиция сохраняется не более одной сессии. Опасения насчёт преимущества (доходность сосредоточена в третиле высокой волатильности, реструктуризация 2020 USO, смещение отбора среди 21 проверенных пар) относятся к рискам гипотезы; аналитик должен оценить их по результатам полной истории и walk-forward-анализа. Изменения кода эти риски не устраняют.

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

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

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

Проверка не пройдена (слой 4 — проверка QA) [класс=code_defect]: - [edge_concern] Песочница работала на протяжении 1,653 сессий и создала 44 позиций по отдельным ногам (22 парных сделок). Доходность составила +3.2%, коэффициент Шарпа 0.13, PF 1.17, средняя сделка +0.29%. Почти вся доходность пришлась на третиль высокой волатильности (+4.28%); в спокойном и обычном третилях результат был немного отрицательным. Исследователь отмечает, что XLE/USO оказалась лучшей среди 21 проверенных пар, поэтому смещение отбора……Показать большеСвернуть

Проверка не пройдена (слой 4 — проверка QA) [класс=code_defect]: - [edge_concern] Песочница работала на протяжении 1,653 сессий и создала 44 позиций по отдельным ногам (22 парных сделок). Доходность составила +3.2%, коэффициент Шарпа 0.13, PF 1.17, средняя сделка +0.29%. Почти вся доходность пришлась на третиль высокой волатильности (+4.28%); в спокойном и обычном третилях результат был немного отрицательным. Исследователь отмечает, что XLE/USO оказалась лучшей среди 21 проверенных пар, поэтому смещение отбора существенно. Реструктуризация USO (2020 — переход от фьючерсов только на ближайший месяц, обратный сплит 1:8) также изменила экспозицию к нефти в середине выборки. Проверь, сохраняется ли преимущество вне 2008, 2014-16, 2020 и 2022. - [критично] Фактический разогрев примерно вдвое длиннее заявленного. Переопределение min_bars_required() = beta_window + z_window + 3 (375 при настройках по умолчанию) заставляет базовую функцию _maybe_process_primary возвращать BEFORE и вызывать calculate_signal для первых 375 баров. В эти бары _rets и _spreads не получают данных. В комментарии сказано, что буферы «перестраиваются по барам разогрева после перезапуска», но код этого не делает. Состояние скользящего окна начинает заполняться только примерно с бара 375. Затем требуется 252 пар доходностей, чтобы _beta_ok стал истинным, а также z_window+1 завершённых спредов, прежде чем _fit_ou завершится успешно. Поэтому первый допустимый z появляется примерно на баре 375 + 253 + 61 ≈ 689 (≈ 870, когда z_window = 120). Зарегистрированный контракт задаёт warmup_bars = 380 при boundary_policy reset_with_warmup, а src/backtesting/warmup.py добавляет ровно 380 предыдущих баров к каждому окну walk-forward-анализа. Проверка среды исполнения сравнивает только min_bars_required() (375) с 380, поэтому она проходит, но по существу контракт нарушен. В каждом сбрасываемом окне из-за этого теряются первые примерно 310-490 сессий, в которые можно было торговать (15-24 месяцев дневных баров). Адаптивные окна проверки длиной 90 дней полностью простаивают и не дают сделок. Оптимизация завершается с ошибкой или ничего не измеряет, а запуск по полной истории незаметно теряет около 2.7 лет в начале. (строка 45) — исправление: выбери один вариант: (а) пусть min_bars_required() возвращает небольшое число (например, 2), а торговля запускается только при внутренних флагах _beta_ok/_fit_ok, чтобы бары разогрева 380 заполняли двусторонние очереди; в худшем случае потребуется 253 + 121 = 374 баров при z_window = 120, что укладывается в 380. Или (б) сохрани переопределение, но на первом обработанном баре заново собери _rets и _spreads из self._bars, сопоставив их по ts_init с self._extra_bars[USO]. В любом случае покажи, что первый ненулевой z появляется не позже бара 380 при z_window = 120. - [предупреждение] Ноги равны по долларовой стоимости, как и указано в гипотезе («нейтральность по долларовой стоимости»), но сигнал использует взвешенный по бете спред log(XLE) - beta*log(USO). Бета дневной доходности XLE относительно USO обычно составляет около 0.3-0.6. Поэтому прибыль и убыток позиции отслеживают r_XLE - r_USO, а не r_XLE - beta*r_USO: примерно половина ноги USO остаётся незахеджированной направленной ставкой на нефть. Это соответствует сформулированной гипотезе и не блокирует работу, но торгуемый спред отличается от того, для которого рассчитывается z. (строка 211) — исправление: рассмотри размер ноги USO, равный beta × номинал XLE (нейтральность по бете), либо явно укажи, что нужна нейтральность по долларовой стоимости, несмотря на beta != 1. - [предупреждение] Для каждого сохранённого спреда используется бета, действовавшая в момент его расчёта, поэтому окно AR(1)/OU объединяет спреды с разными коэффициентами хеджирования. У log(USO) уровень около 2-5, поэтому изменение беты на 0.05 за окно сдвигает s на 0.1-0.25. Это сопоставимо с sigma_eq и может создавать искусственные выбросы z. Используются только доступные на тот момент данные, заглядывания в будущее нет, но шума больше, чем в спреде статьи с фиксированной бетой. (строка 148) — исправление: при желании пересчитывай z_window спреды с текущей запаздывающей бетой, s_i = lx_i - beta_{t-1} * lu_i, сохраняя логарифмы цен в очереди; вычислительные затраты — O(z_window) на бар. - [предупреждение] Осиротевшие хеджирующие ноги USO закрываются только в should_enter (на следующем баре после того, как основная позиция стала нулевой). Если вход XLE отклонён после того, как position_size уже отправил ордер USO (например, из-за проверки базового шаблона), USO остаётся открытым без хеджа на одну сессию. На дневных барах это приемлемо, однако ордер на хедж отправляется до того, как подтверждено принятие основного ордера. (строка 168) — исправление: отправляй ордер на хеджирующую ногу после принятия основного ордера или сразу проверяй, что он принят.

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

До написания кода приведи заданное для оптимизации плечо в соответствие с гипотезой и декларацией площадки (пара лонг-шорт Reg-T 2x USEQ), поскольку несоответствие конфигурации, не исправленное в ходе итераций, завершает запуск до появления каких-либо результатов бэктеста.

После 3 итераций стратегию оставили в цикле проверки. Каждая попытка не прошла слой 1.5 (согласованность гипотезы и конфигурации, класс hypothesis_mismatch), поскольку optimization_plan фиксирует плечо на уровне 1.0. До бэктеста, проверки аналитиком или проверки рисков дело не дошло.

Ежедневная парная торговля USEQ с нейтральностью по долларовой стоимости на логарифмическом спреде log(XLE) - beta*log(USO), со скользящим коэффициентом хеджирования за 252 сессий, запаздывающим на один бар, и подгонкой AR(1)/OU с использованием данных на момент расчёта. Вход при экстремальном z спреда OU, выход у среднего (перевод работы Махаджана и др. 2019, arXiv:1907.08397).

Бэктест или оптимизация в конвейере не проводились. Единственные показатели взяты из предварительного исследования гипотезы: около 100-158 сделок, средняя сделка от +0.51% до +0.58%, доля прибыльных сделок около 0.6, коэффициент Шарпа около 0.30-0.33, положительный результат в 60-70% годах. В самой гипотезе отмечено, что XLE/USO оказалась лучшей среди 21 проверенных товарных пар ETF.

Анализ

Парная торговля со стохастическим спредом на индийском товарном рынке

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