Spaces:
Sleeping
Sleeping
| """ | |
| Data fetching module using yfinance. | |
| Provides OHLCV data for given ticker and date range. | |
| """ | |
| import yfinance as yf | |
| import pandas as pd | |
| from datetime import datetime | |
| def fetch_ohlcv( | |
| ticker: str, | |
| start: str, | |
| end: str, | |
| interval: str = "1d" | |
| ) -> pd.DataFrame: | |
| """ | |
| Fetch OHLCV data from Yahoo Finance. | |
| Args: | |
| ticker: Stock/crypto ticker symbol (e.g., "AAPL", "BTC-USD") | |
| start: Start date in YYYY-MM-DD format | |
| end: End date in YYYY-MM-DD format | |
| interval: Data interval - "1m", "5m", "15m", "1h", "1d", "1wk", "1mo" | |
| Returns: | |
| pd.DataFrame with columns: Open, High, Low, Close, Volume | |
| """ | |
| try: | |
| asset = yf.Ticker(ticker) | |
| try: | |
| df = asset.history(start=start, end=end, interval=interval) | |
| except Exception: | |
| df = pd.DataFrame() | |
| if df.empty: | |
| raise ValueError(f"No data found for {ticker} in range {start} to {end}") | |
| # Standardize column names | |
| df.index.name = "Date" | |
| df = df[["Open", "High", "Low", "Close", "Volume"]] | |
| # Remove timezone info from index for JSON compat | |
| if df.index.tz is not None: | |
| df.index = df.index.tz_localize(None) | |
| return df | |
| except Exception as e: | |
| raise RuntimeError(f"Failed to fetch data for {ticker}: {str(e)}") | |