yfinance 使用教程:三步取到 Yahoo Finance 行情数据,常见故障快速修复
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
写 Python 分析股票和基金时,yfinance 帮你直接从 Yahoo Finance 的公开接口免费拉取行情数据:历史价格、财报、基金持仓,几行代码就能拿到一张标准的 pandas 表格。你只要会 pip 装包、会跑 Python,就能照着这篇文章装好它、第一次取数成功,并在报错时花几分钟定位问题。
三步装好,一行验证版本
- 安装:
pip install yfinance - 修复功能依赖:价格修复要用到 scipy 和 scikit-learn,提前装上:
pip install "yfinance[repair]" - 验证安装是否成功:
python -c "import yfinance as yf; print(yf.__version__)"你应该看到1.6.0。看到版本号就装好了;看到ModuleNotFoundError,说明包没装进当前环境,换一个解释器重跑第 1 步即可。
⚠️ 机器上同时装了 Python 2 和 3 时,用
pip3代替pip,否则装错环境。
第一次取数就成功
单只股票,用yf.Ticker("MSFT")创建对象后调history(),默认返回最近 1 个月日线:
import yfinance as yf hist = yf.Ticker("MSFT").history(period="3mo") # 取 3 个月日线 print(hist.tail()) # 应看到含 Open/Close/Adj Close 的表格一次拿多只,用批量下载,multi_level_index=False把旧版扁平列结构保留下来,方便按列取数:
data = yf.download(["MSFT", "AAPL"], period="1mo", group_by="ticker", multi_level_index=False)跑完你应看到按日期索引的表格:每只股票一组 Open、High、Low、Close 列。更多写法直接看仓库里的 官方示例代码,13 个脚本对应 13 个场景。
出问题先查这张表
| 现象 | 可能原因 | 解法 |
|---|---|---|
history()返回空表,报YFPricesMissingError(可能已退市) | 代码写错,或股票已退市 | 换yf.Ticker("代码")再取info,无marketCap字段说明代码无效;日期写反也会为空,注意end不含当天 |
YFRateLimitError:Too Many Requests | 短时间请求太频繁被 Yahoo 限流 | 每只代码之间time.sleep(2),隔 10 分钟再重试;减少重复请求 |
repair=True报缺少 scipy / scikit-learn | 修复依赖是可选包,没装 | pip install "yfinance[repair]"后重跑,Repaired?列会标出修复过的行 |
| 分钟级数据取不到 60 天以前 | Yahoo 只开放最近 60 天分钟线 | 用interval="1h"或"1d"代替1m |
| 请求超时 / 反复重连 | 当前网络访问不到 Yahoo 接口 | 设置代理yf.config.network.proxy = "http://127.0.0.1:7890"后重跑 |
海外市场的价格偶有错档(漏了分红调整、币种单位差 100 倍),加repair=True可以自动修复,效果对比见官方 价格修复说明。修复后币种要看history_metadata['currency'],不要信info里的币种。做完后你应该看到Repaired?列出现True标记,且相邻交易日价格不再跳变。
四个动作提升稳定性
- 批量下载加并发:
yf.download默认多线程,group_by="ticker"按股票分组,10 只代码一次取完。 - 长区间用
period:优先用period="1y",比手算start/end更省事,也少踩日期边界坑。 - 缓存目录指到共享盘:
yf.set_tz_cache_location("custom/cache/location"),减少重复请求;默认路径在 缓存配置说明 里按系统分列。 - 调试开日志:
yf.config.debug.logging = True,出问题时能看到每次请求的 URL 和响应,定位更快。
版本变了不慌:自查加一层保护
升级前先自查版本:
import yfinance as yf print(yf.__version__) # 对照 CHANGELOG.rst 看该版本改了什么接口变更的准确说明都在仓库根目录的 CHANGELOG.rst 里。把取数逻辑包成函数,升级后只改函数内部,业务代码不动:
def fetch(ticker, period="1mo"): try: return yf.Ticker(ticker).history(period=period) except Exception as e: print(e) # 先打印错误,再决定是否兼容旧写法 return None做完后你应该能在升级前后分别跑print(yf.__version__),并对照 changelog 确认自己用到的参数还在。
收尾速查
| 我想…… | 直接做 |
|---|---|
| 确认装好 | 跑验证命令,应看到1.6.0 |
| 取单只股票 | yf.Ticker("代码").history(period="1mo") |
| 批量取数 | yf.download([...], group_by="ticker", multi_level_index=False) |
| 数据异常 | repair=True,看Repaired?列 |
| 查接口变更 | 打开 CHANGELOG.rst |
| 看现成写法 | 官方示例代码 |
| 完整 API 参考 | 官方文档 |
还卡住?按顺序求助:查 缓存与日志配置 打开调试日志 → 对照 CHANGELOG.rst 确认版本差异 → 阅读 开发指南 了解分支结构后向社区提交问题。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考