This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
# 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 |
|
||||
Reference in New Issue
Block a user