# V20+ Quant Entegrasyonu & UI Dashboard

> **Tarih:** 13 Mart 2026  
> **Versiyon:** V20+Quant  
> **Kapsam:** Backend (AI Engine) + Frontend (Suggest-Bet-FE)

---

## 1. V2 Kantitatif Katman Entegrasyonu

### Yapılan Değişiklikler

#### `services/single_match_orchestrator.py`

**`_decorate_market_row()` metodu güncellendi:**
- Eski `edge = confidence - implied_prob` hesabı → Yeni **EV Edge** formülüne geçildi:
  ```
  ev_edge = (probability × odds) - 1.0
  ```
- Sabit bahis birimi yerine **Fractional Kelly Criterion** ile stake hesabı:
  ```
  kelly_fraction = (prob × (odds - 1) - (1 - prob)) / (odds - 1)
  stake = min(max(kelly_fraction × 0.25, 0), 0.25) × 10
  ```
- Grade sistemi edge-based'e geçirildi:
  - **A**: EV Edge > %10
  - **B**: EV Edge > %5
  - **C**: EV Edge > %2
  - **PASS**: Edge ≤ %2

**`_to_bet_summary_item()` güncellendi:**
- `ev_edge`, `implied_prob`, `odds` alanları bet_summary çıktısına eklendi

**`_real_market_odds()` — YENİ metod:**
- Default oran bug'ı düzeltildi (aşağıda detay)

---

## 2. Default Oran Bug Fix (Kritik)

### Problem
MS market oranları veritabanında eksik olduğunda, sistem sahte default değerler enjekte ediyordu:
```python
DEFAULT_MS_H = 2.65  # SAHTE
DEFAULT_MS_D = 3.20  # SAHTE  
DEFAULT_MS_A = 2.65  # SAHTE
```
Bu değerler market row'larına sızarak **sahte EV Edge** oluşturuyordu:
- GS vs Eyüpspor → `edge=+73%` (SAHTE — gerçek oran yok!)
- Bandırma vs Hatay → `edge=+59%` (SAHTE — gerçek oran yok!)

### Çözüm
`_real_market_odds()` helper metodu eklendi:
```python
def _real_market_odds(self, odds_data, key):
    val = float(odds_data.get(key, 0.0))
    if val <= 1.0: return 0.0
    DEFAULTS = {"ms_h": 2.65, "ms_d": 3.20, "ms_a": 2.65}
    if key in DEFAULTS and abs(val - DEFAULTS[key]) < 1e-6:
        return 0.0  # Sahte default → sıfırla
    return val  # Gerçek oran → kullan
```

**Etki:**
- ML modeli hala defaultları feature olarak kullanıyor ✅
- Market row'lar 0.0 alıyor → `market_odds_missing` gate tetikleniyor → PASS ✅
- Sahte edge oluşmuyor ✅

---

## 3. Backtest Sonuçları (8-22 Şubat, 14 Gün)

### Düzeltilmiş Sonuçlar (Sahte oranlar temizlendikten sonra)

| Metrik | Değer |
|--------|-------|
| **Toplam Main Pick** | 65 |
| **Doğruluk** | 55/65 (%84.6) |
| **Kelly ROI** | +%10.0 |
| **Flat-stake ROI** | -%2.4 |

### Grade Bazlı Performans

| Grade | Doğruluk | ROI | Açıklama |
|-------|----------|-----|----------|
| **A** (>%10 edge) | 1/1 (%100) | +%40 | Twente OU15 Üst (gerçek odds=1.40) |
| **B** (%5-10 edge) | 1/1 (%100) | +%12 | GS-Juventus OU15 Üst |
| **C** (%2-5 edge) | 4/6 (%66.7) | -%26.2 | Düşük oran baskısı |
| **PASS** | 49/57 (%86) | -%0.9 | Güvenli ama düşük oran |

### Önemli Çıkarımlar
1. **Grade A gerçekten kârlı** — sadece gerçek oranlarla hesaplanan edgeler
2. **Kelly staking çalışıyor** — yüksek edge'e daha fazla stake koyuyor
3. **Çoğu pick OU15/DC** — MS oranları eksik olduğundan (lineup yok)
4. **PASS pickleri güvenli** — %86 isabet ama düşük oranlar (1.06-1.30)

---

## 4. Frontend UI Entegrasyonu

### Değiştirilen Dosyalar

#### `src/lib/api/predictions/types.ts`
```typescript
// MatchPickDto'ya eklendi:
ev_edge: number;
implied_prob: number;

// MatchBetSummaryItemDto'ya eklendi:
ev_edge: number;
implied_prob: number;
odds: number;
```

#### `src/components/matches/prediction-card.tsx` (Tam Yeniden Yazıldı)

**4 yeni sub-component:**

| Component | Görsel | Açıklama |
|-----------|--------|----------|
| `EvEdgeBadge` | `EV +14.2%` | Yeşil/kırmızı gradient badge, animated mount |
| `KellyStakePills` | `●●●○○ 1.5u` | Dolu/boş daire ile stake göstergesi |
| `ProbComparisonBar` | Mavi vs turuncu bar | Model olasılığı vs bahisçi olasılığı |
| `QuantDashboard` | Glassmorphism kart | Edge gauge + Model vs Bookie + Kelly stake |

**Mevcut componentler güncellendi:**
- `PickCard`: EV Edge badge + Kelly pills + prob comparison bar eklendi
- `BetSummaryRow`: Odds, edge %, stake kolonları; pozitif edge satırları yeşil vurgulanıyor

#### `messages/tr.json` & `messages/en.json`
8 yeni çeviri anahtarı: `ev-edge`, `implied-prob`, `model-prob`, `kelly-stake`, `edge-positive`, `edge-negative`, `quant-analysis`, `vs-bookie`

---

## 5. Dosya Değişiklik Özeti

| Dosya | Tip | Açıklama |
|-------|-----|----------|
| `ai-engine/services/single_match_orchestrator.py` | MODIFY | `_real_market_odds()` eklendi, `_decorate_market_row()` EV Edge + Kelly entegrasyonu |
| `ai-engine/scripts/backtest_v20plus_quant.py` | NEW | 2 haftalık V20+Quant backtest scripti |
| `Suggest-Bet-FE/src/lib/api/predictions/types.ts` | MODIFY | Quant alanları (ev_edge, implied_prob, odds) |
| `Suggest-Bet-FE/src/components/matches/prediction-card.tsx` | REWRITE | EvEdgeBadge, KellyStakePills, ProbComparisonBar, QuantDashboard |
| `Suggest-Bet-FE/messages/tr.json` | MODIFY | 8 yeni TR çeviri |
| `Suggest-Bet-FE/messages/en.json` | MODIFY | 8 yeni EN çeviri |
