fix: unhashable dict dans context narrative + normalisation tickers EUR/USD pour VaR
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -905,7 +905,7 @@ NOUVELLES IDÉES GÉNÉRÉES CE CYCLE ({len(new_pattern_names)} patterns ajouté
|
|||||||
{_json.dumps(new_pattern_names, ensure_ascii=False)}
|
{_json.dumps(new_pattern_names, ensure_ascii=False)}
|
||||||
|
|
||||||
TOP 5 PATTERNS LES MIEUX SCORÉS MAINTENANT:
|
TOP 5 PATTERNS LES MIEUX SCORÉS MAINTENANT:
|
||||||
{_json.dumps([{{"name": s.get("geo_trigger","?"), "score": s.get("score"), "catalyst": s.get("key_catalyst","")[:80]}} for s in top_scored], ensure_ascii=False)}
|
{_json.dumps([{"name": s.get("geo_trigger","?"), "score": s.get("score"), "catalyst": s.get("key_catalyst","")[:80]} for s in top_scored], ensure_ascii=False)}
|
||||||
|
|
||||||
Ta tâche: Explique le RAISONNEMENT de ce cycle.
|
Ta tâche: Explique le RAISONNEMENT de ce cycle.
|
||||||
Pour chaque nouvelle idée générée:
|
Pour chaque nouvelle idée générée:
|
||||||
|
|||||||
@@ -53,17 +53,24 @@ def _bs_delta(S: float, K: float, T_days: float, sigma: float, opt_type: str, di
|
|||||||
|
|
||||||
def _fetch_returns(tickers: List[str], lookback: int) -> pd.DataFrame:
|
def _fetch_returns(tickers: List[str], lookback: int) -> pd.DataFrame:
|
||||||
"""Download historical daily returns via yfinance. Returns {} on failure."""
|
"""Download historical daily returns via yfinance. Returns {} on failure."""
|
||||||
|
from .database import _normalize_ticker
|
||||||
valid = [t for t in tickers if ":" not in t]
|
valid = [t for t in tickers if ":" not in t]
|
||||||
if not valid:
|
if not valid:
|
||||||
return pd.DataFrame()
|
return pd.DataFrame()
|
||||||
|
# Map raw → yfinance ticker; keep reverse map for column rename
|
||||||
|
yf_map = {t: _normalize_ticker(t) for t in valid}
|
||||||
|
yf_tickers = list(yf_map.values())
|
||||||
|
reverse = {v: k for k, v in yf_map.items()}
|
||||||
try:
|
try:
|
||||||
import yfinance as yf
|
import yfinance as yf
|
||||||
end = datetime.now()
|
end = datetime.now()
|
||||||
start = end - timedelta(days=lookback + 60)
|
start = end - timedelta(days=lookback + 60)
|
||||||
raw = yf.download(valid, start=start, end=end, progress=False, auto_adjust=True)
|
raw = yf.download(yf_tickers, start=start, end=end, progress=False, auto_adjust=True)
|
||||||
if raw.empty:
|
if raw.empty:
|
||||||
return pd.DataFrame()
|
return pd.DataFrame()
|
||||||
close = raw["Close"] if len(valid) > 1 else raw[["Close"]].rename(columns={"Close": valid[0]})
|
close = raw["Close"] if len(yf_tickers) > 1 else raw[["Close"]].rename(columns={"Close": yf_tickers[0]})
|
||||||
|
# Rename yfinance tickers back to original
|
||||||
|
close = close.rename(columns=reverse)
|
||||||
return close.pct_change().dropna().tail(lookback)
|
return close.pct_change().dropna().tail(lookback)
|
||||||
except Exception:
|
except Exception:
|
||||||
return pd.DataFrame()
|
return pd.DataFrame()
|
||||||
|
|||||||
Reference in New Issue
Block a user