Моментум между секторами US Sector-ETF, долларово-нейтральный лонг-шорт с защитным фильтром абсолютного моментума (USEQ, дневные бары, ранжирование 6-1, ежемесячная ребалансировка, лонг верхние -3 / шорт нижние -3 из SPDR секторов, параметров: 2)
Итог: Отменено
UsSectorEtfCrossSectionalMomentumDollarNeutralLS
Сводка по итогам
Разброс моментума между всего девятью секторными ETF слишком узок для преимущества; на площадке без издержек PF≈1.03 означает отсутствие аномалии, а не её уязвимость к комиссиям.
ITERATION 2 — сообщённая ошибка была sandbox_timeout (слой 3), поэтому слои 1, 1.5 и 2 уже прошли проверку, а код сигнала и структуры сохранён побайтно, за исключением размера набора инструментов и документации. До изменений я профилировал точный запуск в песочнице (та же конфигурация, то же окно 2400 дней XLK.USEQ-1-DAY, py-spy на работающем процессе): тайм-аут вызван работой NOT на каждом баре в этой стратегии. calculate_signal выполняет O(legs) операций с деком фиксированного размера, не хранит растущий список……Показать большеСвернуть
ITERATION 2 — сообщённая ошибка была sandbox_timeout (слой 3), поэтому слои 1, 1.5 и 2 уже прошли проверку, а код сигнала и структуры сохранён побайтно, за исключением размера набора инструментов и документации. До изменений я профилировал точный запуск в песочнице (та же конфигурация, то же окно 2400 дней XLK.USEQ-1-DAY, py-spy на работающем процессе): тайм-аут вызван работой NOT на каждом баре в этой стратегии. calculate_signal выполняет O(legs) операций с деком фиксированного размера, не хранит растущий список и не сканирует историю повторно — все сэмплы стека пришлись на обход каталогов в fsspec, а не на код стратегии. Затраты времени связаны с обнаружением файлов каталога: NautilusTrader's ParquetDataCatalog выполняет `glob(data/bar/**/*.parquet)` ONCE PER BAR TYPE (полный обход примерно 102,000 каталогов баров), а также один проход `instruments()` по деревьям crypto_option/binary_option — всё это до поступления первого бара в движок. Поэтому двенадцать типов баров потребовали двенадцать таких обходов. (Это подтверждает, что затраты относятся к общей инфраструктуре, а не к этому механизму: на этом хосте та же sandbox_timeout сейчас с такой же скоростью затрагивает стратегии с одним инструментом и без дополнительных legs.) Единственный рычаг стратегии, влияющий на эти затраты, — NUMBER типов баров, поэтому я сократил набор с одиннадцати отраслевых ETF до девяти исходных Select Sector SPDR от 1998, исключив XLRE (2015) и XLC (2018); фиксированные затраты до запуска снизились на 25%. Это также правильное исследовательское решение само по себе: дата начала XLC (2018-06) была ограничивающим фактором для барьера синхронизации нескольких инструментов, поэтому исключение этого ETF увеличивает доступную историю примерно с 2018 до 1998 и даёт окнам walk-forward-анализа и вневыборочной проверки гораздо больше независимых месяцев. Гипотеза сохранена без изменений: по-прежнему кросс-секционный импульс 6-1, ребалансировка по-прежнему ежемесячная, по-прежнему равные долларовые позиции лонг в верхних -3 / шорт в нижних -3 (при девяти инструментах три средних сектора остаются без позиции), по-прежнему действует защитный переход в кэш при отсутствии абсолютного импульса, по-прежнему используются два граничных параметра (formation_days, skip_days), а все ограничения объявлены в _param_bounds. Плечо 2.0 действительно используется: валовая позиция = капитал x gross_exposure x self.config.leverage в _rebalance. Ничего из уже прошедшего предыдущие уровни не менялось: те же импорты, тот же класс, то же ежемесячное расписание, привязанное к календарю (а не к счётчику баров), тот же синхронизированный буфер цен с одной строкой и тот же непрерывный z-score сигнала на каждую сессию.
Пограничное/безубыточное математическое ожидание на убедительной выборке из 517 сделок за 28 лет: profit_factor 1.0296 (в диапазоне издержек [0.85,1.10], тянущих результат вниз), avg_trade_return_pct 0.0844% (едва выше нижнего предела 0.05% USEQ), коэффициент Шарпа 0.0736, а CI [-0.2866, 0.4494] включает ноль. Комиссии USEQ составляют $0, а рыночное влияние — всего 34.7% от валового результата, поэтому сигнал лишь GROSS-маргинальный, а не хрупкий из-за комиссий: спред поперечного среза импульса всего по 9……Показать большеСвернуть
Пограничное/безубыточное математическое ожидание на убедительной выборке из 517 сделок за 28 лет: profit_factor 1.0296 (в диапазоне издержек [0.85,1.10], тянущих результат вниз), avg_trade_return_pct 0.0844% (едва выше нижнего предела 0.05% USEQ), коэффициент Шарпа 0.0736, а CI [-0.2866, 0.4494] включает ноль. Комиссии USEQ составляют $0, а рыночное влияние — всего 34.7% от валового результата, поэтому сигнал лишь GROSS-маргинальный, а не хрупкий из-за комиссий: спред поперечного среза импульса всего по 9 секторным ETF (верхние -3/нижние -3) слишком узок, чтобы дать преимущество; это именно то, чего опасался QA, и полная история это подтверждает. Короткая позиция тянет результат вниз (доля прибыльных сделок 0.345 против 0.60 в длинной), несёт убытки в стрессовом режиме (-12.3%) и резко проседает в 2026 (-19.5%). Это семейство долларово-нейтральных длинно-коротких корзин (L45, 0/N) с характерным признаком L75 USEQ (PF<1.2 на площадке с почти нулевыми издержками — аномалия отсутствует). Сигнал PF-1.03 невозможно вывести выше безубыточности настройкой параметров формирования/пропуска 2 — не стоит тратить 2 часов на оптимизацию. abandon_class=negative_expectancy.
Реализация
Ежемесячный кросс-секционный моментум 6-1 среди девяти исходных ETF Select Sector SPDR (XLK, XLB, XLE, XLF, XLI, XLP, XLU, XLV, XLY) на дневных сессионных барах USEQ. Каждый месяц сектора ранжируются по совокупной доходности за последние `formation_days` сессий, завершившихся `skip_days` сессий назад; портфель открывает равную по долларовой сумме длинную позицию в верхних 3 и короткую в нижних 3, поэтому номинал обеих сторон одинаков, а портфель нейтрален к доллару по построению. Защитный фильтр абсолютного моментума полностью закрывает позиции в месяцы, когда кросс-секционный моментум MEAN 6-1 <= 0 (переход двойного моментума в наличные); это ограничивает просадку. Ребалансировка исполняется как нетто-заявки на изменение количества целых акций с минимумом $500, поэтому активы, остающиеся в той же группе, не переторговываются. Валовой номинал = капитал x gross_exposure x плечо (0.50 x 2.0 = 1.0x капитала, то есть 0.5x лонг + 0.5x шорт) при заявленной марже Reg-T 2x.
Результаты верификации
Изменения не нужны: внутренний фильтр буфера правильно обеспечивает разогрев. Оставлено для справки.
min_bars_required() переопределяет метод базового фреймворка и возвращает 30 вместо полного периода формирования и пропуска. Это намеренно (реальный разогрев происходит в собственном буфере выровненных строк стратегии, который заполняется только после первого вызова calculate_signal) и задокументировано, но переопределение обходит базовый фильтр разогрева. Подтверждено, что это безопасно: _momentum() возвращает None, пока _rows не достигнет _need_rows (148), поэтому сигналы и сделки не возникают до полного заполнения буфера.
Приемлемо как исследовательское решение и решение по результатам тестирования стратегии; при оценке ширины спреда аналитику следует учитывать поперечный срез из 9 отдельных бумаг.
Вселенная сокращена с 11 SPDR секторов, подразумеваемых гипотезой, до 9 исходных ETF Select Sector SPDR 1998 (XLRE/XLC исключён). Это сохраняет суть гипотезы (моментум между SPDR секторами: лонг верхние -3, шорт нижние -3, 3 активов без позиции) и заметно удлиняет доступную историю до 1998, но немного сужает кросс-секцию, уменьшая разницу между крайними децилями, на которой основано преимущество.
Результат проверки в песочнице однозначно отрицательный (total_return -18.6%, profit_factor 0.75, коэффициент Шарпа -0.41, avg_trade_return_pct -0.90%, доля прибыльных сделок в короткой позиции 25% против 62% в длинной). У USEQ почти нет издержек (комиссии 0, влияние на цену всего $560), поэтому просадка вызвана GROSS, а не комиссиями: разница в долях прибыльных сделок указывает на то, что короткая позиция (проигравшие активы) тянет результат вниз; это согласуется с обвалами импульсных стратегий и шорт-сквизами……Показать большеСвернуть
Результат проверки в песочнице однозначно отрицательный (total_return -18.6%, profit_factor 0.75, коэффициент Шарпа -0.41, avg_trade_return_pct -0.90%, доля прибыльных сделок в короткой позиции 25% против 62% в длинной). У USEQ почти нет издержек (комиссии 0, влияние на цену всего $560), поэтому просадка вызвана GROSS, а не комиссиями: разница в долях прибыльных сделок указывает на то, что короткая позиция (проигравшие активы) тянет результат вниз; это согласуется с обвалами импульсных стратегий и шорт-сквизами среди отстающих секторов. В недавнем списке неудач — 0/N нейтральных к бете и доллару длинно-коротких корзин (UseqResidualMomentumLargeCap заброшена, долларово-нейтральная SolEth заброшена; L45). Стратегия точно и корректно реализована, поэтому заслуживает полного исторического прогона и оптимизатора; аналитику следует проверить, достаточно ли широк спред поперечного среза всего из 9 секторных ETF (верхние -3/нижние -3, 3 без позиции), чтобы сохранить результат вне выборки, и несёт ли убытки короткая позиция. Полная история начиная с 1998 охватывает около 28 лет ежемесячной ребалансировки, чего достаточно для измеримого результата.
Обзор бэктеста
Шарп
0,07
Общая доходность
12,20%
Максимальная просадка
25,57%
Всего сделок
517
Доля прибыльных
46,8%
Профит-фактор
1,03
Точная и корректная долларово-нейтральная реализация с полноценной выборкой: 28 лет и 517 сделок (metrics_reliable: да)
Фильтр абсолютного моментума ограничивает просадку до умеренных 25.6% в портфеле лонг-шорт с плечом
profit_factor 1.0296 попадает в диапазон издержек на комиссии и влияние на цену [0.85,1.10]; при почти беззатратном USEQ (комиссии $0, влияние на цену 34.7% от валового объёма) сигнал валовой доходности MARGINAL / около безубыточности, дело не в издержках — разброс между всего 9 секторными ETF (лонг верхние -3 / шорт нижние -3, 3 без позиции) слишком узок, чтобы создать преимущество
avg_trade_return_pct 0.0844% едва превышает порог 0.05% USEQ и значительно не дотягивает до желательного уровня 0.10%
Коэффициент Шарпа 0.0736, интервал CI [-0.2866, 0.4494] пересекает ноль; коэффициент Сортино 0.080; recovery_factor 0.38 — преимущества с учётом риска нет
Убытки несёт короткая сторона (доля прибыльных сделок в шорт 0.345 против 0.60 в лонг) — опасения QA насчёт обвалов моментума и коротких сжатий подтвердились на полной истории; убыток в стрессовом режиме (-12.3%), обвал в 2026 (-19.5%)
Соответствует L45 (долларово- и бета-нейтральные лонг-шорт корзины 0/N) и L75 (USEQ PF<1.2 означает отсутствие самой аномалии); аналогичные стратегии того же дня UseqResidualMomentumLargeCap и SolEth dollar-neutral обе заброшены
История итераций
sandbox_timeout: проверка не пройдена (уровень 3 — бэктест в песочнице): пробный тест превысил лимит времени 300 с на окне около 20000 баров (2400 дней из XLK.USEQ-1-DAY-LAST-EXTERNAL). Обычно это означает, что объём работы на каждом баре растёт вместе с историей — например, повторное сканирование всего ряда финансирования/дополнительных данных или создание списка и вызов min()/sorted() внутри calculate_signal()/on_bar() на каждом баре. Предварительно вычисли отсортированные массивы временных меток ONCE в __init__ и используй bisect либо кэшируй результаты поиска по временной метке, чтобы стоимость обработки одного бара была O(log n), а не O(n).
Сводка по итогам
Аналитик вынес вердикт «отказаться» на этапе проверки бэктеста до оптимизации: сигнал безубыточности на PF-1.03 на рынке USEQ без издержек не удалось улучшить подбором 2 параметров; до оптимизации и следующих этапов дело не дошло.
Долларово-нейтральный лонг-шорт портфель из девяти исходных ETF Select Sector SPDR: каждый месяц сектора ранжируются по кросс-секционному моментуму 6-1, открываются лонг в верхних 3 и шорт в нижних 3; фильтр абсолютного моментума закрывает позиции, когда весь секторный комплекс не растёт.
Бэктест за 28 лет и 517 сделок: общая доходность 12.203 (CAGR 0.357), но коэффициент Шарпа всего 0.0736 (CI пересекает ноль), PF 1.0296, avg_trade_return_pct 0.0844%, максимальная просадка 25.57%; убытки несла короткая сторона (доля прибыльных сделок 0.345 против 0.60 у длинной).
Stratmill — это инструмент для исследований и бумажной торговли, а не финансовая консультация или брокер. Результаты бэктестов и бумажной торговли являются гипотетическими. Торговля сопряжена с риском убытков.