# 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-tiers` > > **V31d 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ızca `playable` bayrağı değişir. --- ## 0. TL;DR — En Önemli 5 Kural 1. **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. 2. **Asıl kâr MS (1X2) underdog bölgesinde.** Oran ≥ 6.0 + model_gap ≥ 0 = en yüksek ROI. 3. **Hiçbir market mute edilmez.** Tier sistemi filtreler; gerçek ROI'ler görünür kalır (`MUTED_MARKETS = set()`). 4. **Kalibrasyon ≠ Bahis sinyali.** MS tier'ları ham model olasılığını kullanır (`model_gap`, `ev_edge`). İzotonik kalibratörler sadece ekrandaki `calibrated_confidence`'i etkiler (BTTS/OU25'te şişik — dikkat). 5. **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"]` premium `max_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 ```bash # 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.json` içindeki `last_trained` tarihinde, 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 ` (eğitim tarihine göre böler). - **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 ` — V31c tier dökümü (premium/strong/standard ROI). - `/tmp/best_bet_values.py ` — grid-search liderlik tablosu + portföy + kombine testi. - `/tmp/leakage_split.py ` — 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_summary` hatası 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.json` `last_trained` tarihini not et (bir sonraki backtest'in OOS penceresini bilmek için). --- ## 8. Tier / Eşik Güncelleme Protokolü 1. Yeni backtest CSV'sini al → `v31c_validation.py` + `leakage_split.py` çalıştır. 2. 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+). 3. `betting_brain.py` → `MARKET_ODDS_TIERS` düzenle, **versiyon string'ini artır** (`judge-v31c-…` → `judge-v31d-…`). 4. Lokal syntax kontrol → sunucuya deploy (Bölüm 9) → yeniden doğrula. 5. Tier'lar netleştikten SONRA `value_tier`'ı UI'a yay (BE smart-coupon → FE badge → mobil). --- ## 9. Deploy Prosedürü (AI Engine) ```bash # 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@:/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_summary` hatası 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-prob `model_gap`/`ev_edge` ile 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_summary` eksik — futbolu etkilemiyor, ayrı düzeltilecek. --- ## 11. Hızlı Komut Referansı ```bash # 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 ```