Spaces:
Runtime error
Runtime error
| yf_docs = """ | |
| # YFinance Documentation | |
| ## Single Ticker Usage | |
| ```python | |
| import yfinance as yf | |
| ticker = yf.Ticker('MSFT') | |
| ``` | |
| ## Multi-Ticker Usage | |
| ### Initialization | |
| ```python | |
| import yfinance as yf | |
| tickers = yf.Tickers('MSFT AAPL GOOG') | |
| ``` | |
| ### Download Historical Data | |
| Get historical market data for multiple tickers: | |
| ```python | |
| # Method 1: Using Tickers object | |
| tickers = yf.Tickers('MSFT AAPL GOOG') | |
| data = tickers.download(period='1mo') | |
| # Method 2: Using download function directly | |
| data = yf.download(['MSFT', 'AAPL', 'GOOG'], period='1mo') | |
| ``` | |
| Returns: | |
| ```python | |
| DataFrame with columns: [('Close', 'AAPL'), ('Close', 'GOOG'), ('Close', 'MSFT'), ('Dividends', 'AAPL'), ('Dividends', 'GOOG'), ('Dividends', 'MSFT'), ('High', 'AAPL'), ('High', 'GOOG'), ('High', 'MSFT'), ('Low', 'AAPL'), ('Low', 'GOOG'), ('Low', 'MSFT'), ('Open', 'AAPL'), ('Open', 'GOOG'), ('Open', 'MSFT'), ('Stock Splits', 'AAPL'), ('Stock Splits', 'GOOG'), ('Stock Splits', 'MSFT'), ('Volume', 'AAPL'), ('Volume', 'GOOG'), ('Volume', 'MSFT')] | |
| Shape: (21, 21) | |
| ``` | |
| ### News | |
| Get news for multiple tickers: | |
| ```python | |
| tickers = yf.Tickers('MSFT AAPL GOOG') | |
| news = tickers.news() | |
| ``` | |
| Returns: | |
| ```python | |
| - MSFT: list | |
| - AAPL: list | |
| - GOOG: list | |
| ``` | |
| ### Accessing Individual Tickers | |
| Access individual ticker data from a multi-ticker object: | |
| ```python | |
| tickers = yf.Tickers('MSFT AAPL GOOG') | |
| msft_info = tickers.tickers['MSFT'].info | |
| aapl_history = tickers.tickers['AAPL'].history(period='1mo') | |
| ``` | |
| ## Single Ticker Methods | |
| ### Info | |
| ```python | |
| ticker.info | |
| ``` | |
| Returns: | |
| ```python | |
| - address1: str | |
| - city: str | |
| - state: str | |
| - zip: str | |
| - country: str | |
| - phone: str | |
| - website: str | |
| - industry: str | |
| - industryKey: str | |
| - industryDisp: str | |
| - sector: str | |
| - sectorKey: str | |
| - sectorDisp: str | |
| - longBusinessSummary: str | |
| - fullTimeEmployees: int | |
| - companyOfficers: list | |
| - auditRisk: int | |
| - boardRisk: int | |
| - compensationRisk: int | |
| - shareHolderRightsRisk: int | |
| - overallRisk: int | |
| - governanceEpochDate: int | |
| - compensationAsOfEpochDate: int | |
| - irWebsite: str | |
| - maxAge: int | |
| - priceHint: int | |
| - previousClose: float | |
| - open: float | |
| - dayLow: float | |
| - dayHigh: float | |
| - regularMarketPreviousClose: float | |
| - regularMarketOpen: float | |
| - regularMarketDayLow: float | |
| - regularMarketDayHigh: float | |
| - dividendRate: float | |
| - dividendYield: float | |
| - exDividendDate: int | |
| - payoutRatio: float | |
| - fiveYearAvgDividendYield: float | |
| - beta: float | |
| - trailingPE: float | |
| - forwardPE: float | |
| - volume: int | |
| - regularMarketVolume: int | |
| - averageVolume: int | |
| - averageVolume10days: int | |
| - averageDailyVolume10Day: int | |
| - bid: float | |
| - ask: float | |
| - bidSize: int | |
| - askSize: int | |
| - marketCap: int | |
| - fiftyTwoWeekLow: float | |
| - fiftyTwoWeekHigh: float | |
| - priceToSalesTrailing12Months: float | |
| - fiftyDayAverage: float | |
| - twoHundredDayAverage: float | |
| - currency: str | |
| - enterpriseValue: int | |
| - profitMargins: float | |
| - floatShares: int | |
| - sharesOutstanding: int | |
| - sharesShort: int | |
| - sharesShortPriorMonth: int | |
| - sharesShortPreviousMonthDate: int | |
| - dateShortInterest: int | |
| - sharesPercentSharesOut: float | |
| - heldPercentInsiders: float | |
| - heldPercentInstitutions: float | |
| - shortRatio: float | |
| - shortPercentOfFloat: float | |
| - impliedSharesOutstanding: int | |
| - bookValue: float | |
| - priceToBook: float | |
| - lastFiscalYearEnd: int | |
| - nextFiscalYearEnd: int | |
| - mostRecentQuarter: int | |
| - earningsQuarterlyGrowth: float | |
| - netIncomeToCommon: int | |
| - trailingEps: float | |
| - forwardEps: float | |
| - lastSplitFactor: str | |
| - lastSplitDate: int | |
| - enterpriseToRevenue: float | |
| - enterpriseToEbitda: float | |
| - 52WeekChange: float | |
| - SandP52WeekChange: float | |
| - lastDividendValue: float | |
| - lastDividendDate: int | |
| - exchange: str | |
| - quoteType: str | |
| - symbol: str | |
| - underlyingSymbol: str | |
| - shortName: str | |
| - longName: str | |
| - firstTradeDateEpochUtc: int | |
| - timeZoneFullName: str | |
| - timeZoneShortName: str | |
| - uuid: str | |
| - messageBoardId: str | |
| - gmtOffSetMilliseconds: int | |
| - currentPrice: float | |
| - targetHighPrice: float | |
| - targetLowPrice: float | |
| - targetMeanPrice: float | |
| - targetMedianPrice: float | |
| - recommendationMean: float | |
| - recommendationKey: str | |
| - numberOfAnalystOpinions: int | |
| - totalCash: int | |
| - totalCashPerShare: float | |
| - ebitda: int | |
| - totalDebt: int | |
| - quickRatio: float | |
| - currentRatio: float | |
| - totalRevenue: int | |
| - debtToEquity: float | |
| - revenuePerShare: float | |
| - returnOnAssets: float | |
| - returnOnEquity: float | |
| - grossProfits: int | |
| - freeCashflow: int | |
| - operatingCashflow: int | |
| - earningsGrowth: float | |
| - revenueGrowth: float | |
| - grossMargins: float | |
| - ebitdaMargins: float | |
| - operatingMargins: float | |
| - financialCurrency: str | |
| - trailingPegRatio: float | |
| ``` | |
| ### History | |
| ```python | |
| ticker.history(period='1mo') | |
| ``` | |
| Returns: | |
| ```python | |
| DataFrame with columns: ['Open', 'High', 'Low', 'Close', 'Volume', 'Dividends', 'Stock Splits'] | |
| Shape: (21, 7) | |
| ``` | |
| ### Financial Statements | |
| #### Income Statement | |
| ```python | |
| ticker.income_stmt | |
| ``` | |
| Returns: | |
| ```python | |
| DataFrame with columns: [Timestamp('2024-06-30 00:00:00'), Timestamp('2023-06-30 00:00:00'), Timestamp('2022-06-30 00:00:00'), Timestamp('2021-06-30 00:00:00')] | |
| Shape: (47, 4) | |
| ``` | |
| ## Common Parameters | |
| ### Period Options | |
| - `1d`: 1 day | |
| - `5d`: 5 days | |
| - `1mo`: 1 month | |
| - `3mo`: 3 months | |
| - `6mo`: 6 months | |
| - `1y`: 1 year | |
| - `2y`: 2 years | |
| - `5y`: 5 years | |
| - `10y`: 10 years | |
| - `ytd`: Year to date | |
| - `max`: Maximum available data | |
| ### Interval Options | |
| - `1m`: 1 minute | |
| - `2m`: 2 minutes | |
| - `5m`: 5 minutes | |
| - `15m`: 15 minutes | |
| - `30m`: 30 minutes | |
| - `60m`: 60 minutes | |
| - `90m`: 90 minutes | |
| - `1h`: 1 hour | |
| - `1d`: 1 day | |
| - `5d`: 5 days | |
| - `1wk`: 1 week | |
| - `1mo`: 1 month | |
| - `3mo`: 3 months | |
| #### | |
| In dealing with financial data from multiple tickers, specifically using yfinance and pandas, the process can be broken down into a few key steps: downloading the data, organizing it in a structured format, and accessing it in a way that aligns with the user's needs. Below, the answer is organized into clear, actionable segments. | |
| Downloading Data for Multiple Tickers | |
| Direct Download and DataFrame Creation | |
| Single Ticker, Single DataFrame Approach: | |
| For individual tickers, the DataFrame downloaded directly from yfinance comes with single-level column names but lacks a ticker column. By iterating over each ticker, adding a ticker column, and then combining these into a single DataFrame, a clear structure for each ticker's data is maintained. | |
| import yfinance as yf | |
| import pandas as pd | |
| tickerStrings = ['AAPL', 'MSFT'] | |
| df_list = [] | |
| for ticker in tickerStrings: | |
| data = yf.download(ticker, group_by="Ticker", period='2d') | |
| data['ticker'] = ticker # Add ticker column | |
| df_list.append(data) | |
| # Combine all dataframes into a single dataframe | |
| df = pd.concat(df_list) | |
| df.to_csv('ticker.csv') | |
| Condensed Single DataFrame Approach: | |
| Achieve the same result as above with a one-liner using list comprehension, streamlining the process of fetching and combining data. | |
| # Download 2 days of data for each ticker in tickerStrings, add a 'ticker' column for identification, and concatenate into a single DataFrame with continuous indexing. | |
| df = pd.concat([yf.download(ticker, group_by="Ticker", period='2d').assign(ticker=ticker) for ticker in tickerStrings], ignore_index=True) | |
| Multi-Ticker, Structured DataFrame Approach | |
| When downloading data for multiple tickers simultaneously, yfinance groups data by ticker, resulting in a DataFrame with multi-level column headers. This structure can be reorganized for easier access. | |
| Unstacking Column Levels: | |
| # Define a list of ticker symbols to download | |
| tickerStrings = ['AAPL', 'MSFT'] | |
| # Download 2 days of data for each ticker, grouping by 'Ticker' to structure the DataFrame with multi-level columns | |
| df = yf.download(tickerStrings, group_by='Ticker', period='2d') | |
| # Transform the DataFrame: stack the ticker symbols to create a multi-index (Date, Ticker), then reset the 'Ticker' level to turn it into a column | |
| df = df.stack(level=0).rename_axis(['Date', 'Ticker']).reset_index(level=1) | |
| Handling CSV Files with Multi-Level Column Names | |
| To read a CSV file that has been saved with yfinance data (which often includes multi-level column headers), adjustments are necessary to ensure the DataFrame is accessible in the desired format. | |
| Reading and Adjusting Multi-Level Columns: | |
| # Read the CSV file. The file has multi-level headers, hence header=[0, 1]. | |
| df = pd.read_csv('test.csv', header=[0, 1]) | |
| # Drop the first row as it contains only the Date information in one column, which is redundant after setting the index. | |
| df.drop(index=0, inplace=True) | |
| # Convert the 'Unnamed: 0_level_0', 'Unnamed: 0_level_1' column (which represents dates) to datetime format. | |
| # This assumes the dates are in the 'YYYY-MM-DD' format. | |
| df[('Unnamed: 0_level_0', 'Unnamed: 0_level_1')] = pd.to_datetime(df[('Unnamed: 0_level_0', 'Unnamed: 0_level_1')]) | |
| # Set the datetime column as the index of the DataFrame. This makes time series analysis more straightforward. | |
| df.set_index(('Unnamed: 0_level_0', 'Unnamed: 0_level_1'), inplace=True) | |
| # Clear the name of the index to avoid confusion, as it previously referred to the multi-level column names. | |
| df.index.name = None | |
| Flattening Multi-Level Columns for Easier Access | |
| Depending on the initial structure of the DataFrame, multi-level columns many need to be flattened to a single level, adding clarity and simplicity to the dataset. | |
| Flattening and Reorganizing Based on Ticker Level: | |
| For DataFrames where the ticker symbol is at the top level of the column headers: | |
| df.stack(level=0).rename_axis(['Date', 'Ticker']).reset_index(level=1) | |
| If the ticker symbol is at the bottom level: | |
| df.stack(level=1).rename_axis(['Date', 'Ticker']).reset_index(level=1) | |
| Individual Ticker File Management | |
| For those preferring to manage each ticker's data separately, downloading and saving each ticker's data to individual files can be a straightforward approach. | |
| Downloading and Saving Individual Ticker Data: | |
| for ticker in tickerStrings: | |
| # Downloads historical market data from Yahoo Finance for the specified ticker. | |
| # The period ('prd') and interval ('intv') for the data are specified as string variables. | |
| data = yf.download(ticker, group_by="Ticker", period='prd', interval='intv') | |
| # Adds a new column named 'ticker' to the DataFrame. This column is filled with the ticker symbol. | |
| # This step is helpful for identifying the source ticker when multiple DataFrames are combined or analyzed separately. | |
| data['ticker'] = ticker | |
| # Saves the DataFrame to a CSV file. The file name is dynamically generated using the ticker symbol, | |
| # allowing each ticker's data to be saved in a separate file for easy access and identification. | |
| # For example, if the ticker symbol is 'AAPL', the file will be named 'ticker_AAPL.csv'. | |
| data.tocsv(f'ticker{ticker}.csv') | |
| """ |