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

Стратегии

Сезонная лонг-надстройка на стыке месяцев для SPY + QQQ (USEQ, дневные бары, только лонг, держать каждый ETF только в окно конца месяца [-1,+3] при тренде выше 200-дневного, иначе в казначейских векселях, без комиссии, 3 параметр)

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

TurnOfMonthSeasonalOverlaySpyQqqUseq

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

Эта стратегия точно воспроизвела хорошо документированную календарную аномалию: удерживала SPY и QQQ только на стыке месяцев и только выше их долгосрочного тренда. Её бэктест выглядел достаточно чисто на данных за 33 лет (PF 1.43, доля прибыльных сделок 60%, доходность на сделку выше порога комиссий USEQ), чтобы аналитик одобрил оптимизацию. На этапе оптимизации стратегия провалилась: коэффициент Шарпа внутри выборки 0.87 упал до 0.019 вне выборки, PBO достиг 0.77, а дефлированный коэффициент Шарпа 0.020 показал, что результат статистически неотличим от шума в 225 испытаниях. Одновременно провалены три безусловные жёсткие проверки, поэтому аналитик отказался от стратегии после одной итерации. Она пополнила устойчивое семейство отвергнутых вариантов со входом на стыке месяцев, подтвердив, что эффект слишком слаб для обобщения в надстройку для торговли на реальном счёте.

Гипотеза

Гипотеза реализована точно: SPY.USEQ + QQQ.USEQ на дневных барах USEQ; владение только в окне конца месяца [-1,+3] и только пока каждый ETF выше собственного тренда за 200 дней; в остальное время позиция закрыта (денежные средства/казначейские векселя). Ровно три свободных параметра (trend_sma_days, entry_days_before_end, exit_trading_day) плюс структурный лимит номинала. Окно привязано к CALENDAR TIME, полученному из bar.ts_event (арифметика календарных дат + подсчёт уже наблюдавшихся сессий текущего……Показать большеСвернуть

Гипотеза реализована точно: SPY.USEQ + QQQ.USEQ на дневных барах USEQ; владение только в окне конца месяца [-1,+3] и только пока каждый ETF выше собственного тренда за 200 дней; в остальное время позиция закрыта (денежные средства/казначейские векселя). Ровно три свободных параметра (trend_sma_days, entry_days_before_end, exit_trading_day) плюс структурный лимит номинала. Окно привязано к CALENDAR TIME, полученному из bar.ts_event (арифметика календарных дат + подсчёт уже наблюдавшихся сессий текущего календарного месяца), а не к счётчику баров, поэтому расписание одинаково после перезапусков, при бэктестинге и воспроизведении бумажной торговли; вход отправляется за одну сессию до открытия окна, поскольку рыночный ордер на закрытии бара исполняется на открытии следующей сессии, так что фактический период владения длится от открытия дня -1 до открытия дня +4. Согласно гипотезе торговая площадка — USEQ (акции, без комиссий); портфель только лонговый, без заёмных средств, поэтому плечо остаётся 1.0, а в расчёте размера позиции нет множителя плеча. Для истории тренда используются 200 сессий (min_bars_required=202, в пределах буфера в 500 баров); условие входа — одно сезонное, а не редкое сочетание условий, поэтому оно срабатывает около 12 раз в год на каждую часть портфеля — примерно 68 окон / 130+ сделок туда-обратно в пределах окна песочницы примерно в 2400 дней. Ожидаемые движения индекса за окно (~0.3-0.5%) с запасом покрывают издержки спреда и влияния на цену USEQ (~0.02-0.05% за сделку туда-обратно). Отмечена и реализована одна оговорка: рыночные праздники US в песочнице не моделируются (календарь биржи нельзя импортировать), поэтому единственный сценарий сбоя — День памяти, приходящийся на последний будний день месяца; это сдвигает соответствующий вход на одну сессию несколько раз за десятилетие.

Переобучение без преимущества вне выборки: коэффициент Шарпа OOS в walk-forward-анализе 0.019 (< порога валидности 0.5) против IS 0.87, OOS 0.235/-0.017/-0.162 по окнам, PBO 0.77 (> 0.5), провал теста дефлированного коэффициента Шарпа: DSR=0.020, ожидаемый максимум=0.47 за 225 испытаний (43 эффективных) — выбранный коэффициент Шарпа неотличим от шума лучшего из N вариантов, не проходит программную проверку FDR (4 из 272), is_significant=false. Три проверки HARD провалены (OOS<0.5, is_overfitted, PBO>0.5), поэтому повышение статуса невозможно. Доходность на сделку превышает порог комиссий USEQ, а коэффициент Шарпа на отложенной выборке номинально положительный (0.36), однако эффект стыка месяцев слишком слаб, чтобы обобщить его до торгуемой надстройки: стратегия подогналась под шум внутри выборки. Это соответствует устойчивому провалу семейства стратегий (сезонность стыка месяцев отвергнута на QQQ, BTC, BNB и смежных трендовых вариантах USEQ); перенос того же механизма на очередной актив снова приводил к переобучению, поэтому подходящего переформулирования нет.

Реализация

Сезонная лонг-надстройка на стыке месяцев для SPY + QQQ (USEQ, бары сессий 1-DAY, только лонг, без плеча, без комиссий). На закрытии каждой сессии стратегия вычисляет календарную дату бара по его собственной временной метке (целоарифметический расчёт календарной даты, без счётчиков, зависящих от процесса) и определяет (а) сколько будних дней до конца месяца после сегодняшнего дня и (б) номер сегодняшней сессии текущего месяца. Риск принимается на закрытии сессии за `entry_days_before_end` (по умолчанию 1) будних……Показать большеСвернуть

Сезонная лонг-надстройка на стыке месяцев для SPY + QQQ (USEQ, бары сессий 1-DAY, только лонг, без плеча, без комиссий). На закрытии каждой сессии стратегия вычисляет календарную дату бара по его собственной временной метке (целоарифметический расчёт календарной даты, без счётчиков, зависящих от процесса) и определяет (а) сколько будних дней до конца месяца после сегодняшнего дня и (б) номер сегодняшней сессии текущего месяца. Риск принимается на закрытии сессии за `entry_days_before_end` (по умолчанию 1) будних дней до последнего буднего дня месяца — поэтому исполнение на следующем открытии даёт владение с торгового дня -1; позиция удерживается через границу месяца и закрывается на закрытии `exit_trading_day`-й (по умолчанию 3) сессии нового месяца, захватывая интервал открытие—открытие [-1,+3]. Примерно 80% календарного времени позиция закрыта, средства остаются в денежных средствах (часть «казначейских векселей» не торгуется). Каждый ETF — независимая равновзвешенная половина портфеля, условия входа в которую задаёт её долгосрочный тренд OWN: актив покупается, только когда цена закрытия выше собственного `trend_sma_days` (по умолчанию 200) SMA; иначе эта половина остаётся в денежных средствах, поэтому активы на медвежьих стыках месяцев (2008, 2022) просто не покупаются. Размер позиции задаётся целыми акциями (USEQ, точность размера 0) с выделением 95%/2 капитала счёта на каждую часть, рассчитанным из get_account_equity() при каждом входе. Обе части управляются вручную через _submit_entry_instrument/_submit_exit_position с проверкой «нигде нет ожидающих заявок»; базовые хуки (should_enter/should_exit) остаются неактивными, поэтому базовый класс не отправляет конкурирующий ордер SPY.

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

При желании можно вычислять опорный последний будний день по наблюдаемым барам сессий (как уже делает _session_index), а не простым подсчётом будних дней, чтобы время входа учитывало праздники, как и выход. Не обязательно.

Время входа определяется календарной арифметикой будних дней (_weekdays_left), которая NOT моделирует US рыночные праздники, тогда как выход привязан к фактическому числу сессионных баров (_session_index) и потому устойчив к праздникам. Если праздник в конце месяца приходится на один из последних двух будних дней (например, Memorial Day), этот единственный вход сдвигается на одну сессию. Разработчик явно документирует это, и это никогда не меняет знак сделки; src/data/market_calendar.py (XNYS) существует и мог бы точнее определять вход, но текущее приближение приемлемо и не влияет на измеримость.

Изменения не нужны, если базовый шаблон вызывает переопределение подкласса для проверки прогрева (вызывает). Оставлено для сведения.

min_bars_required(self) переопределяет метод фреймворка (предупреждение статического анализа base_shadow). Здесь это сделано намеренно — метод возвращает trend_sma_days + 2 для проверки прогрева — и работает корректно, но убедись, что базовый класс учитывает переопределение, а не использует собственную реализацию.

Первичная проверка в песочнице дала пограничный результат: коэффициент Шарпа 0.107 (CI [-0.68, 0.94] пересекает ноль), avg_trade_return_pct 0.1535% (едва выше порога спреда и влияния на цену ~0.02-0.05% USEQ), PF 1.15, win_rate 0.60. Разделение по режимам неблагоприятно: прибыль сосредоточена в терциле обычной волатильности (+10.44%), тогда как в спокойном (-0.57%) и стрессовом (-4.35%) терцилях убыток; impact_cost_pct составляет 16.4% валового результата при умеренной ёмкости $3.7 млн. Это реальная, хорошо документированная календарная аномалия, и реализация ей соответствует, поэтому оправдан полный бэктест, но перед оптимизацией аналитику следует проверить, сохраняется ли доходность за окно после учёта спреда и влияния на цену на полной истории и не ограничена ли она одним режимом волатильности.

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

Шарп
0,19
Общая доходность
104,42%
Максимальная просадка
12,25%
Всего сделок
500
Доля прибыльных
60,2%
Профит-фактор
1,43

Точная реализация хорошо документированной календарной аномалии (стык месяцев) на полной исторической выборке за 33 лет (1993-2026), 500 сделок лонг / 0 шорт / ~28.5% экспозиции — сделки полностью соответствуют гипотезе (сезонная надстройка только в лонг, иначе средства в денежных средствах).

Преимущество с запасом покрывает издержки USEQ: avg_trade_return_pct 0.338% (намного выше порога отказа 0.05% и предпочтения >0.10%; проверку L75 проходит), profit_factor 1.43, win_rate 0.60, влияние на цену — лишь 7.9% валового результата, ёмкость около $15.9 млн.

Ключевое опасение NOT по поводу QA подтвердилось на всей истории: regime_performance положителен в ALL трёх терцилях волатильности (спокойная +5.1%, обычная +37.3%, стрессовая +35.4%, only_one_regime=false) — убытки в спокойном и стрессовом режимах были артефактом усечённой песочницы.

Низкое значение max_drawdown 12.2%, для подбора параметров сделок достаточно.

Итоговый коэффициент Шарпа низкий (0.194, CI [-0.12, 0.53] пересекает ноль), но эта надстройка большую часть времени держит средства в денежных средствах (28% времени на рынке) и оценивается по полной кривой капитала с учётом переоценки по рынку, поэтому свободные средства снижают показатель; на этапе повышения статуса оценивай качество с поправкой на риск относительно экспозиции, а не здесь.

Только CAGR 2.64% — надстройка по замыслу; капитал простаивает примерно 72% времени, поэтому есть запас для объединения или масштабирования, это не дефект.

В некоторые годы результат отрицательный (2008 -6.7%, 2022 -8.3%, 2016 -4.1%), но аномалия положительна в большинстве календарных лет.

Анализ

Точное исполнение стратегии с низким оборотом на хорошо документированной календарной аномалии (стык месяцев) на полной исторической выборке за 33 лет; сделки соответствуют гипотезе (500 лонг / 0 шорт, ~28% экспозиции, входы в сезонное окно при тренде выше собственного 200д).

Доходность на сделку превышает порог комиссий USEQ (avg_trade_return_pct оптимизировано 0.21%, порог 0.05%); резких перепадов чувствительности нет; просадка низкая (6.1%); коэффициент Шарпа на отложенной выборке формально положительный (0.36).

Поверхность чувствительности плоская и гладкая при trend_sma_days и exit_trading_day — хрупких параметров нет.

Walk-forward-анализ убедительно выявил переобучение: коэффициент Шарпа IS 0.87 против OOS 0.019, а OOS по окнам равен 0.235 / -0.017 / -0.162 — преимущество не сохраняется вне выборки.

PBO 0.77 (> 0.5) — вероятнее всего, подбор параметров привёл к переобучению.

Дефлированный коэффициент Шарпа 0.020 и PSR/is_significant=false; стратегия не проходит программную проверку FDR (сохраняются 4 из 272; p кандидата=0.98). Оптимизированный коэффициент Шарпа неотличим от шума лучшего из N вариантов среди 225 испытаний (43 эффективных).

OOS Коэффициент Шарпа 0.019 << 0.5 порога валидности — три сбоя HARD, которые нельзя отменить.

Заранее зарегистрированные прогнозы не подтвердились по важным показателям: коэффициент Шарпа OOS 0.019 против заявленного 0.9, PF 1.39 против 1.5, avg_trade_return 0.21% против 0.30%.

Исходная оценка семейства стратегий резко отрицательная: сезонность стыка месяцев неоднократно отвергалась на смежных активах (QQQ TOM fee_edge, BTC TOM fee_edge, BNB TOM другие, переобучение тренда с управлением волатильностью QQQ). Исторически аномалия реальна, но слишком слаба, чтобы покрыть издержки и статистическую поправку в торгуемой надстройке.

Метод Бенджамини — Хохберга при q=0.10 среди 272 кандидатов программы сохраняет 4. Кандидат, не прошедший эту проверку, неотличим от шума самой программы, как бы хорошо ни выглядели его отдельные статистические показатели.

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

Исторически аномалия стыка месяцев реальна, но слишком слаба, чтобы покрыть издержки и поправку на множественное тестирование в торгуемой надстройке; перенос той же сезонности на очередной актив (после провалов QQQ, BTC, BNB) снова приводит к переобучению, а не к обобщаемому преимуществу.

Аналитик отказался от неё после оптимизации: три проверки валидности не пройдены (HARD коэффициент Шарпа OOS < порога 0.019 0.5, is_overfitted true, PBO 0.77 > 0.5); дефлированный коэффициент Шарпа не отличался от шума выбора лучшего результата из N на 225 испытаниях, а стратегия не прошла FDR на уровне программы, поэтому её продвижение стало невозможным.

Сезонная надстройка только в лонг на стыке месяцев держит SPY и QQQ (USEQ, дневные бары) только в окне конца месяца [-1,+3] и лишь когда каждый ETF выше собственного тренда примерно за 200 дней; в остальное время средства остаются в денежных средствах.

На полной выборке 1993-2026 стратегия совершила 500 сделок лонг с долей прибыльных 0.60, фактором прибыли 1.43, средней доходностью на сделку 0.34% (0.21% оптимизировано), CAGR 2.64% и максимальной просадкой 12.2%, но итоговый коэффициент Шарпа составил лишь 0.194 (CI пересекает ноль). Оптимизация выявила решающее переобучение: коэффициент Шарпа IS в walk-forward-анализе 0.87 против OOS 0.019 (0.235/-0.017/-0.162 по окнам), PBO 0.77, дефлированный коэффициент Шарпа 0.020.

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