16 KiB
IDDAAI — Bahis Motoru Operasyon Workflow'u (V31d)
Bu doküman, AI bahis tahmin motorunun nasıl çalıştırılacağı, doğrulanacağı, izleneceği ve yeniden ayarlanacağına dair operasyon kılavuzudur. Hedef: hem hacim hem kâr — gerçekçi beklenti premium tier'da +%30 ROI, daha geniş ağda +%5–15.
Son güncelleme: 2026-05-29 · Judge sürümü:
judge-v31d-evidence-tiersV31d ne değiştirdi (hacim krizi çözümü): V31c yalnızca 28 oynanabilir bahis / 10k maç üretiyordu çünkü iki veto (
calibrated_confidence_too_low,play_score_too_low) HER underdog'u reddediyordu — bunlar ">%45 model güveni iste" diyen FAVORİ-seçme kuralı. Ama kârlı bir 6.5 oran underdog'u zaten sadece ~%20 tutar; kâr oran priminden gelir. V31d, MS değer-tier eşleşmelerinde bu iki vetoyu kaldırır ve skoru tier kalitesinden üretir. Sonuç (60g doğrulama): 28 → 602 oynanabilir bahis (22x), −1.6u → +39.4u, ROI −%28 → +%32.7. Tüm zengin analiz çıktısı (market_board, v25/v27, triple_value, olasılıklar) aynen korunur — yalnızcaplayablebayrağı değişir.
0. TL;DR — En Önemli 5 Kural
- SADECE TEKLİ BAHİS OYNA. KOMBİNE YOK. Matematiksel olarak kanıtlandı:
1-leg
+%3.4→ 2-leg-%32→ 3-leg-%67→ 4-leg-%83. Marjinal +EV bacakları çarpmak kazancı yok eder. - Asıl kâr MS (1X2) underdog bölgesinde. Oran ≥ 6.0 + model_gap ≥ 0 = en yüksek ROI.
- Hiçbir market mute edilmez. Tier sistemi filtreler; gerçek ROI'ler görünür kalır
(
MUTED_MARKETS = set()). - Kalibrasyon ≠ Bahis sinyali. MS tier'ları ham model olasılığını kullanır
(
model_gap,ev_edge). İzotonik kalibratörler sadece ekrandakicalibrated_confidence'i etkiler (BTTS/OU25'te şişik — dikkat). - Backtest'e körü körüne güvenme. Model eğitim kesim tarihini bil; in-sample/out-of-sample ayrımını her zaman yap (bkz. Bölüm 6).
1. Sistem Mimarisi (Pipeline)
Maç verisi (DB: matches, odds, elo, form, h2h…)
│
▼
[V25 Ensemble] XGBoost + LightGBM + CatBoost → her market için ham olasılık
│
▼
[V27 Dual-Engine] ikinci görüş / consensus (AGREE / DISAGREE)
│
▼
[İzotonik Kalibrasyon] ham olasılık → calibrated_confidence (ekran için)
└─ kalibratörü OLMAYAN marketlerde hafif damping (×0.92)
│
▼
[BettingBrain V31d — Deterministik Hâkim]
├─ ev_edge = calibrated_probability × oran − 1 (ham-prob + market blend)
├─ model_gap = ham_model_olasılık − implied_prob
├─ trap_market = market geçmiş banttan fazla fiyatlamış mı?
├─ odds_reliability = lig bazında geçmiş Brier skorundan
└─ MARKET_ODDS_TIERS → value_tier (premium/strong/standard) → bet_grade (A/B/C)
│
▼
[Çıktı] bet_summary[] → playable, value_tier, stake_units, bet_grade
→ BE (smart-coupon) → FE / Mobile
Anahtar dosyalar:
services/betting_brain.py— deterministik hâkim, tier tanımları (MARKET_ODDS_TIERS)services/orchestrator/market_board.py— ev_edge/model_gap/kalibrasyon hesaplarıscripts/diagnostic_backtest_multi.py— çok-pick backtest (maç başına TÜM marketler)models/v25/,models/calibration/— model ve kalibratör dosyaları
2. V31d — Kanıta Dayalı Kademeli Değer Sistemi (Evidence-Based Tiers)
Kullanıcı risk iştahına göre seçer. Her tier maç başına ayrı sinyal üretir. Sadece premium otomatik STAKE'lenir (BET); strong/standard WATCH olarak görünür (tam analiz gösterilir, oynanmaz) çünkü 60 günlük veri o bantların ~başabaş olduğunu söylüyor.
| Tier | Grade | Oran bandı | Filtre | 60g ROI* | Aksiyon | Karakter |
|---|---|---|---|---|---|---|
| premium | A | 6.00 – 7.50 | model_gap ≥ 0, rel ≥ 0.30 | +%32.7 | BET | Doğrulanmış edge; ~%20 hit, yüksek varyans |
| strong | B | 5.00 – 6.00 | model_gap ≥ 0, rel ≥ 0.30 | ~%−1 (başabaş) | WATCH | Görünür, oynanmaz (kanıt yetersiz) |
| standard | C | 3.00 – 5.00 | model_gap ≥ 0, rel ≥ 0.30 | +%0.5 (başabaş) | WATCH | Hacim bölgesi, marj yok |
| info (—) | — | market’e özel | ultrastrict (min_edge≥0.02, rel≥0.45-0.55, trap yok) | ~0 | REJECT/info | Bilgi amaçlı, nadiren geçer |
* 60 günlük doğrulamadan (72.582 settled satır, 7.793 maç, 2026-04-17..05-28;
ms_envelope.py + new_gate_sim.py). premium: 602 bahis, +%32.7 ROI, +39.4u,
%20.6 hit, 6 haftanın 6'sı da pozitif, OOS(>05-24) +%47.4.
NEDEN 6.0–7.5 (V31c'deki 6.0–50.0 değil): edge dar bir banda yoğunlaşmış.
6.0–7.0 +%35 · 7.0–8.0 ~başabaş · 8.0+ NEGATİF (−%10..−26, longshot mezarlığı).
Eski geniş premium tier kaybeden longshot'ları içeri alıyordu. 7.5 üstünde modelin
edge'i buharlaşıyor.
Tasarım mantığı: premium = ROI ve hacim motoru (60g'de ~14 bahis/gün = bol hacim). Bahisçi:
- Düşük risk / yüksek kalite istiyorsa → sadece premium (A) oyna (varsayılan).
- Daha fazla hacim istiyorsa → premium bandını 6.0–8.0'e genişlet (ROI +%32.7 → +%19,
hâlâ sağlam, +%44 hacim) —
MARKET_ODDS_TIERS["MS"]premiummax_odds'u değiştir.
Non-MS marketler (DC, OU25, OU35, BTTS, HT, OU15, HTFT, OE, HT_OU05, HT_OU15, CARDS):
hepsi ultrastrict tek-tier ile bilgi amaçlı. Geçmiş veride sistematik olarak kayıp
verdikleri için BET üretmeleri zorlaştırıldı (mute YOK — sadece sıkı eşik).
Veto mantığı (V31d kritik): value-tier eşleşmelerinde calibrated_confidence_too_low
ve play_score_too_low vetoları KALDIRILIR (bunlar favori-seçme kuralı). Ama gerçek
koruma vetoları AKTİF kalır: extreme_negative_ev (ev<−0.20), ev_edge_too_high_trap
(ev≥0.30), htft_reversal_risk_high, v25_v27_hard_disagreement, low_reliability_hard.
60g'de premium tier-eşleşmelerinin ~%71'i oynanabilir oldu; kalan ~%29 bu koruma
vetolarıyla doğru şekilde reddedildi.
3. EN İYİ BAHİS DEĞERLERİ — Kesin Sıralama (Best Bet Values)
"Multi bahislerde bütün bahis değerlerinin en iyisi" sorusunun cevabı. Hepsi TEKLİ oynanır. (Aşağıdaki ROI'ler 0.2u sabit stake simülasyonundan.)
MS (1X2) underdog — ince oran-bandı haritası (60g, gap ≥ 0)
"Hangi bahis hangi oranda tutuyor" sorusunun kesin cevabı.
ms_envelope.py. drop-3/5 = en büyük 3/5 kazancı çıkarınca ROI (konsantrasyon/sağlamlık testi).
| Oran bandı | Bahis | Hit% | ROI | drop-3 ROI | Karar |
|---|---|---|---|---|---|
| 6.0 – 6.5 | 469 | %22.0 | +%37.7 | +%34.4 | ✅ elit |
| 6.0 – 7.0 | 492 | %21.5 | +%35.2 | +%29.9 | ✅ elit, sağlam |
| 6.0 – 7.5 (premium) | 645 | %20.0 | +%29.3 | +%24.4 | ✅ ÖNERİLEN |
| 6.0 – 8.0 | 928 | %17.7 | +%19.1 | +%15.5 | ✅ hacim opsiyonu |
| 7.5 – 8.0 | 283 | %12.4 | −%4.0 | — | ❌ |
| 8.0 – 9.0 | 78 | %9.0 | −%25.7 | — | ❌ longshot |
| 9.0+ | ~266 | <%10 | negatif | — | ❌ mezarlık |
| 5.0 – 6.0 (strong) | ~1000 | %18 | ~−%1 | — | ⚠️ başabaş → WATCH |
| 3.0 – 5.0 (standard) | ~5745 | %27 | +%0.5 | — | ⚠️ başabaş → WATCH |
Korumalı premium (htft/disagreement vetoları uygulanmış) = staked set: 602 bahis · %20.6 hit · +%32.7 ROI · +39.4u · 6/6 hafta pozitif · OOS +%47.4.
Okuma: Edge tamamen 6.0–7.5 bandında. 8.0 üstü longshot'lar kaybeder (eski 6.0–50.0 premium tier'ı bu yüzden sulandırıyordu). 5.0 altı başabaş. Premium tek başına ~14 bahis/gün = hem hacim hem +%32.7 ROI.
❌ İşe YARAMAYAN yapılandırmalar
- Kombine (parlay): her ek bacak ROI'yi çökertir (yukarıdaki TL;DR).
- MS 8.0+ longshot: −%10..−26 ROI, model edge'i yok.
- MS 5.0–6.0 / 3.0–5.0: başabaş; WATCH olarak göster, stake'leme.
- OU25 her konfigürasyon: sistematik kayıp (60g'de OU25 −%22.8, OU35 −%17.2).
- BTTS: sadece çok yüksek reliability'de marjinal.
4. KRİTİK KURAL — Tekli Bahis, Kombine Yok
| Kupon tipi | Hit% | ROI | Sonuç |
|---|---|---|---|
| 1-leg (tekli) | ~%24 | +%3.4 | ✅ |
| 2-leg | düşük | −%32.4 | ❌ |
| 3-leg | çok düşük | −%66.6 | ❌ |
| 4-leg | minimal | −%83.0 | ❌ |
Neden: Tekil bacaklar yalnızca marjinal +EV. Kombine, kazanma olasılıklarını çarparken (her biri <1) kayıp olasılığını üssel büyütür. Düz (flat) tekli stake matematiksel olarak üstündür. Ürün, kullanıcıyı kombineye teşvik etmemeli; "günün premium tekli değerleri" şeklinde sunmalı.
5. Önerilen Stake Politikası
- Flat stake (sabit birim) — Kelly değil. Marjinal edge'de Kelly varyansı patlatır.
- premium (A): 0.5u sabit (
VALUE_TIER_STAKE_UNITS). ~%20 hit + uzun kayıp serileri (60g'de en uzun 35 ardışık kayıp) nedeniyle KÜÇÜK tutulur — kâr frekanstan gelir, bahis başı büyüklükten değil. Bankroll/risk iştahı izin veriyorsa artırılabilir. - strong/standard WATCH = stake YOK (görünür ama oynanmaz).
- Günlük/maç başına 1 sinyal; aynı maça birden çok tier'dan bahis = korelasyon riski, en yüksek value_tier'ı seç.
- Drawdown uyarısı: 0.5u'da en kötü tarihsel düşüş ≈ −34u; 35 ardışık kayıp mümkün. Bu bir maraton stratejisidir — kısa vadeli sonuçlara göre stake değiştirme.
6. Backtest Metodolojisi & Leakage Disiplini ⚠️
En kritik bölüm. Backtest sayıları yanlış yorumlanırsa sistem kârlı sanılıp kaybettirir.
6.1 Komut
# Konteyner içinde:
python scripts/diagnostic_backtest_multi.py --days 60 --max-matches 10000 \
--progress-interval 100 --checkpoint-every 200
# Çıktı: reports/multi_backtest_YYYYMMDD.{csv,json,txt}
# Checkpoint'li → kesilirse kaldığı yerden devam eder.
6.2 Lookahead / Sızıntı (leakage) kontrolü — ZORUNLU
- Feature lookahead: ✅ temiz — feature'lar match_date ÖNCESİ veriden hesaplanıyor.
- Model eğitim-seti üyeliği: Bunu HER ZAMAN kontrol et. Kalibratörler
models/calibration/*_metrics.jsoniçindekilast_trainedtarihinde, son ~5000 maç üzerinde fit edilir. Backtest penceresi bu tarihle çakışırsa calibrated_confidence in-sample (şişik) olur. - Pratik test (ucuz): Backtest sonucunu eğitim kesim tarihine göre ikiye böl;
in-sample vs out-of-sample hit% karşılaştır. Tüm-market hit% neredeyse aynıysa
(örn. %49.7 vs %49.4) → temel modellerde anlamlı sızıntı YOK, edge gerçek.
Eski veride hit% aniden yükseliyorsa → o dönem eğitim setinde, ROI'yi yok say.
- Hazır script:
/tmp/leakage_split.py <csv>(eğitim tarihine göre böler).
- Hazır script:
- Geriye doğru ne kadar gidilebilir? Modeller en son holdout penceresini (≈son 10k maç ≈ 60-70 gün) eğitimden hariç tutuyor. Bu yüzden ~60 gün geriye backtest çoğunlukla temiz holdout'tur. Daha geriye (90+ gün) gitmek eğitim setine girip ROI'yi yapay iyi gösterebilir → kaçın.
6.3 Doğrulama scriptleri
/tmp/v31c_validation.py <csv>— V31c tier dökümü (premium/strong/standard ROI)./tmp/best_bet_values.py <csv>— grid-search liderlik tablosu + portföy + kombine testi./tmp/leakage_split.py <csv>— in/out-of-sample sızıntı probu.
6.4 Doğrulama eşiği (bir tier "kârlı" sayılmadan önce)
- n ≥ 50 bahis (tercihen ≥ 200), out-of-sample.
- ROI > 0 hem in- hem out-of-sample'da, ya da en azından OOS'ta çökmemiş.
- Kümülatif kâr eğrisi yukarı trend (tek bir şanslı güne bağlı değil).
7. Operasyonel Döngü (Cadence)
Günlük
- Motor sağlık kontrolü (futbol pipeline çalışıyor mu; basketbol
readiness_summaryhatası bilinen/zararsız). - Günün sinyallerini üret; premium (A) tekli değerleri öne çıkar.
- Settle olan dünün bahislerini logla (gerçek hit/ROI takibi).
Haftalık
- Son 7-14 günün gerçek sonuçlarını backtest tahminiyle karşılaştır (calibration drift).
- Tier bazında gerçekleşen ROI'yi izle; standard (C) sürekli negatifse eşik sıkılaştır.
Aylık
- Modelleri yeniden eğit (Colab:
extract_training_data_v27.py→ eğitim →fetch_xgb_models.sh). - Yeniden eğitimden sonra MUTLAKA 60 günlük backtest + leakage_split ile yeniden doğrula.
- Tier eşiklerini güncelle (Bölüm 8).
models/calibration/*_metrics.jsonlast_trainedtarihini not et (bir sonraki backtest'in OOS penceresini bilmek için).
8. Tier / Eşik Güncelleme Protokolü
- Yeni backtest CSV'sini al →
v31c_validation.py+leakage_split.pyçalıştır. - Her tier için OOS ROI'ye bak:
- ROI sağlam pozitif + n yeterli → koru.
- ROI marjinal/negatif → oran bandını daralt veya min_reliability/min_model_gap yükselt.
- premium 6.0+ eşiği: OOS'ta hâlâ en iyi ROI mi? Değilse bandı kaydır (örn. 6.5+).
betting_brain.py→MARKET_ODDS_TIERSdüzenle, versiyon string'ini artır (judge-v31c-…→judge-v31d-…).- Lokal syntax kontrol → sunucuya deploy (Bölüm 9) → yeniden doğrula.
- Tier'lar netleştikten SONRA
value_tier'ı UI'a yay (BE smart-coupon → FE badge → mobil).
9. Deploy Prosedürü (AI Engine)
# 1. Lokal syntax kontrol
python3 -c "import ast; ast.parse(open('services/betting_brain.py').read())"
# 2. Sunucuya kopyala (SSH: port 2222, kullanıcı haruncan)
scp -P 2222 services/betting_brain.py haruncan@<host>:/tmp/betting_brain.py
# 3. Konteynere koy + import testi
docker cp /tmp/betting_brain.py iddaai-ai-engine:/app/services/betting_brain.py
docker exec iddaai-ai-engine python -c "from services.betting_brain import BettingBrain; print('OK')"
# 4. Yeniden başlat + doğrula
docker restart iddaai-ai-engine
docker exec iddaai-ai-engine python -c "from services.betting_brain import BettingBrain as B; \
print([t['value_tier'] for t in B().MARKET_ODDS_TIERS['MS']])"
Not: Port 8000 host-localhost'a expose DEĞİL; sağlık testini konteyner içinden veya Docker network üzerinden yap. Basketbol
readiness_summaryhatası bilinen, bloklamıyor.
10. Bilinen Sınırlamalar & Uyarılar
- Kalibrasyon şişmesi: BTTS / OU25 izotonik kalibratörleri olasılığı %10-15 fazla
gösteriyor (overcalibrated). Bu marketlerde ekrandaki
calibrated_confidence'e tam güvenme; bahis kararı zaten ham-probmodel_gap/ev_edgeile veriliyor. - Out-of-sample örneklem küçük: Eğitim kesim tarihinden sonraki temiz pencere dar olabilir (~200 MS bahsi). İstatistiksel kesinlik için ileriye doğru gerçek sonuç biriktir (paper-trade) veya 60 günlük holdout backtest kullan.
- standard (C) tier kırılgan: in-sample +%0.4, küçük OOS örnekte negatife düşebiliyor. Hacim için var; ROI garantisi değil.
- Tek pencere overfit riski: Tek bir sezon/dönem penceresine göre ayar yapma; farklı lig/sezon çeşitliliği ara.
- Basketbol:
BasketballV25Predictor.readiness_summaryeksik — futbolu etkilemiyor, ayrı düzeltilecek.
11. Hızlı Komut Referansı
# 60 günlük backtest (konteyner içi)
python scripts/diagnostic_backtest_multi.py --days 60 --max-matches 10000
# Doğrulama (CSV lokale çekildikten sonra)
python3 /tmp/v31c_validation.py reports/multi_backtest_YYYYMMDD.csv
python3 /tmp/best_bet_values.py reports/multi_backtest_YYYYMMDD.csv
python3 /tmp/leakage_split.py reports/multi_backtest_YYYYMMDD.csv
# Kalibratör eğitim tarihleri
grep -o '"last_trained":[^,]*' models/calibration/*.json