68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
"""
|
||
National-Team League Loader + Competition-Type Classifier
|
||
=========================================================
|
||
Loads the A-milli (senior men's) football league IDs from
|
||
data/national_leagues.json and classifies a league name into a
|
||
competition type. Powers the betting_brain national-match gate.
|
||
|
||
Why this exists:
|
||
Backtest (2300 national matches) showed national matches behave very
|
||
differently from clubs — only the MS market carries edge, and only in
|
||
the 4.0–7.0 odds band for Hazırlık/Eleme fixtures (tournaments behave
|
||
inversely). Calibration is fine; the issue is *which* bets to allow.
|
||
See mds/national-team-strategy.md.
|
||
|
||
Usage:
|
||
from utils.national_leagues import load_national_leagues, classify_competition
|
||
natl = load_national_leagues() # set[str] of league_ids
|
||
ctype = classify_competition(name) # "HAZIRLIK" | "ELEME" | "TURNUVA"
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import json
|
||
import os
|
||
from typing import Set
|
||
|
||
|
||
_DATA_FILE = os.path.join(
|
||
os.path.dirname(os.path.abspath(__file__)),
|
||
"..",
|
||
"data",
|
||
"national_leagues.json",
|
||
)
|
||
|
||
|
||
def load_national_leagues() -> Set[str]:
|
||
"""Return the set of A-milli football league IDs (empty on any failure)."""
|
||
if not os.path.isfile(_DATA_FILE):
|
||
print(
|
||
f"⚠️ national_leagues.json not found at {_DATA_FILE}. "
|
||
"National-match gate disabled (no league treated as national)."
|
||
)
|
||
return set()
|
||
try:
|
||
with open(_DATA_FILE, "r", encoding="utf-8") as f:
|
||
data = json.load(f)
|
||
ids = set(str(x) for x in (data.get("league_ids") or []))
|
||
print(f"✅ Loaded {len(ids)} national-team league IDs")
|
||
return ids
|
||
except (json.JSONDecodeError, KeyError, TypeError) as exc:
|
||
print(f"⚠️ Failed to parse national_leagues.json: {exc}")
|
||
return set()
|
||
|
||
|
||
def classify_competition(league_name: str) -> str:
|
||
"""Map a league name to a competition type.
|
||
|
||
HAZIRLIK = friendlies, ELEME = qualifiers/play-offs, TURNUVA = finals/cups.
|
||
The backtest edge lives in HAZIRLIK+ELEME (MS, odds 4-7); TURNUVA is
|
||
handled conservatively (no bet) by the gate.
|
||
"""
|
||
n = (league_name or "").lower()
|
||
if "hazırlık" in n or "hazirlik" in n or "friendl" in n:
|
||
return "HAZIRLIK"
|
||
if "eleme" in n or "play-off" in n or "playoff" in n or "qualif" in n:
|
||
return "ELEME"
|
||
return "TURNUVA"
|