如何用 yfinance 搞定 Yahoo 金融数据抓取:从安装到价格修复的完整指南
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
如果你需要在 Python 里拉取股票历史行情、财务报表或实时报价,yfinance 是最省事的开源选择之一:它封装了 Yahoo! Finance 的 API,几行代码就能拿到 OHLCV 价格、分红拆分、行业板块等数据,特别适合量化研究、回测和数据分析场景。
一、30 秒上手:安装与第一条行情
一条 pip 命令即可装好,没有复杂的前置依赖:
pip install yfinance建议:先在虚拟环境(
python -m venv)里安装,避免污染系统全局环境。
拿到一只股票的历史 K 线只需两行:
import yfinance as yf aapl = yf.Ticker("AAPL") df = aapl.history(period="1y") # 返回含 Open/High/Low/Close/Volume 的 DataFrame如果一次要抓多只股票,用yf.download更合适——它默认多线程并行,还自带进度条:
df = yf.download(["AAPL", "MSFT", "JPM"], start="2024-01-01", end="2025-01-01", group_by="column")除了行情,yfinance 还内置了Search(搜索标的)、Sector/Industry(板块行业)、WebSocket(实时流式报价)和screen(条件选股)等入口,定义都可以在 yfinance/init.py 里看到,批量下载的完整参数说明在 yfinance/multi.py。
二、数据"看起来不对"时:4 种价格异常与修复
用 Yahoo 数据最容易踩的坑不是取不到数据,而是数据"悄悄错了"——比如分红调整没生效、股价因拆股没对齐、某几天成交量缺失,或者价格整体差了 100 倍(美元/美分搞混)。yfinance 的repair=True参数就是为这些情况设计的:它会自动检测并修复上述问题,并在结果里多加一列Repaired?标记哪些行被改过。
下面是官方文档里展示的几类典型异常(见 doc/source/advanced/price_repair.rst):
100 倍单位错乱:某些市场(伦敦交易所最常见)会把美元和便士搞混,导致一段区间价格整体偏大 100 倍:
拆股调整缺失:数据里有拆股记录,但拆股前的价格没有按比例缩放:
整行数据丢失:日线里明显缺了一行,yfinance 会用更小的周期(如 1h 数据)重新拼出缺失的价格:
分红调整缺失:分红事件在,但前一日Adj Close没有相应下调,修复逻辑会手动补上分红调整:
开启方式很简单,history和download都支持:
df = aapl.history(period="max", repair=True) df = yf.download(["8TRA.DE"], start="2020-01-01", repair=True)注意:修复会额外发起请求(用小时线重建日线等),耗时略长;另外涉及货币单位修复时,真实货币应以
Ticker.history_metadata['currency']为准,而不是Ticker.info。
三、效率优化:让请求更快、更稳
批量抓数据时,三个开关能明显提升体验:
| 手段 | 用法 | 作用 |
|---|---|---|
| 多线程 | threads=True(默认开启,也可传具体线程数) | 多 ticker 并行抓取,速度成倍提升 |
| 本地缓存 | 时区与 cookie 自动缓存在~/.cache/py-yfinance | 减少重复请求,可调用yf.set_tz_cache_location()换位置 |
| 调试日志 | yf.enable_debug_mode() | 打印完整请求与返回,定位数据问题最快 |
关于缓存与缓存位置的更多细节,见 doc/source/advanced/caching.rst;日志级别与调试的说明在 doc/source/advanced/logging.rst。
批量任务还有两个实用参数值得记住:timeout控制单次请求等待上限,progress=True保留进度条。抓 10 只股票和抓 1000 只股票,参数写法完全一样,区别只在等待时间——这也是为什么threads不建议在超大列表上设太高,否则容易触发 Yahoo 的限流。
四、老代码"突然坏了"怎么应对
yfinance 的底层是 Yahoo 的公开 API,对方端点或返回结构一变,旧版本就可能解析失败。遇到"之前能跑、现在 KeyError/空数据"这类症状,按顺序做三件事:
- 先升级:
pip install --upgrade yfinance,多数接口适配在发版时就完成了; - 看 changelog:仓库里的 CHANGELOG.md 会说明各版本的破坏性改动(如返回列结构、默认值变化);
- 开调试模式复现:
yf.enable_debug_mode()后重跑,确认是网络问题、限流还是解析失败。
长期建议:关键数据管道里把 yfinance 版本号锁死(写入 requirements),升级前先在测试环境跑一遍回归用例,而不是生产环境直接吃最新版。
小结
yfinance 的价值链条其实就四步:装得上(pip 一行搞定)→取得到(Ticker/download覆盖单只与批量)→修得准(repair=True处理分红、拆股、100x 错乱等 Yahoo 侧脏数据)→跑得快(多线程 + 缓存 + 进度条)。对新手来说,把repair=True和enable_debug_mode这两个开关用起来,能避开大部分"数据看着不对又查不出原因"的烦恼。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考