yfinance 完全教程:3 行代码抓行情数据,还能自动修复价格错误
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
抓股票数据时,你有没有遇到过这种糟心事:拉出来的历史价格中间"断档"一天、某段时间价格突然翻了一百倍、或者分红日之后调整价(Adj Close)压根没变?这些不是你的 bug,是数据源的问题。yfinance 不仅能从 Yahoo! Finance 免费拉取行情和基本面数据,还内置了一套价格修复机制,能把这些脏数据自动修干净。
一句话定位:yfinance 是什么
yfinance 是一个 Python 库,封装了 Yahoo! Finance 的公开 API,让你用几行代码拿到 K 线、成交量、分红拆分、财务报表、分析师目标价等数据,结果直接是 pandas DataFrame,接进任何分析流程都不用转换。它值得用的原因有两个:零 API Key、零费用,且对雅虎返回的脏数据做了兜底修复,拿到的数更可信。
最小上手路径:安装后 3 分钟看到输出
一条命令装好(依赖 pandas、numpy 会自动带上):
pip install yfinance跑通第一个例子,拿到微软最近 1 个月的日线数据:
import yfinance as yf msft = yf.Ticker("MSFT") hist = msft.history(period="1mo") print(hist.head())hist是一个带时间索引的 DataFrame,包含 Open / High / Low / Close / Volume 等列,直接可以画图或算指标。想先看公司层面的信息,用msft.info拿一个字典,里面有longName(公司名)、currentPrice(现价)、marketCap(市值)等字段。
任务拆解:三个高频场景的最小写法
任务一:拉历史行情并算一条均线
任务:要一只票过去一年的日线,并算出 20 日均线。做法:Ticker.history()传period和interval,然后直接在 DataFrame 上滚动计算:
hist = msft.history(period="1y", interval="1d") hist["MA20"] = hist["Close"].rolling(window=20).mean() print(hist[["Close", "MA20"]].tail())结果:hist每行一个交易日,MA20前 19 行为空(窗口不足),之后逐行输出均线值。
任务二:一次下载多只股票,按票分列
任务:同时下载 SPY 和 AAPL 做对比,不想循环写两次请求。做法:用模块级的yf.download(),group_by="ticker"让返回结果以票号为一级列名:
data = yf.download(["SPY", "AAPL"], period="6mo", group_by="ticker", progress=False) print(data["AAPL"]["Close"].tail())结果:多级列的 DataFrame,data["AAPL"]、data["SPY"]各自是独立的 OHLCV 表,方便做相对强弱之类对比。批量下载默认多线程,几十只票也不用等太久。
任务三:记不全代码?先搜票再取数
任务:只知道公司名或中文/模糊关键词,要拿到准确 ticker。做法:用yf.Search()先查报价列表:
quotes = yf.Search("apple", max_results=10).quotes for q in quotes: print(q["symbol"], q.get("shortname"))结果:打印出候选票符(如AAPL)和名称,确认后再交给yf.Ticker(...)取数,避免拿错代码。
核心机制深挖:repair=True 是怎么修数据的
yfinance 最有差异化的能力是价格修复:history()和download()都接受repair=True参数,让库自动检测并修复雅虎返回的价格错误。开启后结果会多一列Repaired?,标记哪些行被修过:
hist = yf.Ticker("0316.HK").history(period="1y", repair=True) print(hist[hist["Repaired?"] == True])它具体处理四类问题:
- 分红调整缺失:数据里有分红记录,但前一日
Adj Close和Close相等(没调),手动按分红比例补调整; - 拆分调整缺失:发生拆股但历史价格没跟着缩,库会主动应用拆分比例(需要日期范围包含拆股日后一天用于校准);
- 缺行/缺成交量:某天价格数据明显缺失或损坏时,用更细粒度(如 1 小时)的数据重新拼装出缺失的日线;
- 100 倍货币错位:雅虎偶尔把美元/美分、英镑/便士搞混,导致一段价格恰好差 100 倍,散点式的偏差用 scipy 检测,整段错位的则整体换算。
为什么这个设计好用:修复全部发生在本地,不依赖雅虎改数据;被标记的行可审计,不用信任也没成本;货币错位修完后真实币种要看Ticker.history_metadata['currency'],而不是info里的字段。完整规则和修复案例(含修正前后对照数据)见文档 doc/source/advanced/price_repair.rst,修复逻辑主体在 yfinance/utils.py,想验证行为可以看 tests/data/ 里几十组"坏数据 vs 修复后"的真实对照 CSV。
避坑与配置要点
| 场景 | 现象 | 处理方式 |
|---|---|---|
| 返回空表 | 代码写错、市场休市或代码不存在 | 先用yf.Search()核对 ticker;确认start/end有交易日 |
| 日内数据只覆盖最近 60 天 | 拉1m~1h数据发现历史部分为空 | 雅虎的限制,非 yfinance 的 bug;更长的历史只能用1d及以上 |
| 价格突然放大 100 倍 | 某段时间 OHLC 整体偏大 | 开repair=True;修完核对history_metadata['currency'] |
| 请求超时 | 网络不稳时批量下载中断 | yf.download(..., timeout=30);批量任务建议传progress=False降噪 |
| 走代理 | 默认直连被限流 | yf.config.network.proxy = "http://127.0.0.1:7890" |
| 缓存位置想改 | 时区缓存默认写在系统临时目录 | yf.set_tz_cache_location("./my_cache")指到项目目录内 |
| 周线/月线分红调整怪 | 雅虎对多日区间的分红调整算法有缺陷 | 用repair=True拉多日区间:库会先取 1d 数据修复再重采样,顺带修正此问题 |
下一步
到这里,从安装、取数、批量下载到脏数据修复,你已经覆盖了 yfinance 日常使用的主干路径。接下来可以往三个方向走:用msft.quarterly_income_stmt、msft.balance_sheet把基本面数据拉进同一个工作流;用yf.screen()加EquityQuery做条件选股;或者研究tests/test_price_repair.py的断言方式,学会为修复逻辑写回归测试。
- 完整文档源文件:doc/source/
- 核心源码:yfinance/
- 修复功能回归用例:tests/data/
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考