Download market data from Yahoo! Finance's API
Alternatives To Yfinance
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Yfinance10,713132775 days ago103November 18, 2023175apache-2.0Python
Download market data from Yahoo! Finance's API
Mplfinance3,02570a month ago37August 02, 2023144otherPython
Financial Markets Data Visualization using Matplotlib
Financetoolkit1,8062a month ago31November 06, 2023mitPython
Transparent and Efficient Financial Analysis
2 days ago18mitPython
简单易用的量化金融数据包(easy utility for getting financial market data of China)
Yahooquery66715a month ago42October 28, 202341mitPython
Python wrapper for an unofficial Yahoo Finance API
5 months ago3mitJavaScript
Finance application that provides more than 60 different alternative data to retail investors
416 years ago6March 03, 201733Python
Fetch stock quote data from Yahoo Finance
Ta Rs4654a year ago13June 26, 202110mitRust
Technical analysis library for Rust language
Trade Frame369
2 months agootherC++
C++ 17 based library (with sample applications) for testing equities, futures, etfs & options based automated trading ideas using DTN IQFeed real time data feed and Interactive Brokers (IB TWS API) for trade execution. Some support for Alpaca & Phemex. Notifications via Telegram [irc: Libra #tradeframe ]
Alpaca Py3231114 days ago30November 17, 202339apache-2.0Python
The Official Python SDK for Alpaca API
Alternatives To Yfinance
Select To Compare

Alternative Project Comparisons

Download market data from Yahoo! Finance's API


Yahoo!, Y!Finance, and Yahoo! finance are registered trademarks of Yahoo, Inc.

yfinance is not affiliated, endorsed, or vetted by Yahoo, Inc. It's an open-source tool that uses Yahoo's publicly available APIs, and is intended for research and educational purposes.

You should refer to Yahoo!'s terms of use (here, here, and here) for details on your rights to use the actual data downloaded. Remember - the Yahoo! finance API is intended for personal use only.

Python version PyPi version PyPi status PyPi downloads Travis-CI build status CodeFactor Star this repo Follow me on twitter

yfinance offers a threaded and Pythonic way to download market data from Yahoo! finance.

Check out this Blog post for a detailed tutorial with code examples.


Quick Start

The Ticker module

The Ticker module, which allows you to access ticker data in a more Pythonic way:

import yfinance as yf

msft = yf.Ticker("MSFT")

# get all stock info

# get historical market data
hist = msft.history(period="1mo")

# show meta information about the history (requires history() to be called first)

# show actions (dividends, splits, capital gains)
msft.capital_gains  # only for mutual funds & etfs

# show share count
msft.get_shares_full(start="2022-01-01", end=None)

# show financials:
# - income statement
# - balance sheet
# - cash flow statement
# see `Ticker.get_income_stmt()` for more options

# show holders

# Show future and historic earnings dates, returns at most next 4 quarters and last 8 quarters by default. 
# Note: If more are needed use msft.get_earnings_dates(limit=XX) with increased limit argument.

# show ISIN code - *experimental*
# ISIN = International Securities Identification Number

# show options expirations

# show news

# get option chain for specific expiration
opt = msft.option_chain('YYYY-MM-DD')
# data available via: opt.calls, opt.puts

If you want to use a proxy server for downloading data, use:

import yfinance as yf

msft = yf.Ticker("MSFT")

msft.history(..., proxy="PROXY_SERVER")
msft.option_chain(..., proxy="PROXY_SERVER")

Multiple tickers

To initialize multiple Ticker objects, use

import yfinance as yf

tickers = yf.Tickers('msft aapl goog')

# access each ticker using (example)

To download price history into one table:

import yfinance as yf
data = yf.download("SPY AAPL", period="1mo")

yf.download() and Ticker.history() have many options for configuring fetching and processing. Review the Wiki for more options and detail.


yfinance now uses the logging module to handle messages, default behaviour is only print errors. If debugging, use yf.enable_debug_mode() to switch logging to debug with custom formatting.

Smarter scraping

To use a custom requests session (for example to cache calls to the API or customize the User-agent header), pass a session= argument to the Ticker constructor.

import requests_cache
session = requests_cache.CachedSession('yfinance.cache')
session.headers['User-agent'] = 'my-program/1.0'
ticker = yf.Ticker('msft', session=session)
# The scraped response will be stored in the cache

Combine a requests_cache with rate-limiting to avoid triggering Yahoo's rate-limiter/blocker that can corrupt data.

from requests import Session
from requests_cache import CacheMixin, SQLiteCache
from requests_ratelimiter import LimiterMixin, MemoryQueueBucket
from pyrate_limiter import Duration, RequestRate, Limiter
class CachedLimiterSession(CacheMixin, LimiterMixin, Session):

session = CachedLimiterSession(
    limiter=Limiter(RequestRate(2, Duration.SECOND*5)),  # max 2 requests per 5 seconds

Managing Multi-Level Columns

The following answer on Stack Overflow is for How to deal with multi-level column names downloaded with yfinance?

  • yfinance returns a pandas.DataFrame with multi-level column names, with a level for the ticker and a level for the stock price data
    • The answer discusses:
      • How to correctly read the the multi-level columns after saving the dataframe to a csv with pandas.DataFrame.to_csv
      • How to download single or multiple tickers into a single dataframe with single level column names and a ticker column

pandas_datareader override

If your code uses pandas_datareader and you want to download data faster, you can "hijack" pandas_datareader.data.get_data_yahoo() method to use yfinance while making sure the returned data is in the same format as pandas_datareader's get_data_yahoo().

from pandas_datareader import data as pdr

import yfinance as yf
yf.pdr_override() # <== that's all it takes :-)

# download dataframe
data = pdr.get_data_yahoo("SPY", start="2017-01-01", end="2017-04-30")

Timezone cache store

When fetching price data, all dates are localized to stock exchange timezone. But timezone retrieval is relatively slow, so yfinance attemps to cache them in your users cache folder. You can direct cache to use a different location with set_tz_cache_location():

import yfinance as yf


Install yfinance using pip:

$ pip install yfinance --upgrade --no-cache-dir

Test new features by installing betas, provide feedback in corresponding Discussion:

$ pip install yfinance --upgrade --no-cache-dir --pre

To install yfinance using conda, see this.


Optional (if you want to use pandas_datareader)

Developers: want to contribute?

yfinance relies on community to investigate bugs and contribute code. Developer guide: https://github.com/ranaroussi/yfinance/discussions/1084

Legal Stuff

yfinance is distributed under the Apache Software License. See the LICENSE.txt file in the release for details.

AGAIN - yfinance is not affiliated, endorsed, or vetted by Yahoo, Inc. It's an open-source tool that uses Yahoo's publicly available APIs, and is intended for research and educational purposes. You should refer to Yahoo!'s terms of use (here, here, and here) for detailes on your rights to use the actual data downloaded.


Please drop me an note with any feedback you have.

Ran Aroussi

Popular Finance Projects
Popular Market Data Projects
Popular Economics Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Market Data
Stock Data
Financial Data
Yahoo Finance