Files
iddaai-be/mds/V22_BACKTEST_IMPROVEMENTS.md
T
fahricansecer 2f0b85a0c7
Deploy Iddaai Backend / build-and-deploy (push) Failing after 18s
first (part 2: other directories)
2026-04-16 15:11:25 +03:00

239 lines
7.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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._