# X5 WinRate Experiments (v13, 2026-08-14)

## Проблема
X5 имеет аномально низкий винрейт в live-торговле: **18.8% (39/207 сделок)**.
Базовый long success rate при текущем таргете TP=8×ATR — **12.9%** (1098/8490 баров):
движение на 8×ATR крайне редкое для этой спокойной бумаги.

## Диагностика

### Сканирование SL/TP (симуляция на 8543 H1-барах)
| Конфиг (SL/TP ×ATR) | SR | RR | Брейкивен | EV |
|----------------------|-----|-----|----------|-----|
| 4.0/8.0 (текущий) | 11.9% | 2.00 | 33.3% | **-0.64** |
| 2.5/5.0 (SBER) | 21.4% | 2.00 | 33.3% | -0.36 |
| 2.0/4.0 | 25.9% | 2.00 | 33.3% | -0.22 |
| 1.0/2.0 | 30.6% | 2.00 | 33.3% | -0.08 |
| 2.0/2.0 | 44.1% | 1.00 | 50.0% | -0.12 |
| 1.0/1.0 | 49.3% | 1.00 | 50.0% | -0.01 |
| 1.5/1.0 | 59.4% | 0.67 | 60.0% | -0.01 |
| 2.0/1.0 | 64.8% | 0.50 | 66.7% | -0.03 |

**Вывод:** ни один конфиг RR≥1 не даёт положительного EV для X5. Только
асимметричные (TP<SL) приближаются к брейкивену. EV нестабилен по подпериодам
(Ч3 всегда убыточен), но **momentum-отбор даёт реальное превосходство над базовым
SR** (Q3: 63-69% vs брейкивен 60-66.7%) → модель MoE способна отбирать
выигрышные бары.

## Эксперименты (MoE v12 + monotone constraints, limit=4000, ~2.5 мин)

| Конфиг | SR | OOS val_acc | Порог | Net |
|--------|-----|-------------|-------|-----|
| 4.0/8.0 (baseline) | 12.0% | 86.5% | 0.95 (no-trade) | 0 |
| 2.5/5.0 | 24.8% | 68.9% | 0.95 (no-trade) | 0 |
| 2.0/2.0 (RR 1:1) | 52.3% | 53.4% | 0.50 | +328% |
| 1.5/1.5 (RR 1:1) | 58.5% | 63.7% | 0.51 | +309% |
| 1.0/1.0 (RR 1:1) | 68.2% | 61.7% | 0.50 | +287% |
| **1.5/1.0 (RR 0.67)** | **70.0%** | **68.8%** | **0.51** | **+406%** |
| 2.0/1.0 (RR 0.5) | 72.0% | 67.1% | 0.51 | +375% |

**Победитель: SL=1.5×ATR / TP=1.0×ATR (RR 0.67).**

### Валидация на полных данных (limit=None, ~10 мин)
| Конфиг | SR | OOS val_acc | Порог |
|--------|-----|-------------|-------|
| 1.5/1.0 | 67.0% | 64.3% | 0.50 |
| 1.5/1.5 | 54.2% | 50.4% | 0.84 (нестабильно) |

## Внедрение (production)

Добавлен override в `config.py` → `TICKER_RISK_OVERRIDES`:
```python
'X5': {'atr_mult_sl': 1.5, 'atr_mult_tp': 1.0},  # RR 0.67 → высокий WR
```

Полное переобучение через `train_all_rr1x2.py --ticker X5` (10.2 мин):

| Метрика | Было (4/8) | Стало (1.5/1.0) |
|---------|-----------|-----------------|
| Long SR | 12.9% | **68.1%** |
| OOS val_acc | 75.4% (мнимое) | **61.5%** (честное) |
| Порог | 0.55 (fallback) | **0.67** (реальный) |
| WR на сделках (OOF WF) | ~22% | **69.4-70.0%** |
| Net (OOF WF) | отрицательный | **+5.02** |

Walk-forward CV (4 folds):
```
thr=0.55: trades=5876, WR=68.8%, net=4.98
thr=0.67: trades=5617, WR=69.4%, net=5.02   ← выбран
thr=0.73: trades=5385, WR=70.0%, net=5.02
```

**Ключевой результат:** раньше порог 0.55 был fallback'ом no-trade (модель не
находила ни одного порога с WR > breakeven 35%). Теперь threshold search находит
**реальный порог 0.67 с WR 69.4%** — модель действительно отбирает выигрышные
входы. Ожидаемый эффект в live: винрейт с ~19% → 55-70% при RR 0.67
(профитность сохраняется: net на 1 SL = WR×0.67 - (1-WR) > 0 при WR > 60%).

## Проверки
- ✅ Train/live синхронизация: `get_risk_params('X5')` → SL=1.5, TP=1.0
- ✅ Инференс: `main.py --ticker X5 --moe --load` работает
- ✅ Монитор: `monitor.py --ticker X5` работает
- ✅ Открытых сделок X5 нет — конфликт старых SL/TP исключён

## Файлы
- `/tmp/opencode/x5_exp_sl_tp.py` — эксперимент-харнесс
- `/tmp/opencode/x5_experiments_log.json` — лог всех экспериментов
- `config.py` → `TICKER_RISK_OVERRIDES['X5']` — внедрённый конфиг
- `models/saved/x5_moe_v12_rr1x2.joblib` — переобученная модель

## Дальнейшие шаги (опционально)
1. Мониторинг live-результатов X5 1-2 недели
2. Проверить, не нужны ли аналогичные узкие таргеты для MTSS, NSVZ (низкий SR)
3. Прогнать полный переобуч всех 18 тикеров с учётом v13 (monotone + X5)
