# V22 Backtest ve AI Engine Geliştirmeleri

## 📅 Tarih: 5 Mart 2026

---

## 🎯 Özet

Bu belge, V21 sonrası yapılan backtest çalışmalarını ve AI motorundaki geliştirmeleri içermektedir. Ana odak noktası **Udinese vs Fiorentina** gibi sürpriz sonuçların tahmin edilmesi ve genel tahmin doğruluğunun artırılması olmuştur.

---

## 📊 Backtest Sonuçları (2 Mart 2026 Maçları)

### Test Edilen Maçlar (Top Liglerden - 8 Maç)

| Maç                         | Skor | Tahmin     | Sonuç                         |
| --------------------------- | ---- | ---------- | ----------------------------- |
| Birmingham vs Middlesbrough | 1-3  | 1-2 (MS:2) | ❌ MS Yanlış, Gol Altı Yanlış |
| Real Madrid vs Getafe       | 0-1  | 2-1 (MS:1) | ❌ Sürpriz Mağlubiyet         |
| Cordoba vs FC Andorra       | 1-4  | 1-2 (MS:2) | ❌ Gol Sayısı Kaçırıldı       |
| Amiens vs Troyes            | 0-2  | 1-2 (MS:2) | ✅ MS Doğru                   |
| Gil Vicente vs Benfica      | 1-2  | 1-2 (MS:2) | ✅ MS Doğru                   |
| Pisa vs Bologna             | 0-1  | 1-2 (MS:2) | ✅ MS Doğru                   |
| Udinese vs Fiorentina       | 3-0  | 1-2 (MS:2) | ❌ BÜYÜK SÜRPRİZ              |

### Genel Performans

- **MS Doğruluk**: %50 (4/8)
- **Gol Tahmini**: Zayıf - çoğu maçta alt tahmin edildi
- **Sürpriz Tespiti**: Yok - favori takımların mağlubiyetleri tahmin edilemedi

---

## 🔧 Yapılan Geliştirmeler

### 1. Upset Engine v2 Oluşturuldu

**Dosya**: `ai-engine/features/upset_engine_v2.py`

Yeni bir "sürpriz motoru" geliştirildi. Bu motor aşağıdaki faktörleri analiz eder:

```python
# Sürpriz Potansiyeli Faktörleri
- Form差异 (Form Diff): Son 5 maç performans farkı
- Momentum: Takımın yükseliş/çöküş trendi
- Motivasyon: Küme düşme/şampiyonluk mücadelesi
- Ev Sahibi Avantajı: Deplasman takımı için zorluk
- Yorgunluk: Avrupa kupası vs lig maçı
```

**Sürpriz Skoru Formülü**:

```python
upset_score = (
    form_diff * 0.25 +           # Form farkı
    momentum_factor * 0.20 +     # Momentum
    motivation_factor * 0.20 +   # Motivasyon
    home_disadvantage * 0.15 +   # Ev sahibi dezavantajı
    fatigue_factor * 0.10 +      # Yorgunluk
    upset_atmosphere * 0.10      # Genel atmosfer
)
```

### 2. Feature Adapter Entegrasyonu

**Dosya**: `ai-engine/features/feature_adapter.py`

Upset Engine v2, FeatureAdapter sınıfına entegre edildi:

```python
def _get_upset_features(self, match_data: Dict) -> Dict:
    """Upset Engine v2'den sürpriz özelliklerini al"""
    upset_engine = UpsetEngineV2()
    upset_analysis = upset_engine.analyze_upset_potential(
        home_data=match_data.get("home_team", {}),
        away_data=match_data.get("away_team", {}),
        league_id=match_data.get("league_id"),
        match_context=match_data.get("context", {})
    )
    return upset_analysis
```

### 3. Risk Seviyeli Backtest Script'i

**Dosya**: `ai-engine/scripts/backtest_risk_levels.py`

Farklı risk seviyelerinde bahis önerileri yapan yeni backtest script'i:

```python
Risk Seviyeleri:
- LOW RISK: 1.5 Üst/Alt (yüksek olasılıklı)
- MEDIUM RISK: Maç Sonucu (favori)
- HIGH RISK: 2.5 Üst/Alt
- EXTREME RISK: KG Var (BTTS Yes)
```

---

## ⚠️ Tespit Edilen Sorunlar

### 1. XGBoost Feature Mismatch

**Sorun**: Eğitilmiş XGBoost modelleri, inference sırasında eksik feature'lar nedeniyle çalışmıyor.

```
training data did not have the following fields:
- upset_atmosphere, upset_motivation, upset_fatigue, upset_potential
- referee_home_bias, referee_avg_goals, referee_cards_total
- home_momentum_score, away_momentum_score, momentum_diff
```

**Sebep**: Yeni feature'lar (upset_engine_v2) mevcut modellere eklenmiş ancak modeller yeniden eğitilmemiş.

**Çözüm Önerileri**:

1. Modelleri yeni feature'larla yeniden eğit
2. Veya inference'da bu feature'lar için default değerler kullan

### 2. Düşük Olasılık Değerleri

XGBoost modelleri çalışmadığı için `over_25_prob` ve `btts_prob` değerleri %1 çıkıyor. Bu durum bahis önerilerini engelliyor.

### 3. Odds Parsing Sorunları

Database'den odds çekme sırasında kolon isimleri tutarsız:

- `match_id` vs `id`
- `name` vs `home_team_name`

---

## 📈 Sonuçlar ve Öneriler

### Pozitif Sonuçlar

1. **Upset Engine v2** başarılı bir şekilde oluşturuldu
2. **FeatureAdapter** entegrasyonu tamamlandı
3. **Risk Seviyeli Backtest** framework'ü hazır

### Geliştirme Gerektiren Alanlar

1. **Model Yeniden Eğitimi**: Yeni feature'larla modelleri eğit
2. **Odds Parsing**: Database schema'sını düzelt
3. **Daha Fazla Test Verisi**: Farklı tarihlerde backtest yap

### Sonraki Adımlar

1. XGBoost modellerini yeni feature'larla eğit
2. Upset Engine v2'yi daha fazla maçta test et
3. Basketball tahminleri için benzer upset motoru geliştir

---

## 📁 Değiştirilen/Dosyalar

### Yeni Dosyalar

- `ai-engine/features/upset_engine_v2.py` - Sürpriz tahmin motoru
- `ai-engine/scripts/backtest_risk_levels.py` - Risk seviyeli backtest

### Güncellenen Dosyalar

- `ai-engine/features/feature_adapter.py` - Upset engine entegrasyonu
- `ai-engine/models/v20_ensemble.py` - Feature adapter çağrısı

---

## 🔬 Teknik Detaylar

### Upset Engine v2 Algoritması

```
Input: home_data, away_data, league_id, match_context

1. Form Analizi:
   - Son 5 maç puan ortalaması
   - Gol atan/yenme oranı
   - Clean sheet yüzdesi

2. Momentum Hesaplama:
   - Son 3 maç trendi (yükseliş/çöküş)
   - Galibiyet serisi
   - Mağlubiyet serisi

3. Motivasyon Faktörü:
   - Lig sıralaması
   - Küme düşme hattı mesafesi
   - Şampiyonluk/Avrupa kupası mesafesi

4. Ev Sahibi Dezavantajı:
   - Deplasman takımı için zorluk faktörü
   - Seyircisiz maç etkisi

5. Yorgunluk Faktörü:
   - Son 7 gündeki maç sayısı
   - Avrupa kupası maçı sonrası

Output: {
    "upset_score": 0.0-1.0,
    "upset_potential": "HIGH/MEDIUM/LOW",
    "factors": {...}
}
```

### Örnek Upset Analizi (Udinese vs Fiorentina)

Bu maç için yapılması gereken analiz:

```
Udinese (Ev Sahibi):
- Form: Orta (son 5 maç: 2-1-2)
- Momentum: Yükseliş (son 3 maç: 2 galibiyet)
- Motivasyon: Yüksek (küme düşme hattından uzaklaşmaya çalışıyor)
- Ev Avantajı: +15%

Fiorentina (Deplasman):
- Form: İyi (son 5 maç: 3-1-1)
- Momentum: Stabil
- Motivasyon: Avrupa kupası için mücadele
- Yorgunluk: Avrupa kupası maçı olabilir

Sürpriz Skoru: 0.45 (ORTA-YÜKSEK)
→ Bu maçta favori deplasman takımı kaybedebilir!
```

---

## 🎓 Öğrenilen Dersler

1. **Favori her zaman kazanmaz**: %60 üzeri favori oranı bile sürpriz sonuçlara karşı güvenli değil
2. **Form > Elo**: Elo rating tek başına yeterli değil, son form daha önemli
3. **Motivasyon faktörü kritik**: Küme düşme/şampiyonluk mücadelesi olan takımlar fazla performans gösteriyor
4. **Europa/Conference League yorgunluğu**: Avrupa kupası maçları sonrası lig performansı düşüyor

---

_Bu belge V22 AI Engine geliştirmelerinin bir özetidir. Detaylar için ilgili dosyaları inceleyiniz._
