5分钟免费获取股票数据:yfinance 完整上手指南
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
上个月我想算算自己手里几只股票到底赚了多少,结果光是找历史行情就折腾了一整天:各大财经网站的数据格式五花八门,想要分红和拆分记录还得逐个注册账号,更别提那些动辄上千元一年的付费 API。直到我发现了 yfinance——一个能免费、快速、完整地从雅虎财经抓取股票行情、财务数据和实时报价的 Python 库,几行代码就解决了我全部的痛点。这篇文章就带你从零跑通它,并顺手搭一个你自己的"小投资仪表盘"。
一、先搞懂它到底是个什么
把雅虎财经想象成一家"数据食堂",里面什么菜都有:股票价格、分红、财报、期权……但后厨不会直接对你开放。yfinance 就是那个帮你取餐的外卖员——你只需说出菜名,它就跑进后厨端出一份打包整齐的餐盒。
整个过程只有四个角色:
你(说出想要的) → yfinance(下单+取餐) → 雅虎财经(数据后厨) → DataFrame(装好的餐盒)这个"餐盒"就是 pandas 的 DataFrame,一种像 Excel 表格一样的数据结构。也就是说,你拿到手的不是乱七八糟的网页,而是一张可以直接算平均值、画曲线、做回测的标准表格。yfinance 替你包办了网络请求、解析、格式转换这些脏活累活,你要做的只是点菜。
二、三行命令,拿到第一份行情
安装它只需要一行命令:
pip install yfinance装好后,跑通你的第一段代码:
import yfinance as yf msft = yf.Ticker("MSFT") hist = msft.history(period="1mo") print(hist.tail())这段代码做了什么:它创建了一个微软(MSFT)的 Ticker 对象,拉取最近一个月的日线数据,然后打印最后几行。你会看到每天的开盘价、最高价、最低价、收盘价、成交量,以及自动复权后的 Adj Close。从安装到看到真实数据,全程不到 5 分钟。
三、主线实战:搭一个迷你投资仪表盘
光拿一只股票没意思,我们进入正题——做一个能算总资产的迷你投资仪表盘。功能按"新手→常用→进阶"三级递进,每一级都是独立可运行的代码。
新手级:单只股票的历史走势
import yfinance as yf aapl = yf.Ticker("AAPL") df = aapl.history(start="2023-01-01", end="2024-01-01") df["MA20"] = df["Close"].rolling(20).mean() # 顺手算个20日均线 print(df.tail())这段代码做了什么:拉取苹果一整年的日线,并新增一列 20 日均线,方便你直接观察趋势。
常用级:批量下载,一次算清整个组合
循环一只只请求又慢又啰嗦,yfinance 提供了download()一键批量下载,内部还会自动并发加速:
import yfinance as yf portfolio = {"AAPL": 10, "MSFT": 5, "GOOGL": 3} data = yf.download(list(portfolio), period="1y", group_by="ticker") total = 0 for t, shares in portfolio.items(): price = data["Close"][t].iloc[-1] total += price * shares print(f"{t}: {shares}股 × {price:.2f} = {price * shares:.2f}") print(f"组合总市值: {total:.2f}")这段代码做了什么:一次请求拿到三只股票一整年的数据,遍历每只股票取最新收盘价乘以持仓数,最后算出组合总市值。
进阶级:让 yfinance 帮你修复坏数据
雅虎财经的数据并不总是干净的,常见坑有:分红后没有调整价格、股票拆分后历史价格断层、甚至美元/分混用导致价格差了 100 倍。yfinance 内置了数据修复机制,一个参数就能开启:
import yfinance as yf data = yf.download("0700.HK", period="1y", repair=True) print(data[data["Repaired?"] == True]) # 只看被修复过的行这段代码做了什么:下载腾讯控股一年的行情并开启修复,打印出所有被自动修正的日期和数值。返回结果里新增的Repaired?列会标出哪些行被动过。
上图就是一次典型的"价格 100 倍错误"修复演示:图表里有一段价格异常地低,repair 开启后 yfinance 会自动识别并把整段数据校准回正确水平。
四、翻车日志:我踩过的 3 个坑
初学阶段我把能踩的坑都踩了一遍,现在总结给你,帮你直接绕开。
坑 1:股票代码写错,返回空数据现象:history()返回空的 DataFrame,提示 No data found。 原因:雅虎财经的代码有自己的格式,港股、欧股都要带交易所后缀。 修复:把"腾讯"换成"0700.HK",把"阿里巴巴"换成"9988.HK"或"BABA"。
坑 2:要了"一年前的每分钟数据"现象:yf.download("AAPL", period="1y", interval="1m")返回空表。 原因:分钟级日内数据最多只能回溯 60 天,这是雅虎的限制,不是 bug。 修复:分钟级数据用短周期period="5d",要看长期历史就换interval="1d"。
坑 3:明明有分红,价格曲线却出现诡异跳变现象:某天收盘价突然跌了一大截,跟实际走势对不上。 原因:分红除权或货币单位混用导致的 100 倍错误,原样数据不可信。 修复:拉数据时加上repair=True,让 yfinance 自动把除权调整补回来。
像上图这样,某天发了分红但历史价格没有同步调整,yfinance 会检测出来并手动把 Adj Close 修正,保证整条曲线连续可比。
五、进阶组合技:把它的上限用起来
组合技 1:WebSocket 实时行情监控
download()拿到的是"过去",实时价格可以交给内置的 WebSocket 推送:
import yfinance as yf def on_price_update(ws, message): print("价格更新:", message) with yf.WebSocket() as ws: ws.subscribe(["AAPL", "MSFT"]) ws.listen(on_price_update)这段代码做了什么:订阅苹果和微软的实时报价,每来一条新行情就打印一条。很适合写盘中小助手。
组合技 2:批量数据 + 自动缓存
yfinance 会把时区、ISIN 等信息缓存到本地,重复请求秒回。配合Tickers类可以同时管理多个对象:
tickers = yf.Tickers("AAPL MSFT GOOGL") for name in tickers.tickers: info = tickers.tickers[name].info print(name, info.get("longName"), info.get("currentPrice"))组合技 3:把财报和期权也拉进来
历史行情只是冰山一角,同一只股票的财务报表、期权链、分析师目标价都是现成的:
apple = yf.Ticker("AAPL") print(apple.financials.head()) # 利润表 chain = apple.option_chain(apple.options[0]) print(chain.calls.head()) # 最近到期日的看涨期权六、现在就开始
从"想分析股票"到"看到数据",yfinance 把中间所有麻烦都替你抹平了。现在就动手:安装 yfinance,用你的真实持仓跑一遍上面那个组合市值小脚本,你会立刻感受到"数据自由"的快乐。
想继续深入,这些地方值得收藏:
- 官方文档:
doc/source/index.rst,从安装到高级用法都有 - 进阶教程:
doc/source/advanced/,里面有缓存、多级列、价格修复等主题 - 核心源码:
yfinance/ticker.py(单只股票)、yfinance/multi.py(批量下载)、yfinance/live.py(实时行情) - 参考示例:
doc/source/reference/examples/,每个场景都有可运行的例子 - 想读源码仓库:
git clone https://gitcode.com/GitHub_Trending/yf/yfinance
上图是项目自己的分支管理策略:main 放稳定版、dev 放开发版,功能分支和修复分支各司其职。这样一个高质量的开源项目,代码组织方式本身就值得你翻一翻学习。
数据是投资的起点,而 yfinance 把起点铺到了你的终端里。跑起来吧,第一个结果正在等你。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考