Стратегии
Ротация лидирующего сектора среди четырёх
Итог: Отменено
FourSectorLeadershipRotation
Сводка по итогам
FourSectorLeadershipRotation тестировала ротацию только в длинных позициях в конце месяца: она выбирала один из четырёх секторных ETF (XLK, XLF, XLE, XLU) с наибольшей положительной доходностью за 252 сессий. За 3 итераций стратегия так и не прошла проверку: дымовой тест в изолированной среде Layer 3 снова и снова превышал лимит в 300 с на окне примерно в 20,000 баров. Работу прекратили по причине 'verification_loop: sandbox_timeout'. Бэктест, оптимизация и анализ аналитика не запускались, поэтому идея моментума секторов только в длинных позициях остаётся непроверенной.
Гипотеза
Адаптировать метод Sector Momentum от QuantConnect к XLK, XLF, XLE и XLU на дневных барах USEQ. На закрытии последней сессии месяца ранжировать активы по доходности цены за предыдущие 252 сессий и держать только лидера, если его доходность положительна. Предыдущие тесты с длинными и короткими позициями в секторах показали слабое преимущество, главным образом из-за короткой позиции; этот вариант только с длинными позициями пока не тестировался.
В источнике задано правило ранжирования и ротации торгуемых активов. Удержание одного из четырёх секторов проверяет тезис о лидерстве только в длинных позициях и требует меньше усилий для реализации, чем предыдущая попытка с 11 секторами, завершившаяся по тайм-ауту без измеренного результата. Измеренные варианты с длинными и короткими позициями показали слабое или отрицательное математическое ожидание, поэтому в этом предложении короткая позиция исключена. Сходство с предыдущими исследованиями секторов обосновывает средний приоритет.
verification_loop: sandbox_timeout: проверка не пройдена (Layer 3 — бэктест в изолированной среде): дымовой тест превысил лимит времени выполнения 300 с на окне примерно в 20000 баров (2400 дней по XLK.USEQ-1-DAY-LAST-EXTERNAL). Почти всегда это означает, что работа на каждом баре растёт вместе с историей — например, повторное сканирование полного ряда funding/дополнительных данных или пересоздание списка с вызовом min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Заранее вычислите отсортированные массивы временных меток ONCE в __init__ и используйте bisect либо кэшируйте поиск по временной метке, чтобы затраты на бар составляли O(log n), а не O(n).
Реализация
Ежемесячная ротация только в длинных позициях между XLK/XLF/XLE/XLU на дневных барах USEQ. На закрытии последней сессии месяца ранжировать доходность за предыдущие 252 сессий и держать только лидера (capital_fraction 0.5 капитала, целое число акций), если его доходность > 0%; иначе оставаться вне рынка. Стоп по цене закрытия 10% для удерживаемого сектора блокирует повторный вход до конца следующего месяца.
Итерация 3 исправляет только проверку конфигурации Layer-1.5. Теперь каждое фиксированное значение из плана оптимизации объявлено в параметрах с точным типом: плечо 1.0, ребалансировка 'ежемесячно', hold_top_n 1, stop_loss_pct 10.0, capital_fraction 0.5, lookback_sessions 252, leader_min_return_pct 0.0. План добавлен как _optimization_plan, а размер позиции рассчитывается с учётом параметра плеча. Логика сигнала и ротации не изменилась. Ограничение: при примерно одной ребалансировке в месяц и лидере, который часто остаётся прежним, число сделок, вероятно, не достигнет заранее зарегистрированного минимума в 80 сделок.
Результаты верификации
sandbox_timeout: проверка не пройдена (Layer 3 — бэктест в изолированной среде): дымовой тест превысил лимит времени выполнения 300 с на окне примерно в 20000 баров (2400 дней по XLK.USEQ-1-DAY-LAST-EXTERNAL). Почти всегда это означает, что работа на каждом баре растёт вместе с историей — например, повторное сканирование полного ряда funding/дополнительных данных или пересоздание списка с вызовом min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Заранее вычислите отсортированные массивы временных меток ONCE в __init__ и используйте bisect либо кэшируйте поиск по временной метке, чтобы затраты на бар составляли O(log n), а не O(n).
История итераций
Проверка не пройдена (Layer 1.5 — согласованность гипотезы и конфигурации) [class=hypothesis_mismatch]: - optimization_plan фиксирует плечо на уровне 1.0
Сводка по итогам
Работа на каждом баре в calculate_signal() должна быть быстрой: около O(1) или O(log n) на бар. Здесь она включала сканирование буферов четырёх инструментов, сортировку рейтинга, поиск позиций и проверку календаря конца месяца на каждом баре. Выполняйте логику конца месяца только один раз в месяц, а остальное вычисляйте заранее или кэшируйте — так дымовой тест в изолированной среде завершится до оценки логики стратегии.
Работу прекратили в цикле проверки после 3 итераций. Бэктест в изолированной среде Layer 3 превысил лимит времени выполнения 300 с на окне примерно в 20,000 баров (2,400 дней по XLK.USEQ-1-DAY-LAST-EXTERNAL), поэтому проверка бэктеста, оптимизация, анализ аналитика и проверка рисков не запускались.
Вариант метода Sector Momentum от QuantConnect только с длинными позициями: на закрытии последней сессии месяца ранжировать XLK, XLF, XLE и XLU по доходности цены за предыдущие 252 сессий на дневных барах USEQ и держать только лидера, если его доходность положительна. Предыдущие тесты с длинными и короткими позициями в секторах показали слабое преимущество, главным образом из-за короткой позиции.
Данных о результатах нет. Стратегия не создала отчёт о бэктесте, поэтому нет сведений о доходности, коэффициенте Шарпа или числе сделок.
Анализ
Моментум секторов
Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.