从雅虎财经API下载市场数据
*** 重要法律免责声明 ***雅虎!、Y!Finance和雅虎财经是雅虎公司的注册商标。 yfinance与雅虎公司没有任何关联,也未经其认可或审核。它是一个开源工具,使用雅虎公开可用的API,旨在用于研究和教育目的。 关于您使用实际下载数据的权利详情,请参阅雅虎的使用条款 (这里、 这里和 这里)。请记住 - 雅虎财经API仅供个人使用。 |
yfinance提供了一种多线程且符合Python风格的方式来从雅虎财经下载市场数据。
→ 查看这篇博客文章,获取详细教程和代码示例。
安装
使用pip
安装yfinance
:
$ pip install yfinance --upgrade --no-cache-dir
要安装可选依赖,将optional
替换为:nospam
用于更智能的抓取,repair
用于价格修复,或nospam,repair
同时安装两者:
$ pip install "yfinance[optional]"
快速开始
Ticker模块
Ticker
模块允许您以更符合Python风格的方式访问股票数据:
import yfinance as yf
msft = yf.Ticker("MSFT")
# 获取所有股票信息
msft.info
# 获取历史市场数据
hist = msft.history(period="1mo")
# 显示历史数据的元信息(需要先调用history())
msft.history_metadata
# 显示公司行为(股息、拆分、资本利得)
msft.actions
msft.dividends
msft.splits
msft.capital_gains # 仅适用于共同基金和ETF
# 显示股票数量
msft.get_shares_full(start="2022-01-01", end=None)
# 显示财务报表:
# - 利润表
msft.income_stmt
msft.quarterly_income_stmt
# - 资产负债表
msft.balance_sheet
msft.quarterly_balance_sheet
# - 现金流量表
msft.cashflow
msft.quarterly_cashflow
# 查看`Ticker.get_income_stmt()`了解更多选项
# 显示持股人
msft.major_holders
msft.institutional_holders
msft.mutualfund_holders
msft.insider_transactions
msft.insider_purchases
msft.insider_roster_holders
msfs.sustainability
# 显示推荐
msft.recommendations
msft.recommendations_summary
msft.upgrades_downgrades
# 显示未来和历史盈利日期,默认最多返回未来4个季度和过去8个季度。
# 注意:如果需要更多,请使用msft.get_earnings_dates(limit=XX)并增加limit参数。
msft.earnings_dates
# 显示ISIN代码 - *实验性功能*
# ISIN = 国际证券识别码
msft.isin
# 显示期权到期日
msft.options
# 显示新闻
msft.news
# 获取特定到期日的期权链
opt = msft.option_chain('YYYY-MM-DD')
# 可通过以下方式获取数据:opt.calls, opt.puts
如果你想使用代理服务器下载数据,请使用:
import yfinance as yf
msft = yf.Ticker("MSFT")
msft.history(..., proxy="代理服务器")
msft.get_actions(proxy="代理服务器")
msft.get_dividends(proxy="代理服务器")
msft.get_splits(proxy="代理服务器")
msft.get_capital_gains(proxy="代理服务器")
msft.get_balance_sheet(proxy="代理服务器")
msft.get_cashflow(proxy="代理服务器")
msft.option_chain(..., proxy="代理服务器")
...
多个股票代码
要初始化多个Ticker
对象,请使用
import yfinance as yf
tickers = yf.Tickers('msft aapl goog')
# 访问每个股票代码(示例)
tickers.tickers['MSFT'].info
tickers.tickers['AAPL'].history(period="1mo")
tickers.tickers['GOOG'].actions
要将价格历史下载到一个表格中:
import yfinance as yf
data = yf.download("SPY AAPL", period="1mo")
yf.download()
和Ticker.history()
有许多选项用于配置获取和处理。查看Wiki了解更多选项和详细信息。
日志记录
yfinance
现在使用logging
模块处理消息,默认行为仅打印错误。如果调试,请使用yf.enable_debug_mode()
切换到带有自定义格式的调试日志。
更智能的爬取
使用pip
安装nospam
包以实现更智能的爬取(参见安装)。这些包有助于缓存调用,从而避免频繁请求Yahoo。
要使用自定义requests
会话,请将session=
参数传递给Ticker构造函数。这允许缓存API调用,并通过User-agent
头自定义修改请求的方式。
import requests_cache
session = requests_cache.CachedSession('yfinance.cache')
session.headers['User-agent'] = 'my-program/1.0'
ticker = yf.Ticker('msft', session=session)
# 爬取的响应将存储在缓存中
ticker.actions
将requests_cache
与速率限制结合使用,以避免触发Yahoo的速率限制器/阻止器,从而可能导致数据损坏。
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):
pass
session = CachedLimiterSession(
limiter=Limiter(RequestRate(2, Duration.SECOND*5)), # 每5秒最多2个请求
bucket_class=MemoryQueueBucket,
backend=SQLiteCache("yfinance.cache"),
)
管理多级列
以下是Stack Overflow上关于如何处理使用yfinance下载的多级列名?的回答
yfinance
返回一个带有多级列名的pandas.DataFrame
,包括股票代码层和股票价格数据层- 回答讨论了:
- 如何在使用
pandas.DataFrame.to_csv
将数据框保存为csv后正确读取多级列 - 如何将单个或多个股票代码下载到具有单级列名和股票代码列的单个数据框中
- 如何在使用
- 回答讨论了:
持久化缓存存储
为了减少对Yahoo的请求,yfinance在本地存储一些数据:用于本地化日期的时区和cookie。缓存位置为:
- Windows = C:/Users/<用户>/AppData/Local/py-yfinance
- Linux = /home/<用户>/.cache/py-yfinance
- MacOS = /Users/<用户>/Library/Caches/py-yfinance
你可以使用set_tz_cache_location()
将缓存定向到不同的位置:
import yfinance as yf
yf.set_tz_cache_location("自定义/缓存/位置")
...
开发者:想要贡献吗?
yfinance
依靠社区调查错误并贡献代码。开发者指南:https://github.com/ranaroussi/yfinance/discussions/1084
法律声明
yfinance在Apache软件许可下分发。有关详细信息,请参阅发布版中的LICENSE.txt文件。
再次声明 - yfinance不隶属于Yahoo公司,也未经Yahoo公司认可或审核。它是一个开源工具,使用Yahoo公开可用的API,旨在用于研究和教育目的。你应该参考Yahoo的使用条款(此处,此处和此处)了解有关你使用实际下载数据的权利的详细信息。
附言
请给我留言,告诉我你的任何反馈。
Ran Aroussi