Загрузка данных
Код Phase 3 готов и прогнан на реальном SMLT. Инфраструктура чистая — но результат стратегии я обязан изложить прямо, без обёртки. Движок отличный; стратегия в нынешнем виде на SMLT не работает, и walk-forward показал это однозначно.
Что на самом деле в файле. Время записано в UTC, не MSK — это решало всё. Я конвертирую в московское и группирую по московскому календарному дню (10:00 MSK = 07:00 UTC). Диапазон 2021-06 → 2026-06, 1266 чистых торговых дней. Вычистил 1305 баров овернайт-шума (спорадические сделки в 02:00 MSK — это не сессия, они искажали бы Volume Profile и ATR) и 254 бара тонких/праздничных дней. Структура сессий менялась по ходу истории: в 2021–2022 была только основная сессия (10:00–18:45), утренняя (07:00) и вечерняя (до 23:45) появились позже. Сплитов нет — единственный дневной гэп −40% это 2022-02-24 (начало СВО, потом MOEX стоял месяц). Цена прошла 1540 → пик 5734 → 401 — рынок структурно нестационарен.
Три адаптации (все провалидированы). Сессионная очистка идёт до расчёта профиля. Гейт сигналов — строго 10:05–18:40 MSK (проверено: время всех сигналов попало ровно в окно, аукционный бар 10:00 и вечерний клиринг исключены). гасит позицию на баре 18:45 — из 2392 сделок ноль перенесено через ночь. Walk-forward режет 70/30 по границе дня (позиции внутридневные, разрез не рвёт сделку); профиль причинный, поэтому считается один раз на весь ряд на каждое значение без утечки будущего, а перебирается дёшево. Все инварианты Phase 2 (сохранение капитала, worst-case исполнение) держатся.force_intraday_close=Trueprice_binsatr_mult
Вердикт walk-forward — стратегия не торгуема. In-Sample сетка вся в минусе: каждая из 9 ячеек дала −94…−99% при PF 0.52–0.62. Это не поверхность с оптимумом — это равномерно убыточная поверхность, и «оптимизация» здесь выбирает наименее плохую точку шума, а не эдж. Рекомендовать выбранные было бы профанацией. Out-of-Sample на них: −65%, PF 0.58.bins=70, atr=3.0
Но диагностика точна и полезнее, чем «не работает». Я прогнал OOS с издержками и без:
сделокдоходностьPFwingross (без издержек)566+20.4%1.11644.7%net (slip 0.05% + fee 0.04%/side)573−65.4%0.57633.9%
Сырой сигнал имеет тонкий положительный эдж (+3.6 экспектации на сделку gross). Издержки съели 8 574 из капитала — 86%. Развёртка по издержкам показывает, что точка безубытка лежит почти в нуле: даже четверть заложенных издержек (0.045% round-trip) уже опускает PF до 0.92. Никакая достижимая стоимость исполнения на среднеликвидной MOEX-бумаге эту стратегию не вытягивает. Это ровно тот провал, о котором я говорил в самом начале («большинство идеальных формул гибнут на издержках») — здесь она гибнет именно там.
Механика, почему тонкий эдж не доживает: реализованный R:R gross ≈ 1.3, а не заложенные 2.5, потому что TIME_STOP (308 сделок) и SESSION_CLOSE (93) режут позиции до достижения цели 2.5R. Деньги делают 39 TP-сделок (+8 487 gross), теряют 119 стопов (−12 184), а между ними сотни мелких принудительных выходов. При 1.5 сделки в день частота умножает издержки на этот зажатый эдж.
Важно для чистоты вывода: это не история оверфита. Оверфит — это когда IS прекрасен, а OOS разваливается. Здесь IS тоже глубоко убыточен, значит валидировать было нечего изначально, а OOS лишь подтвердил. Отдельно: IS (2021–2024) и OOS (2024–2026) — структурно разные рынки (война, закрытие, появление утренней/вечерней сессий), так что единичный сплит 70/30 хрупок сам по себе — но в данном случае это вторично, потому что не работает везде.
По твоему вопросу о стартовых параметрах. Обоснованные стартовые значения для РФ-акций: (один полный торговый день MOEX со всеми сессиями на M5), 40–50 (меньше бинов = устойчивее POC, меньше подгонки под микроуровни), 2.5–3.0 (SMLT волатилен). Но прямо скажу: параметры здесь не рычаг — поверхность плоская и убыточная по всей сетке. Реальные рычаги, если продолжать: торговать кратно реже (только сетапы, чей gross-эдж заведомо больше round-trip издержек), давать победителям доходить до 2.5R вместо того чтобы тайм-стоп/сессионное закрытие срезали тонкий эдж, и проверить реальные спреды SMLT — хотя даже оптимистичные издержки не спасают.profile_window ≈ 200price_binsatr_mult
Честный следующий шаг — не тюнинг этой логики. Прежде чем строить ещё машинерию, я бы проверил, есть ли у классификатора вообще предсказательная сила: распределение форвард-доходности по каждому состоянию (TREND_IMPULSE / COMPRESSION_FLAT / EXHAUSTION) против безусловного. Если форвард-эдж состояний неотличим от нуля — стратегию надо менять на уровне гипотезы, а не параметров. Это, либо полноценный rolling-WFA на несколько фолдов — что из двух собрать?Market_State