Python 56.2%
TeX 43.7%
1"""Yahoo Finance client for market benchmark data."""23from __future__ import annotations45import pandas as pd6import yfinance as yf78from src.config import DATA_RAW_YAHOO, YAHOO_END, YAHOO_START, YAHOO_TICKERS9from src.utils import setup_logging1011logger = setup_logging("yahoo")121314def fetch_yahoo_data(15 tickers: list[str] | None = None,16 start: str | None = None,17 end: str | None = None,18) -> pd.DataFrame:19 """Fetch daily OHLCV data for all configured tickers. Save to CSV."""20 tickers = tickers or YAHOO_TICKERS21 start = start or YAHOO_START22 end = end or YAHOO_END2324 DATA_RAW_YAHOO.mkdir(parents=True, exist_ok=True)2526 all_frames: list[pd.DataFrame] = []2728 for ticker in tickers:29 try:30 logger.info("Fetching %s from Yahoo Finance", ticker)31 tk = yf.Ticker(ticker)32 df = tk.history(start=start, end=end, auto_adjust=True)33 if df.empty:34 logger.warning("No data returned for %s", ticker)35 continue36 df.index.name = "date"37 # Clean ticker name for filename (replace ^ and others)38 safe_name = ticker.replace("^", "").replace("-", "_")39 path = DATA_RAW_YAHOO / f"{safe_name}.csv"40 df.to_csv(path)41 logger.info("Saved %s (%d rows) to %s", ticker, len(df), path)42 all_frames.append(df.assign(ticker=ticker))43 except Exception as exc:44 logger.error("Failed to fetch %s: %s", ticker, exc)4546 if all_frames:47 combined = pd.concat(all_frames)48 combined.to_csv(DATA_RAW_YAHOO / "all_tickers.csv")49 logger.info("Saved combined dataset (%d rows)", len(combined))50 return combined5152 return pd.DataFrame()535455def fetch_all_yahoo_data() -> None:56 """Fetch all Yahoo data and save to data/raw/yahoo/."""57 logger.info("=== Starting Yahoo Finance data acquisition ===")58 fetch_yahoo_data()59 logger.info("=== Yahoo Finance data acquisition complete ===")60