From 495ccfdee4b1e8317920b51d4d815c946b31b6d5 Mon Sep 17 00:00:00 2001 From: OpenSquared Date: Mon, 29 Jun 2026 11:48:52 +0200 Subject: [PATCH] feat: market event --- backend/routers/causal_lab.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/backend/routers/causal_lab.py b/backend/routers/causal_lab.py index d0f7260..d5a40bd 100644 --- a/backend/routers/causal_lab.py +++ b/backend/routers/causal_lab.py @@ -37,10 +37,11 @@ def _init(conn): # ── Récupération des prix autour d'un événement ─────────────────────────────── -def _fetch_prices(event_date_str: str, instruments: list[str]) -> dict: +def _fetch_prices(event_date_str: str, instruments: list[str], lag_days: int = 0) -> dict: """ Télécharge les prix autour de l'événement pour chaque instrument demandé. Retourne dict { instrument: [{"t": iso, "c": float}, ...] } + Si lag_days > 0, force le mode journalier (la fenêtre doit couvrir N jours après l'event). """ YFINANCE_MAP = { "EURUSD": "EURUSD=X", @@ -61,8 +62,8 @@ def _fetch_prices(event_date_str: str, instruments: list[str]) -> dict: event_dt = datetime.strptime(event_date_str[:10], "%Y-%m-%d") days_ago = (datetime.utcnow() - event_dt).days - # Intraday 5min (< 55 jours) pour les FX / actifs principaux - use_intraday = days_ago < 55 + # Intraday 5min (< 55 jours) sauf si lag_days > 0 (besoin fenêtre journalière étendue) + use_intraday = days_ago < 55 and lag_days == 0 for inst in instruments: sym = YFINANCE_MAP.get(inst) @@ -88,9 +89,9 @@ def _fetch_prices(event_date_str: str, instruments: list[str]) -> dict: out["mode"] = "intraday_5m" continue - # Fallback journalier + # Fallback journalier (ou mode forcé si lag_days > 0) start = (event_dt - timedelta(days=5)).strftime("%Y-%m-%d") - end = (event_dt + timedelta(days=5)).strftime("%Y-%m-%d") + end = (event_dt + timedelta(days=max(5, lag_days + 3))).strftime("%Y-%m-%d") df = yf.download(sym, start=start, end=end, interval="1d", progress=False, auto_adjust=True) if df is not None and len(df) > 0: @@ -934,7 +935,7 @@ def analyze_event(body: AnalyzeRequest): instruments = list(set(tmpl.get("instruments", []))) or ["EURUSD"] primary_inst = body.instrument or (instruments[0] if instruments else "EURUSD") - prices = _fetch_prices(event["start_date"], instruments) + prices = _fetch_prices(event["start_date"], instruments, lag_days=effective_lag_days) edate = event["start_date"][:10] actual_moves: dict = {}