yfinance 股票数据获取快速上手:3 行代码拿到第一份 K 线
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
yfinance 是一个免费的 Python 库,从 Yahoo! Finance 公开接口抓取股票数据,几行代码拿到历史行情、基本面和批量报价。它适合投资爱好者、数据分析师和量化初学者。边界先说清:它不存储任何数据,每次调用都实时请求 Yahoo,只做个人研究工具,别拿去当生产交易系统的数据源。
先跑起来:2 分钟拿到 AAPL 最近 5 天行情
这一节的目标是用最少的代码跑出一份能用的数据。
pip install yfinanceimport yfinance as yf # 下载 AAPL 最近 5 个交易日的日线 df = yf.download("AAPL", period="5d") print(df.tail())输出是一个 pandas 表格,含 Open、High、Low、Close、Adj Close、Volume 六列,索引是交易日。这就是后续算收益率、做回测的原料。
能力地图:一张表看懂 yfinance 能做什么
这张表把 yfinance 的核心入口列全,你知道每个功能解决什么问题,就不用翻文档找 API。
| 入口 | 功能 | 解决什么问题 |
|---|---|---|
yf.download() | 批量下载历史行情 | 一次拿多只股票数据,横向对比 |
yf.Ticker() | 单只股票详情 | 行情、基本面、财报、分红拆股事件 |
yf.Search()/yf.Lookup() | 代码与新闻查找 | 不知道准确代码时按关键词搜 |
yf.screen()+EquityQuery | 条件筛选股票 | 按市值、市盈率等批量筛股池 |
yf.WebSocket | 实时行情订阅 | 推送式获取报价,不用轮询 |
yf.config | 网络与本地化配置 | 代理、重试、缓存位置、locale |
直说局限:yfinance 不是数据库,本地不留任何数据,用了就得再请求;没有 SLA,Yahoo 接口不保证长期稳定,还会偶发限频。拿它学习和做研究没问题,直接上生产要自己兜底。
跟着任务学:3 个最常用的场景
拉一整年的 TSLA 周线
做个股中期趋势时,日线太密,周线更看得清方向。
tsla = yf.Ticker("TSLA") # 2024 年以来、每周收盘的周线数据 hist = tsla.history(start="2024-01-01", interval="1wk") print(hist[["Close", "Volume"]].tail(10))返回的每一行是一周,Close 取该周最后一个交易日。坑点:1h小时级数据只支持最近 730 天,区间拉太长会返回空。
批量下载 4 只股票一次对比
对比一组股票时,把代码写成列表就能一次拉完,不用循环。
data = yf.download( ["MSFT", "GOOGL", "AMZN", "AAPL"], start="2024-01-01", end="2024-12-31", group_by="ticker" ) print(data["MSFT"]["Close"].head())group_by="ticker"后列结构是"股票代码 → 字段",用data["MSFT"]["Close"]直接取。坑点:非美股代码必须带交易所后缀,如1810.HK(港交所)、7203.T(东京)。
给不稳定的网络配上重试和缓存
网络抖动是请求失败的头号原因,两行配置就能让 yfinance 更抗造。
脚本开头写yf.config.network.retries = 2,瞬断时按指数退避自动重试;再用yf.set_tz_cache_location("my_cache")把时区、cookie 缓存指到自定义目录,减少重复请求。全部配置项见 配置说明。坑点:缓存只存时区和 cookie 这类元数据,不存行情,别指望离线也能出数。
遇到问题先查这里 ⚠️
| 现象 | 可能原因 | 怎么处理 |
|---|---|---|
download返回空 DataFrame | Yahoo 限频、超时,或代码/区间非法 | 设yf.config.network.retries,检查代码是否带交易所后缀 |
| 报错被吞掉看不到异常 | debug.hide_exceptions默认 True | 设为 False 再看真实报错 |
| 收盘价突然翻倍、整行缺失 | 分红/拆股复权错误,或数据源漏报 | 先用Ticker.calendar核对分红拆股日期,再对照复权前后价格 |
| 公司名等字段显示英文 | 默认 locale 是 en-US | 会话开始设yf.config.locale.lang和region,且只有该地区原生上市的股票才返回翻译值 |
| 实时价比交易所慢 | Yahoo 数据有分钟级延迟 | 对延迟敏感改用yf.WebSocket订阅,并自行核对延迟范围 |
跑通之后
接下来值得试三件事:
- 用
yf.screen()配EquityQuery,按市值、市盈率批量筛股票池; - 用
WebSocket/AsyncWebSocket搭一条实时行情推送管道; - 把行情落到本地数据库,再结合 pandas 做回测。
行情抓取的核心逻辑在 yfinance/scrapers/history.py,缓存机制的完整说明在 doc/source/advanced/caching.rst,想深入时看这两处就够。
现在就打开终端跑一遍上面那 5 行代码,确认输出有六列数据,然后把 "AAPL" 换成你真正关注的代码——跑通这一步,后面全是顺路的事。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考