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

Стратегии

US Сезонность конца месяца на рынке акций США — тайминг индекса в длинную и короткую позиции на QQQ: захват документированного скопления доходности в конце месяца (лонг), шорт в середине месяца после ToM ONLY при медвежьем режиме; алгоритмическая торговля по календарному сигналу, почти без подогнанных параметров (QQQ.USEQ, дневные бары, 2 параметра)

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

QqqTurnOfMonthSeasonalityLS

avg_trade_return_pct 0.203% выше порога издержек USEQ (дело не в комиссиях)

Гипотеза

LONG-SHORT SINGLE-INSTRUMENT календарная стратегия выбора момента для индекса на основе сезонности, QQQ.USEQ (Nasdaq-100 ETF), семейство стратегий, полностью отсутствующее в портфеле фабрики и структурно невосприимчивое к двум главным причинам провала в этой области: переоптимизации и экономике, не выдерживающей комиссий. Сигнал — это CALENDAR, а не подогнанный ценовой порог: эффект начала месяца (ToM) — непропорционально большая доля доходности фондовых индексов приходится на период от последнего торгового дня……Показать большеСвернуть

LONG-SHORT SINGLE-INSTRUMENT календарная стратегия выбора момента для индекса на основе сезонности, QQQ.USEQ (Nasdaq-100 ETF), семейство стратегий, полностью отсутствующее в портфеле фабрики и структурно невосприимчивое к двум главным причинам провала в этой области: переоптимизации и экономике, не выдерживающей комиссий. Сигнал — это CALENDAR, а не подогнанный ценовой порог: эффект начала месяца (ToM) — непропорционально большая доля доходности фондовых индексов приходится на период от последнего торгового дня месяца до первых примерно 3 торговых дней следующего — одна из наиболее устойчивых аномалий на фондовом рынке, сохраняющаяся вне выборки (Ariel 1987; McConnell & Xu 2008; подтверждена на данных за несколько десятилетий и по десяткам рынков). Поскольку даты входа и выхода DETERMINED BY THE CALENDAR, а не оптимизируются по цене, риск переоптимизации, погубившей 338 предыдущих гипотез, почти отсутствует: действительно свободных параметров всего 2 — длина SMA трендового режима и флаг включения коротких позиций. Границы окна ToM взяты из опубликованных исследований, а не из перебора параметров. Стратегия работает на дневных барах QQQ с историей более 25 лет (QQQ с 1999), что позволяет провести надёжный walk-forward-анализ на нескольких окнах и проверку на отложенной выборке. Направление LONG-SHORT (пополняет недостаточно представленную категорию long_short); стратегия не является NOT рыночно-нейтральной стратегией (0.7%), ротацией между активами (0/125, L68) или следованием за импульсом тренда — это направленный календарный тайминг одного ликвидного ETF. Почему USEQ, а не криптовалюты: скромная доходность от эффекта ToM составляет около 0.3-0.6% за окно; исполнение USEQ без комиссий (около 0.02-0.05% за сделку туда и обратно, только спред и влияние на цену) сохраняет почти всю эту доходность, тогда как комиссии крипторынка 0.10-0.20% и динамика цен 24/7 (без потоков, связанных с ежемесячными расчётами и ребалансировкой, которые обусловливают эффект ToM) свели бы её на нет. FEE ARITHMETIC: историческая средняя доходность длинного окна ToM — около 0.3-0.6% по QQQ примерно за 4 торговых дней; после вычета около 0.04% на сделку туда и обратно остаётся примерно 0.3-0.55%, что примерно в 8-14x раз выше минимальных эффективных издержек и превышает порог жизнеспособности 0.15%. Около 12 длинных сделок в год (по одной в месяц) плюс условная короткая позиция дают достаточную выборку для оценки статистической значимости за 25 лет без издержек высокочастотной торговли.

Итерация 2 — одно целевое исправление сбоя Layer-2, без других изменений. Сбой: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2: прокси Layer-2 копирует все вызываемые объекты в обычную оболочку через types.MethodType, из-за чего @staticmethod становится методом BOUND и экземпляр передаётся первым позиционным аргументом. Исправление: (1) стратегия больше не вызывает базовый статический метод self._bar_ts(bar), а получает метку времени через собственный метод экземпляра……Показать большеСвернуть

Итерация 2 — одно целевое исправление сбоя Layer-2, без других изменений. Сбой: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2: прокси Layer-2 копирует все вызываемые объекты в обычную оболочку через types.MethodType, из-за чего @staticmethod становится методом BOUND и экземпляр передаётся первым позиционным аргументом. Исправление: (1) стратегия больше не вызывает базовый статический метод self._bar_ts(bar), а получает метку времени через собственный метод экземпляра _ts_of(bar) (ts_event с запасным вариантом ts_init, семантика та же); (2) три календарные функции (_days_from_ns, _civil_from_days, _days_in_month) преобразованы из @staticmethod в обычные методы экземпляра по той же причине: при следующем вызове их ошибочно привязало бы аналогичным образом. Больше ничего не меняли: импорты прежние (только math, collections, decimal, nautilus_trader, src — запрещённых модулей нет, поэтому проверка Layer 1 проходит), а логика сигнала, календарные окна, правила входа и выхода, размер позиции и конфигурация побайтно совпадают с предыдущей итерацией. Базовый замысел тот же, что в итерации 1: сигнал задаёт календарь, а не подогнанный уровень цены (2 свободных параметра, regime_sma_len объявлен в _param_bounds, потому что код ограничивает его, плюс флаг short_enabled); дата сессии вычисляется по метке времени бара с помощью целочисленной арифметики календарной даты со сдвигом на 5 ч, чтобы получить календарный день Нью-Йорка при обоих вариантах EST и EDT; торговый день месяца определяется по наблюдаемым барам, поэтому для праздников и сокращённых сессий не нужна календарная таблица; расписание не привязано к счётчику баров относительно процесса и остаётся одинаковым при перезапусках, повторных проигрываниях и бэктестах.

Структурно низкий коэффициент Шарпа у календарной аномалии USEQ; устойчивого преимущества для оптимизации нет. Базовый коэффициент Шарпа — 0.237, а бутстрэп-интервал CI [-0.11, 0.60] пересекает ноль: статистически его нельзя отличить от отсутствия навыка ещё до смещения отбора при оптимизации; поправка на завышение результатов и проверка на отложенных данных лишь снижают оценку. profit_factor 1.195 ниже порога значимого преимущества 1.2; на почти не имеющем трения USEQ это означает, что эффект рубежа месяца едва……Показать большеСвернуть

Структурно низкий коэффициент Шарпа у календарной аномалии USEQ; устойчивого преимущества для оптимизации нет. Базовый коэффициент Шарпа — 0.237, а бутстрэп-интервал CI [-0.11, 0.60] пересекает ноль: статистически его нельзя отличить от отсутствия навыка ещё до смещения отбора при оптимизации; поправка на завышение результатов и проверка на отложенных данных лишь снижают оценку. profit_factor 1.195 ниже порога значимого преимущества 1.2; на почти не имеющем трения USEQ это означает, что эффект рубежа месяца едва заметен после спреда, а не подавлен комиссиями (L75). За 27 лет доходность составляет лишь около 116% (около 2.9% в год) при информационном коэффициенте NEGATIVE (-0.296), поэтому стратегия уступает «купи и держи». Условная короткая позиция снижает результат (short_win_rate 0.457) и всё же несёт крупные направленные убытки (2002 -33.5%, 2001 -14.5%) — предположение о защите от просадки не подтверждается (максимум DD 43.7%, от CI до 87.8%). При всего 2 свободных параметрах нет способа поднять коэффициент Шарпа 0.24 до устойчивого уровня, пригодного для продвижения. Это L75 USEQ — типичный пример отсутствия устойчивых стратегий после проверки эффекта рубежа месяца; остановить на этапе BACKTEST_REVIEW, а не продолжать итерации.

Реализация

Календарный тайминг индекса по сезонности на дневных барах QQQ.USEQ, длинные и короткие позиции. Длинная позиция LONG: покупка на закрытии последней торговой сессии месяца (или первых двух сессий нового месяца, если закрытие пропущено) и выход на закрытии торгового дня 3 нового месяца — захват документированного скопления доходности в конце месяца. Короткая позиция SHORT (необязательная, зависит от режима): шорт в затишье середины месяца после ToM, в торговые дни месяца 7-15, только пока QQQ заметно ниже режима 200-сессий SMA; шорт закрывается в конце окна или при исчезновении медвежьего режима. calculate_signal на каждом баре выдаёт непрерывную оценку близости к календарной дате: экспоненциальный пик внутри окна ToM минус пик середины месяца, масштабированный медвежьим режимом; should_enter применяет пороги к этой оценке. Размер позиции рассчитывается от капитала, целыми акциями (95% капитала в длинной позиции, 50% в короткой, плечо 1.0); единственное правило по цене — катастрофический стоп 5%. Около 12 длинных сделок в год плюс условные шорты.

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

CLEAN RESTART 2026-09-04 — историю вердиктов и записи об обучении этого запуска удалили, его перезапустили с этапа проверки. Ранее конвейер остановил его не из-за рынка: тестовая среда Layer-2 неверно связывала вспомогательные методы @staticmethod (исправлено), QA выносил окончательные вердикты о результативности по неоптимизированному тесту (убрано — теперь QA оценивает только корректность), а тайм-ауты песочницы возникали из-за нехватки слотов для бэктеста (исправлено). Гипотеза и код стратегии не изменились. Оцени код по существу; результативность позже определят полный бэктест и оптимизатор.

Оптимизировать True и False для short_enabled как отдельные варианты; использовать только длинную ToM-стратегию, если шорт не улучшает коэффициент Шарпа OOS с учётом хвостового риска.

Условная короткая позиция по режиму (19 сделок в песочнице) — главный источник хвостового риска и наименее подтверждённая опубликованной аномалией часть стратегии (эффект ToM относится к длинным позициям; медвежий шорт в середине месяца — надстройка разработчика). Это не дефект, но он увеличивает диапазон просадки CI (max_dd_ci_high 47%), а преимущество не доказано на этой выборке. Не препятствует продолжению.

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

Шарп
0,24
Общая доходность
116,03%
Максимальная просадка
43,70%
Всего сделок
460
Доля прибыльных
55,7%
Профит-фактор
1,20

avg_trade_return_pct 0.203% выше порога издержек USEQ (дело не в комиссиях)

460 сделок за 27 лет — достаточная выборка; календарный сигнал снижает риск переобучения

низкая бета рынка (0.087) — доходность не объясняется одной лишь экспозицией к индексу

Коэффициент Шарпа 0.237 с бутстрэп-интервалом CI [-0.11, 0.60] пересекает ноль — до любой оптимизации устойчивого статистически значимого преимущества нет

profit_factor 1.195 ниже порога значимого преимущества 1.2 (L75: почти безфрикционная торговля USEQ + PF<1.2 означает, что аномалия отсутствует, а не подавлена комиссиями)

information_ratio -0.296: уступает стратегии «купи и держи» с поправкой на риск при активной торговле; total_return всего около 116% за 27 лет (примерно 2.9% в год)

условная короткая позиция снижает результат (short_win_rate 0.457), а стратегия всё равно несёт крупные направленные убытки (2002 -33.5%, 2001 -14.5%), что противоречит заявлению о невосприимчивости к просадке

max_drawdown 43.7% (CI до 87.8%) при доходности ниже -3%/год

соответствует сценарию L75 USEQ — полному провалу стратегий на эффекте конца месяца

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

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованные параметры: ['decay', 'bear_ref', 'tom_days', 'short_end', 'long_thresh', 'short_start', 'warmup_bars', 'min_notional', 'short_thresh', '_param_bounds', 'long_exposure', 'short_enabled', 'stop_loss_pct', 'regime_sma_len', 'short_exposure'] Проверьте, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2 (метка времени бара:……Показать большеСвернуть

Проверка не пройдена (Layer 2 — синтетические сценарии): Использованные параметры: ['decay', 'bear_ref', 'tom_days', 'short_end', 'long_thresh', 'short_start', 'warmup_bars', 'min_notional', 'short_thresh', '_param_bounds', 'long_exposure', 'short_enabled', 'stop_loss_pct', 'regime_sma_len', 'short_exposure'] Проверьте, что __init__ задаёт все атрибуты из self.parameters.get(). - steady_uptrend: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2 (метка времени бара: 1735691340000) - steady_downtrend: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2 (метка времени бара: 1735691340000) - flat_ranging: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2 (метка времени бара: 1735691340000) - volatility_spike: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2 (метка времени бара: 1735691340000) - zero_volume: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2 (метка времени бара: 1735691340000) - price_gap: TypeError: FactoryStrategy._bar_ts() принимает 1 позиционных аргумента, но передано 2 (метка времени бара: 1735691340000)

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