yfinance快速上手:如何从Yahoo Finance批量下载股票、加密与基金数据
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
写量化策略时最耗时的往往不是模型,而是把干净的市场数据拿到手。yfinance 是一个非官方的 Yahoo Finance API 客户端:一行pip install装好,几行 Python 就能拉取股票、ETF、指数和加密货币的日线/分钟线、财报、期权链与实时行情。读完这篇,你能完成安装、跑通第一次数据下载,并避开多股下载、外盘数据不准等几个高频坑。
一、认识yfinance:它解决什么问题
Yahoo Finance 的网页数据没有官方开放 API,yfinance 做的事情就是替你调用它的内部接口,把返回结果整理成 pandas DataFrame——你可以直接当表格算指标、画图、入库。它不承诺稳定性(Yahoo 改接口它就可能跟着变),所以定位是"个人研究和教育用途",商用前请确认数据使用条款。
当前版本 1.6.0,支持 Python 3.8–3.13,核心入口如下:
| 入口 | 用途 |
|---|---|
yf.Ticker("AAPL") | 单只标的:历史价、财报、期权、实时价 |
yf.download(["AAPL","MSFT"]) | 批量下载多只标的的价格数据 |
yf.Search("nvidia") | 搜索代码、新闻、研报 |
yf.screen(...) | 按条件筛选股票(如市值、行业) |
yf.WebSocket/AsyncWebSocket | 实时行情推送 |
二、yfinance安装与配置步骤:从安装到第一次运行
这一节解决"装好之后能不能跑起来"的问题。
- 确认 Python 版本。项目要求 3.8 及以上:
python --version- 安装依赖。日常使用只需这一条:
pip install yfinance后续想用repair=True修复价格错误时,再补装:
pip install "yfinance[repair]"- 跑最小示例,验证网络和库都没问题:
import yfinance as yf t = yf.Ticker("AAPL") df = t.history(period="5d") print(df[["Close", "Volume"]].tail())能打印出最近 5 个交易日的收盘价和成交量,就说明环境通了。再快速看一眼基本面:
print(t.info["marketCap"], t.fast_info["lastPrice"])- 两个建议提前做的全局配置:开启失败重试(用指数退避 1s、2s、4s 自动重发请求),以及把时区缓存目录指到你的项目下,避免重复请求:
yf.config.network.retries = 2 yf.set_tz_cache_location("./cache")三、真实场景实战
场景1:拉单只股票历史价并算移动平均
目标:拿到足够长的日线,算 20/50 日均线,判断趋势。注意period可写"1mo"、"6mo"、"max",也可用start/end精确卡日期。
import yfinance as yf df = yf.Ticker("BTC-USD").history(period="1y") # 加密货币加 -USD 后缀 df["MA20"] = df["Close"].rolling(20).mean() df["MA50"] = df["Close"].rolling(50).mean() print(df[["Close", "MA20", "MA50"]].tail(3))你会得到一个带时间索引的表格,Close之后直接接 pandas 的rolling、ewm就能扩展出 RSI、MACD 等任意指标。
场景2:一次下载多只股票,正确处理列结构
目标:对比一组股票的收盘价走势。新手最容易在这里翻车:download对多只标的返回的是"价格在前、代码在后"的两级列(MultiIndex),直接df["AAPL"]会报 KeyError。两种解法:
import yfinance as yf # 写法一:按代码分组,变成"代码在前",取用更直观 df = yf.download(["AAPL", "MSFT", "NVDA"], period="1mo", group_by="ticker") print(df["MSFT"]["Close"].tail(3)) # 写法二:只要某一类价格,指定 level 直接抽 df2 = yf.download(["AAPL", "MSFT", "NVDA"], period="1mo") print(df2["Close"].tail(3))批量任务建议同时传progress=False关掉进度条,避免日志刷屏。
场景3:不确定代码时先搜索,再按条件筛选
目标:用户说"我想看英伟达",你未必确定要NVDA还是某个 ADR。先用Search确认,再用screen按条件圈定范围:
import yfinance as yf print(yf.Search("nvidia", max_results=5).quotes) # 返回代码/名称列表yf.screen()支持EquityQuery、ETFQuery等条件构造,比如筛出某行业市值前 20 的股票,拿到代码列表后直接丢给yf.download即可。
四、常见坑与解法
1. 现象:history()返回空表,或抛YFPricesMissingError。原因:代码写错(如美股代码忘了交易所后缀)、标的已退市,或 Yahoo 临时限流。解法:先用yf.Search核对代码;开启yf.config.network.retries = 2;仍失败就打开调试看真实报错:yf.config.debug.hide_exceptions = False。
2. 现象:多股下载后df["AAPL"]抛 KeyError。原因:默认列结构是(Close, AAPL)而非(AAPL, Close)。解法:加group_by="ticker",或df["Close"]取出某类价格后按列筛选。
3. 现象:非美股(港股、德股等)的Adj Close明显不对,或汇率币种显示错误。原因:Yahoo 对外盘的除权除息、拆股调整经常漏。解法:加repair=True,返回表会多一列Repaired?标记被修正的行;核对币种用t.history_metadata["currency"],而不是t.info。
4. 现象:t.info里某些字段是 None。原因:Yahoo 的 info 字段随接口版本波动,部分小盘股本身就没有数据。解法:价格类字段优先用更稳定的t.fast_info;info缺失属正常,不要拿它做断言。
五、进阶与选型
yfinance 与 pandas-datareader 怎么选:两者都能拉历史行情,差异在于覆盖面和容错。
| 维度 | yfinance | pandas-datareader |
|---|---|---|
| 数据源 | Yahoo Finance 内部接口 | 多源(含 Yahoo、Stooq 等) |
| 基本面/期权/实时 | 完整(财报、期权链、WebSocket) | 基本只有行情 |
| 数据修复 | 内置repair=True | 无 |
| 批量下载 | 单次多代码,多线程 | 逐个循环为主 |
| 接口稳定性 | 依赖 Yahoo 私有接口,偶发变动 | 依赖各数据源稳定性 |
| 上手成本 | 低 | 低 |
经验:个人研究、需要基本面和期权的场景直接用 yfinance;只拉交易所日线且担心 Yahoo 变动,可以两者互为备份。
工程化建议:
- 大批量拉取时按 10–20 只一批、批间
time.sleep(1~2)控速,比一次塞几百个代码更不容易被限流; - 用
yf.set_tz_cache_location固定缓存目录(Linux 默认在~/.cache/py-yfinance),重复运行时省掉时区等元数据的重复请求; - 需要鉴权或稳定访问时,参考仓库内 doc/source/reference/examples/auth.py 与 doc/source/reference/examples/proxy.py,通过
yf.Auth和yf.config.network.proxy配置,比在业务代码里手写重试可靠。
六、下一步
- 想看完整 API 清单(财报、日历、行业板块等),从 doc/source/reference/index.rst 入手;
- 实时行情推送的同步/异步写法,见 doc/source/reference/examples/live_sync.py 与 doc/source/reference/examples/live_async.py;
- 准备参与贡献的话,先读 doc/source/development/index.rst,分支协作流程如图所示。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考