yfinance 取数:3 行代码拿数据,4 类异常一次修完的实用速查
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
写回测脚本,第一道坎往往是数据:从哪来、缺了怎么办、坏了怎么办。yfinance 是一个从 Yahoo Finance 接口抓取股票行情数据的 Python 库,三行代码把一只股票的日线装进 pandas 表格,还自带价格修复。这篇带你跑通三件事:最小取数、识别并修复数据异常、批量取数。
最小可运行示例
pip install yfinanceimport yfinance as yf t = yf.Ticker("600519.SS") df = t.history(start="2025-06-01", end="2025-09-01", interval="1d") print(df[["Open", "Close", "Volume"]].tail())start/end两个日期字符串定精确区间,interval定颗粒度,也可以用period="3mo"这类快捷写法。记住一个硬性限制:分钟级(1m–30m)只能回看最多约 60 天,1h 级最多 2 年。返回的表以带时区的交易日期为索引,列是 Open/High/Low/Close/Adj Close/Volume。
读懂数据表,再动手
| 列名 | 含义 | 注意事项 |
|---|---|---|
| Open / High / Low / Close | 开、高、低、收 | 原始价格,受分红拆股影响 |
| Adj Close | 除权除息调整后收盘价 | 回测算收益用它 |
| Volume | 成交量 | 0 或空可能是 Yahoo 端缺失 |
| Dividends / Stock Splits | 分红与拆股 | 需actions=True才返回 |
| Repaired? | 该行是否被修复 | 仅repair=True时出现 |
新手最容易忽略Adj Close和Close的区别:前者减去了分红与拆股影响,序列连续,算收益用它;后者是当日真实成交价。
数据异常的四种典型表现与修复
美股数据比较干净,非美市场问题多,下面四种先记着。
返回空表
某区间取回来是空表,直接取列就报错。多半是该股票在区间内没有记录,或代码后缀写错。动手前先检查df.empty,再决定跳过还是告警;顺手用history_metadata()返回的lastPrice、currency佐证代码对不对,必要时调整start/end区间再试。
价格出现数量级跳变 🔧
某天价格比前一天大 100 倍或小 100 倍,根因通常是 Yahoo 把币种单位搞混(比如英镑/便士),伦敦市场高发。修复:history()或download()传repair=True,表里会多一列Repaired?,被修正的行标True,直接看这列就能确认生效。以仓库测试数据为例,AET.L 在 2022-06-06 的 Close 只有 0.1455,修复后还原为 14.55。
除权除息日价格序列断档
除息日前后 Adj Close 和 Close 一样,序列出现台阶,根因是 Yahoo 漏了分红调整。传repair=True会按除权信息重算 Adj Close。真实案例:1398.HK 在 2024-07-08 除息 0.3357,修复前 07-04 的 Adj Close 停在 4.83,修复后校正为 4.494285。修复逻辑细节见 doc/source/advanced/price_repair.rst。
批量取数时偶发失败
重跑时个别标的偶发失败,多为网络抖动或临时限流。最直接的修复是重跑一遍,通常能补齐;download的threads参数可传整数限制并发,网络差时调小一点降低限流概率。失败的标的会打进日志,照单补跑即可。
按场景选接口
- 单只、一次取数:
yf.Ticker("600519.SS").history(period="3mo")—— 日期索引的普通 DataFrame,最轻 - 批量、要一张合并宽表:
yf.download(tickers, group_by="column")—— 多级列,一级指标二级标的 - 批量、按标的分组:
yf.download(tickers, group_by="ticker")—— 一级列是 ticker,横向对比方便 - 批量、每只要一个对象:
yf.Tickers("600519.SS 0700.HK")—— 空格分隔字符串,每只各得一个 Ticker 对象 - 按条件选股:
yf.EquityQuery+yf.screen—— 先搭查询再执行 以上选顺手的就行,没有银弹,示例见 doc/source/reference/examples/download.py。
稳定性与性能三件小事
- 本地缓存:时区与 cookie 默认存用户目录,可用
set_tz_cache_location换自定义路径 - 并发控制:
download默认并发,限流明显时显式传threads=4 - 修复后验证币种:看
history_metadata的currency,别信Ticker.info
import yfinance as yf yf.set_tz_cache_location("custom/cache/path")各系统默认路径见 doc/source/advanced/caching.rst。做到这三点就够,别过度设计。
动手验证(10 分钟任务)🏁
import yfinance as yf df = yf.download(["600519.SS", "0700.HK"], period="6mo", repair=True) print(df["Repaired?"].unique())打印结果里全是False,说明这批数据正常;出现True就对照那行的前后数值,看它修了什么。下次写回测,记住这个闭环就够了:history拿数,repair=True修数。
【免费下载链接】yfinanceDownload market data from Yahoo! Finance's API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考