---
name: investpilot-historical-validation
description: КодИнвест — честная проверка на истории (бэктест ядра по годам + слепой LLM-прогон)
metadata: 
  node_type: memory
  type: project
  originSessionId: 6f344612-b945-4107-b457-8ad2163cd988
---

**КодИнвест ([[investpilot-overview]]) — проверка «правильно ли анализирует» на истории, 2026-07-13.**

Владелец: «возьмём сделки из прошлого, дадим боту проанализировать — посмотрим, правильно ли обучается». Ловушка: наивный прогон = lookahead bias (codex знает историю MOEX). Сделано ЧЕСТНО, в двух слоях (скрипты `scripts/backtest_detail.py`, `scripts/blind_llm_eval.py`).

**1. Бэктест ядра (без LLM, lookahead-free), 2020-2026, боевые параметры RR 2.2:**
1351 сделка, винрейт 44.5%, PF 1.32. Эдж РЕЖИМНЫЙ: 2022 PF 1.61 / 2023 1.76 / 2024 1.75 / 2026 1.55 — прибыльные; **2021 PF 0.78 и 2025 PF 0.69 — убыточные**. SHORT (PF 1.49) сильнее LONG (1.17). Вывод: живые минусы песочницы = попадание в слабый режим 2025, не поломка. Стратегия не «money machine», а трендовая с режимной зависимостью.

**2. Слепой LLM-прогон (честная проверка суждения):** обезличенные сетапы (проценты/направление/режим — БЕЗ тикера/даты/цены/ставки) → судья «брать/пропустить» → сверка с реальным исходом. Скрипты `blind_llm_eval.py`, `blind_export.py`, `codex_judge.py`, `score_experiment.py`.
- Первый прогон (60): codex одобренные 67% vs отклонённые 43% → казалось «LLM даёт ценность». **НО это была случайность малой выборки.**
- **КОНТРОЛИРУЕМЫЙ прогон (150 одинаковых сетапов, 3 судьи) — ИСПРАВЛЯЕТ вывод:** baseline 46%/+0.91%. **codex НЕ добавляет** (одобрил 116 → +0.56%, отклонил 34 → +2.13%; режет ХОРОШИЕ). **Трендовое правило (детерминир.) ДОБАВЛЯЕТ** (+1.69%). Ручное суждение Claude вредило, а его формализация — помогает (механика > «на глаз»).
- **Объективно (корреляция признак↔P/L):** сильнейшие — 1-мес моментум и ATR (r=+0.19 каждый, в сторону сделки); растянутость от SMA200 слабо в минус. Эдж размазан, |r|≤0.19, магии нет.

**Урок D-blind-eval:** на голой технике LLM-судья не бьёт простое правило; ценность LLM — в синтезе/KB/новостях, которые слепой тест вырезает. Не переоценивать малые выборки. Оговорки: тест = бинарный accept/reject по технике, не полный анализатор (KB/макро/фундаментал вырезаны → недооценка боевого бота); режим рынка — слабый остаточный отпечаток.

**Результат-эффект → [[investpilot-momentum-filter]]** (внедрён момент-фильтр из этого анализа).

Скрипты переиспользуют `backtest/replay.py` (as-of `hist=candles[:i+1]`).
