---
name: investpilot-momentum-filter
description: "КодИнвест — момент-фильтр build_plan (не входить против свежего 1м-импульса), из слепого анализа"
metadata: 
  node_type: memory
  type: project
  originSessionId: 6f344612-b945-4107-b457-8ad2163cd988
---

**КодИнвест ([[investpilot-overview]]) — момент-фильтр, 2026-07-13.** Прямое следствие [[investpilot-historical-validation]] (1-мес моментум — сильнейший драйвер, r=+0.19).

`build_plan` (analysis/plan.py) + config `mom_1m_gate=8.0`: не входить ПРОТИВ свежего месячного импульса — LONG при `mom_1m < -gate` → NONE, SHORT при `mom_1m > +gate` (отскок) → NONE. Дефолт параметра в build_plan = 999 (выкл, обратная совместимость); боевое значение из config прокинуто в `analyzer.build_plan` и `replay.run_backtest`.

**A/B бэктест 2020-2026 (свинг, RR 2.2), gate→PF/винрейт:** выкл 1.32/44.5% → 12: 1.29 → 10: 1.30 → **8: 1.33/45.0%** (боевой, режет ~6% сделок) → 6: 1.33/45.5% → 4: 1.34/46.3%. Чем строже — выше качество (PF/винрейт), меньше объём. **Гейт регресса PF≥1.3 пройден.** Улучшение скромное (эдж слабый), но в правильную сторону; можно ужесточить до 4-6 ради качества ценой объёма.

Тест: `test_mom_1m_gate_blocks_short_on_bounce` (нисходящий тренд + отскок за месяц → SHORT гейтится). 160 pytest. Скрипт A/B: `scripts/backtest_detail.py`.

---

**Довесок 2026-07-13 — ВИНРЕЙТ-ЛОВУШКА + RR 2.0 (цель «макс винрейт + объём»).**
Скрипт `scripts/winrate_volume_frontier.py` (добавлен tp_r в `replay._simulate_exit` — тейк по кратности риска). Ключевой урок **D-winrate-is-a-trap**: винрейт легко накрутить ближним тейком (tp1.0R → 51.5%), но PF рушится 1.33→1.06 и суммарная прибыль в 4 раза меньше (близкий тейк режет прибыль в +1R, убытки остаются −1R). **Высокий винрейт ≠ больше денег; считают PF и сумма.** Трейлинг-выход по PF лучший — не трогаем.
- **Объём задаёт ВХОД, винрейт — ВЫХОД** (почти независимы).
- Владелец выбрал СРЕДНИЙ: **`min_rr` 2.2→2.0** — боевой бэктест (gate8, mom10): 1401 сделка (+11%), винрейт 45.3%, **PF 1.34**, сумма +1032% (было rr2.2: 1266/1.33/871%). Больше объёма + выше PF + больше прибыли. Гейт PF≥1.3 пройден.
- ⚠️ Грабля в моём же коде (поймана скепсисом «слишком хорошо»): при tp_r засчитывал выход по ДАЛЬНЕЙ структурной цели вместо ближнего тейка → фейковые PF 3.10. Фикс: exit_price=tgt. Урок: «слишком хорошо» = сначала ищи баг.

---

**Довесок 2026-07-19 — 52w-floor для шортов (D32, гипотеза челленджера подтверждена).**
Челленджер ~10× подряд рубил «шорт у 52w-минимума», ядро же запрещало только шорт с ВЕРШИНЫ (pos>0.6). Свип `scripts/sweep_short_52w.py`: **`short_52w_floor=0.20`** (шорт запрещён в нижних 20% годового диапазона) → PF 1.36→**1.50**, SHORT-PF 1.48→**2.04**, винрейт 45.4→47.0, сумма сохраняется при −22% сделок; 0.30 уже режет прибыль. Шорт-окно теперь pos∈[0.2, 0.6]. Принцип D32: повторяющийся вердикт LLM-скептика → кандидат в детерминированный гейт, но ставить только после свипа с PF-гейтом. Заодно кластерный лимит пушей `max_open_push_per_direction=5` (урок #41).
