Generated banner for Yfinance Data
Generated logo for Yfinance Data

Yfinance Data

Alex YangCommunityCreated by Alex Yang

  • Skill
  • Tool integration
  • Data and AI
  • MIT
  • Low risk

From the author

Fetch financial and market data with the yfinance Python library (Yahoo Finance). Use this skill whenever the user wants stock data: current quotes and price history, financial statements (income statement, balance sheet, cash flow), options chains, dividends and splits, earnings and analyst estimates, price targets and ratings, institutional and insider holdings, news, multi-ticker comparisons, stock screens, or sector and industry data. Use it even when the user gives only a ticker symbol (AAPL, MSFT, TSLA) and the intent has to be inferred. For earnings previews or recaps, estimate revisions, valuation, correlation, liquidity, or ETF premium analysis, prefer the dedicated skill.
— the description by Alex Yang

AutoGineer summary

Written by AutoGineer from the skill’s own files, not by the author

The yfinance-data skill provides a structured interface for retrieving financial and market data from Yahoo Finance. It enables users to access a wide range of information, including historical price data, financial statements, corporate actions, options chains, and analyst estimates. The skill is designed to integrate with Python environments, allowing for programmatic data extraction and analysis of stock market information.

What it does

  • Retrieves current stock quotes and historical price data.
  • Fetches financial statements including income statements, balance sheets, and cash flow.
  • Accesses corporate actions such as dividends and stock splits.
  • Provides options chain data, including calls and puts.
  • Retrieves analyst estimates, price targets, and institutional holdings.
  • Supports bulk data downloads for multi-ticker comparisons.

When to use it

  • When you need to perform research on stock market data.
  • When you require financial statement data for company analysis.
  • When you need to compare historical price performance across multiple tickers.
  • When you are building financial models that require external market data.

Advantages

  • Provides a standardized way to access diverse financial data points.
  • Supports both single-ticker lookups and bulk data downloads.
  • Integrates directly into Python workflows for automated data processing.
  • Includes methods for both annual and quarterly financial reporting data.

Usage examples

“Get the latest income statement for AAPL.”
The agent will use the yfinance library to fetch and display the annual income statement data for Apple Inc.
“Compare the historical price data for MSFT and TSLA over the last year.”
The agent will use yf.download to retrieve and present the historical price performance for both tickers for the requested period.

Install

  1. Download the skill as a ZIP:

    https://mp-staging.autogineer.com/agent-skills/himself65/yfinance-data/download
  2. Unzip it into the cross-client skills folder of your project:

    mkdir -p .agents/skills && unzip yfinance-data.zip -d .agents/skills

Documentation by Alex Yang

yfinance Data Skill

If your host has not already executed the shell probes below (for example, in Codex), run the commands inside the ! wrappers with its shell tool before choosing a setup path. Use the actual output; if shell access is unavailable, report that limitation.

Fetches financial and market data from Yahoo Finance using the yfinance Python library.

Important: yfinance is not affiliated with Yahoo, Inc. Data is for research and educational purposes.


Step 1: Ensure yfinance Is Available

Current environment status:

!`python3 -c "exec('try:\n import yfinance\n print(\'yfinance \' + yfinance.__version__ + \' installed\')\nexcept Exception:\n print(\'YFINANCE_NOT_INSTALLED\')')"`

If YFINANCE_NOT_INSTALLED, install it before running any code:

import subprocess, sys
subprocess.check_call([sys.executable, "-m", "pip", "install", "-q", "yfinance"])

If yfinance is already installed, skip the install step and proceed directly.


Step 2: Identify What the User Needs

Match the user's request to one or more data categories below, then use the corresponding code from references/api_reference.md.

User RequestData CategoryPrimary Method
Stock price, quoteCurrent priceticker.info or ticker.fast_info
Price history, chart dataHistorical OHLCVticker.history() or yf.download()
Balance sheetFinancial statementsticker.balance_sheet
Income statement, revenueFinancial statementsticker.income_stmt
Cash flowFinancial statementsticker.cashflow
DividendsCorporate actionsticker.dividends
Stock splitsCorporate actionsticker.splits
Options chain, calls, putsOptions dataticker.option_chain()
Earnings, EPSAnalysisticker.earnings_history
Analyst price targetsAnalysisticker.analyst_price_targets
Recommendations, ratingsAnalysisticker.recommendations
Upgrades/downgradesAnalysisticker.upgrades_downgrades
Institutional holdersOwnershipticker.institutional_holders
Insider transactionsOwnershipticker.insider_transactions
Company overview, sectorGeneral infoticker.info
Compare multiple stocksBulk downloadyf.download()
Screen/filter stocksScreeneryf.screen() + yf.EquityQuery
Sector/industry dataMarket datayf.Sector / yf.Industry
NewsNewsticker.news

Step 3: Write and Execute the Code

General pattern
import yfinance as yf

ticker = yf.Ticker("AAPL")
# ... use the appropriate method from the reference
Key rules
  1. Always wrap in try/except — Yahoo Finance may rate-limit or return empty data

  2. Use yf.download() for multi-ticker comparisons — it's faster with multi-threading

  3. For options, list expiration dates first with ticker.options before calling ticker.option_chain(date)

  4. For quarterly data, use quarterly_ prefix: ticker.quarterly_income_stmt, ticker.quarterly_balance_sheet, ticker.quarterly_cashflow

  5. For large date ranges, be mindful of intraday limits — 1m data only goes back ~7 days, 1h data ~730 days

  6. Print DataFrames clearly — use .to_string() or .to_markdown() for readability, or select key columns

  7. Timezone handling — yfinance returns tz-aware datetime indices (e.g., America/New_York). When comparing dates, always use pd.Timestamp(..., tz=...) or strip timezones with .tz_localize(None). See the reference file for details.

Valid periods and intervals
Periods1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max
Intervals1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo

Step 4: Present the Data

Answer with the numbers the user asked for first, then the supporting table (markdown, or a trimmed DataFrame with the key columns). Call out anything notable in the data — an earnings beat or miss, unusual volume, a dividend change — and add context such as sector averages, historical ranges, or analyst consensus where it changes how the numbers read. If the user wants a chart, pair the data with a visualization.


Reference Files

  • references/api_reference.md — Complete yfinance API reference with code examples for every data category

Read the reference file when you need exact method signatures or edge case handling.

Files

references/api_reference.md

yfinance API Reference

Complete reference for all yfinance data access methods.

Installation

pip install yfinance

Requires Python 3.8+. Dependencies (pandas, requests, etc.) are installed automatically.


Ticker Object

The primary interface for single-stock data.

import yfinance as yf
ticker = yf.Ticker("AAPL")

Historical Price Data

ticker.history()

Returns a DataFrame with columns: Open, High, Low, Close, Volume, Dividends, Stock Splits.

# Default: 1 month of daily data
hist = ticker.history(period="1mo")

# Specific date range
hist = ticker.history(start="2023-01-01", end="2023-12-31")

# Weekly data for 1 year
hist = ticker.history(period="1y", interval="1wk")

# Intraday 5-minute bars for last 5 days
hist = ticker.history(period="5d", interval="5m")

# Include pre/post market data
hist = ticker.history(period="5d", prepost=True)

# Repair price anomalies
hist = ticker.history(period="1mo", repair=True)

Valid periods: 1d, 5d, 1mo, 3mo, 6mo, 1y, 2y, 5y, 10y, ytd, max Valid intervals: 1m, 2m, 5m, 15m, 30m, 60m, 90m, 1h, 1d, 5d, 1wk, 1mo, 3mo

Intraday limits:

  • 1m: last ~7 days

  • 2m/5m/15m/30m: last ~60 days

  • 60m/90m/1h: last ~730 days

yf.download() — Bulk Download

Efficient multi-threaded download for multiple tickers.

data = yf.download(
    tickers="AAPL MSFT GOOGL AMZN",  # space or comma separated
    start="2023-01-01",
    end="2024-01-01",
    interval="1d",
    group_by="ticker",    # or "column" (default)
    auto_adjust=True,     # adjust for splits and dividends
    threads=True,         # multi-threading
    progress=True         # show progress bar
)

# Access a specific ticker
apple_close = data["AAPL"]["Close"]

# Download with dividends and splits
data = yf.download(["AAPL", "MSFT"], period="1y", actions=True)

# Additional options
data = yf.download(
    tickers=["TSLA", "NVDA"],
    period="6mo",
    interval="1h",
    repair=True,       # fix price anomalies
    keepna=False,      # remove NaN rows
    rounding=True,     # round to 2 decimals
    timeout=10         # request timeout seconds
)

Company Info

ticker.info

Returns a dictionary with company details, financials, and market data.

info = ticker.info

# Common fields
info['shortName']          # Company name
info['sector']             # e.g., "Technology"
info['industry']           # e.g., "Consumer Electronics"
info['marketCap']          # Market capitalization
info['currentPrice']       # Current stock price
info['previousClose']      # Previous close price
info['trailingPE']         # Trailing P/E ratio
info['forwardPE']          # Forward P/E ratio
info['dividendYield']      # Dividend yield
info['beta']               # Beta
info['fiftyTwoWeekHigh']   # 52-week high
info['fiftyTwoWeekLow']    # 52-week low
info['averageVolume']      # Average volume
info['longBusinessSummary'] # Company description
ticker.fast_info

Lightweight subset for quick price lookups (faster than .info).

fi = ticker.fast_info
fi['lastPrice']
fi['marketCap']
fi['fiftyDayAverage']
fi['twoHundredDayAverage']

Financial Statements

All return pandas DataFrames. Use quarterly_ prefix for quarterly data.

# Annual
ticker.income_stmt          # Income statement
ticker.balance_sheet        # Balance sheet
ticker.cashflow             # Cash flow statement

# Quarterly
ticker.quarterly_income_stmt
ticker.quarterly_balance_sheet
ticker.quarterly_cashflow

Corporate Actions

ticker.dividends            # Series of dividend payments
ticker.splits               # Series of stock splits
ticker.actions              # DataFrame with both dividends and splits
ticker.capital_gains        # Capital gains (for mutual funds/ETFs)

Options

# List available expiration dates
expirations = ticker.options   # tuple of date strings

# Get option chain for a specific expiration
opt = ticker.option_chain("2024-06-21")

# Calls and puts are separate DataFrames
calls = opt.calls
puts = opt.puts

# Key columns:
# strike, lastPrice, bid, ask, volume, openInterest, impliedVolatility,
# inTheMoney, contractSymbol, lastTradeDate, change, percentChange

Analysis & Estimates

# Analyst price targets
ticker.analyst_price_targets
# Returns dict: current, low, high, mean, median

# Recommendations (buy/hold/sell counts by period)
ticker.recommendations

# Upgrades and downgrades history
ticker.upgrades_downgrades
# Columns: firm, toGrade, fromGrade, action

# Earnings estimates
ticker.earnings_estimate
# Columns: numberOfAnalysts, avg, low, high, yearAgoEps, growth
# Index: 0q (current quarter), +1q, 0y, +1y

# Revenue estimates
ticker.revenue_estimate

# EPS trend
ticker.eps_trend

# EPS revisions
ticker.eps_revisions

# Growth estimates
ticker.growth_estimates

# Earnings history (actual vs estimate)
ticker.earnings_history
# Columns: epsEstimate, epsActual, epsDifference, surprisePercent

# Sustainability / ESG scores
ticker.sustainability

Ownership

# Major holders summary
ticker.major_holders

# Top institutional holders
ticker.institutional_holders
# Columns: Holder, Shares, Date Reported, % Out, Value

# Mutual fund holders
ticker.mutualfund_holders

# Insider transactions
ticker.insider_transactions

# Insider roster
ticker.insider_roster_holders

# Shares outstanding over time
ticker.get_shares_full(start="2023-01-01", end="2023-12-31")

Calendar & Events

ticker.calendar
# Returns dict with upcoming earnings dates, dividends, etc.

News

ticker.news
# Returns list of dicts with: title, link, publisher, providerPublishTime, type

Multiple Tickers

tickers = yf.Tickers("AAPL MSFT GOOGL")

# Access individual tickers
tickers.tickers["AAPL"].info
tickers.tickers["MSFT"].history(period="1mo")

Screener & Equity Query

Build custom stock screens.

import yfinance as yf
from yfinance import EquityQuery

# Create a query
query = EquityQuery('and', [
    EquityQuery('gt', ['intradaymarketcap', 1_000_000_000]),   # market cap > $1B
    EquityQuery('lt', ['peratio.lasttwelvemonths', 20]),       # trailing P/E < 20
    EquityQuery('eq', ['sector', 'Technology']),               # tech sector
    EquityQuery('eq', ['region', 'us']),
])

# Run the screen — returns a dict; matches are in result["quotes"]
result = yf.screen(query, size=25, sortField='intradaymarketcap', sortAsc=False)
symbols = [q['symbol'] for q in result.get('quotes', [])]

# Operators: eq, gt, lt, gte, lte, btwn, is_in
# EquityQuery validates field names and raises ValueError on unknown ones
# (e.g. 'marketcap' and 'peratio' are invalid; use 'intradaymarketcap' and
# 'peratio.lasttwelvemonths'). yf.screen also accepts predefined screen names
# such as 'day_gainers'.

Sector & Industry

# Sector data
tech = yf.Sector("technology")
tech.overview
tech.industries    # DataFrame of industries in this sector

# Industry data
semiconductors = yf.Industry("semiconductors")
semiconductors.overview
semiconductors.top_companies

# Valid sector keys:
# basic-materials, communication-services, consumer-cyclical,
# consumer-defensive, energy, financial-services, healthcare,
# industrials, real-estate, technology, utilities

search = yf.Search("Tesla")
search.quotes    # matching ticker quotes
search.news      # related news articles

Timezone Handling

yfinance returns tz-aware datetime indices (typically America/New_York). When filtering or comparing dates, you must match timezone awareness to avoid TypeError: Cannot compare tz-naive and tz-aware datetime-like objects.

import yfinance as yf
import pandas as pd

hist = yf.Ticker("AAPL").history(period="1y")

# WRONG — tz-naive timestamp vs tz-aware index:
# filtered = hist[hist.index >= pd.Timestamp("2025-01-01")]  # TypeError!

# Option A (recommended): make the comparison timestamp tz-aware
start = pd.Timestamp("2025-01-01", tz="America/New_York")
filtered = hist[hist.index >= start]

# Option B: strip timezone from index first
hist.index = hist.index.tz_localize(None)
filtered = hist[hist.index >= pd.Timestamp("2025-01-01")]

Always use Option A when you need to preserve timezone info for accurate date boundaries. Use Option B when timezone doesn't matter (e.g., daily data aggregation).


Error Handling

import yfinance as yf

try:
    ticker = yf.Ticker("AAPL")
    hist = ticker.history(period="1mo")
    if hist.empty:
        print("No data returned — check ticker symbol or date range")
    else:
        print(hist)
except Exception as e:
    print(f"Error fetching data: {e}")

Common issues:

  • Empty DataFrame: Invalid ticker, delisted stock, or date range outside available data

  • Rate limiting: Too many requests in short time — add delays between calls

  • Missing fields in .info: Not all fields are available for all tickers (ETFs, mutual funds, foreign stocks may differ)

  • Intraday data limits: 1m data only available for last ~7 days

  • Timezone mismatch: See "Timezone Handling" section above — always match tz-awareness when comparing dates

Requirements and compatibility

Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta

“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.

Needs: Needs Python

Security

What our scanner noticed· Low risk

  • Instructions that use the network

A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.

Attribution and licence

Created by
Alex Yang
Publisher
Alex Yang (Community)
Source
himself65/finance-skills · plugins/market-analysis/skills/yfinance-data · commit a085078
Licence
MIT License (redistribution allowed)
  • LICENSE (added by AutoGineer from LICENSE)
  • ATTRIBUTION.md (written by AutoGineer)
Synced

AutoGineer is not affiliated with or endorsed by Alex Yang.

Download ZIP

The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download yfinance-data.zip