yfinance最省事,绕过登录、反爬、鉴权,免费稳定获取日线、分钟级、分红、财务等数据;它调用yahoo公开接口,不封ip、不强制登录,返回pandas dataframe。

直接用 yfinance 最省事,它绕过了登录、反爬、接口鉴权这些坑,能稳定拿到日线、分钟级、分红、财务等数据,且完全免费。
为什么别碰交易所官网或 Wind/同花顺 API
交易所官网没有公开的实时数据接口,爬取 HTML 页面会频繁遇到 403、验证码、动态渲染(JS 加载);Wind 或 Tushare 等需申请 token、有调用频次限制,Tushare 免费版仅开放前 100 只股票日线——对多数实操场景来说,属于“能跑通但没法用”。yfinance 底层调用 Yahoo Finance 的公开接口,不封 IP,不强制登录,返回结构清晰的 Pandas DataFrame。
安装与基础抓取:三行代码搞定日线
先装包:pip install yfinance。注意不要拼错成 yfinace 或 yahoo-finance(后者已废弃)。然后:
import yfinance as yf
stock = yf.Ticker("600519.SS") # 贵州茅台 A 股,.SS 表示上交所
df = stock.history(period="2y") # 获取最近两年日线
df.to_csv("maotai.csv")
-
600519.SS是 Yahoo 的标准代码格式:A 股用.SS(上交所)、.SZ(深交所);港股用.HK;美股不用后缀 -
period支持"1d"、"5d"、"1mo"、"3mo"、"6mo"、"1y"、"2y"、"5y"、"10y"、"ytd"、"max" - 想指定日期范围?换用
start="2023-01-01"和end="2024-06-30",注意end是左开右闭,实际取到的是截止end前一天
抓分钟级数据时必须知道的两个限制
yfinance 支持 interval="1m"、"2m"、"5m"、"15m"、"30m"、"60m",但有硬性约束:
- 最多只返回最近 7 天的分钟级数据,无论
start设多早,超出部分直接空 - 单次请求不能跨交易日——比如设
start="2024-06-25 09:30"、end="2024-06-28 15:00",会漏掉中间休市时段,且收盘后数据延迟约 15 分钟才更新 - 如果真需要历史分钟线,得用循环:每天单独拉一次
interval="1m",再拼接,否则会静默截断
保存时容易丢数据的三个细节
to_csv() 默认用逗号分隔,但 A 股名称含中文、指数成分股含括号,一不小心就破坏 CSV 结构。更稳妥的方式是:
- 加参数
encoding="utf-8-sig",避免 Excel 打开乱码 - 加
date_format="%Y-%m-%d %H:%M:%S",否则分钟级时间列可能被转成 Excel 时间戳 - 用
df.index.name = "datetime"显式命名索引列,否则保存后第一列没标题,读取时易误判
完整保存示例:
df.index.name = "datetime"<br>df.to_csv("maotai_1m.csv", encoding="utf-8-sig", date_format="%Y-%m-%d %H:%M:%S")
Yahoo 接口本身不保证每只股票所有字段都齐全——比如新股上市不满一年,dividends 或 financials 就是空的;history() 返回的 Volume 列在港股里有时为 0,这是源数据问题,不是脚本 bug。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











