ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

yfinance 完全实战指南:从安装到市场数据获取避坑

yfinance 完全实战指南:从安装到市场数据获取避坑 yfinance 完全实战指南从安装到市场数据获取避坑【免费下载链接】yfinanceDownload market data from Yahoo! Finances API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance敲下import yfinance as yf的那一刻大多数人以为 yfinance 安装完毕、市场数据到手工作就结束了。恰恰相反真正决定你的管道能否长期稳定跑起来的是装完之后那些不显眼的细节缓存放哪、价格断档怎么修、429 限流怎么扛。这篇文章按装好 → 拉数 → 修数 → 提速 → 长跑的真实顺序把每一步的坑一次讲清。yfinance 安装一条命令部署一个参数解锁数据修复yfinance 支持 Python 3.8 及以上版本当前版本 1.6.0依赖会自动带上 pandas、numpy、requests 等。如果你会碰美国以外的市场数据强烈建议连repair扩展一起装——它补上 scipy 和 scikit-learn后面的价格自动修复全靠它们python -m pip install yfinance[repair]这一条命令装完即含数据修复能力纯美股日线用户装yfinance本体也够用。装完用下面这行确认版本python -c import yfinance; print(yfinance.__version__)很多人会忽略一个细节yfinance 会在本地维护时区、Cookie、ISIN 三类缓存Linux 下默认落在~/.cache/py-yfinance。在容器或无家目录写权限的服务器上跑定时任务时这里写不进去就会静默降级建议在拉数前先指定位置import yfinance as yf yf.set_tz_cache_location(/var/cache/yf) # 必须在第一次请求前调用缓存目录设置只写一次之后所有时区查询都走本地 SQLite不再反复问 Yahoo。第一次拉数三行代码注意 end 是左闭右开最小可用的拉数代码就三行import yfinance as yf px yf.download(AAPL, period1y, auto_adjustTrue) print(px.tail())period1y取最近一年日线auto_adjustTrue会让 OHLC 自动按分红拆股复权想要原始未复权价就设False。单只股票默认返回的是双层列字段 × 股票代码直接当普通表用会别扭。加一个参数拿扁平结构px yf.download(AAPL, period1y, multi_level_indexFalse)multi_level_indexFalse让单票结果变成普通 DataFramepx[Close]直接可用。用start/end指定日期时要记住一个反直觉的坑end是不包含的。想拿到 2022 年最后一天得写end2023-01-01。另外 1 分钟级的分钟数据只有最近 60 天内的可用拿更久的细粒度数据只能换interval1h或1d。数据不对劲先用 repairTrue 试再怀疑数据源拉出来的价格出现某一天突然翻倍、分红日价格纹丝不动先别急着质疑 Yahoo——这些是非美股市场的高频毛刺yfinance 内置的修复逻辑专门处理它们。核心就一个参数px yf.Ticker(MOB.ST).history(periodmax, repairTrue) px[Repaired?] # 新列记录哪些行被修过repairTrue会自动检测并修复下面四类典型异常结果里多出一列Repaired?告诉你动了哪几行。分红/拆股调整缺失数据里有分红记录但前一日Adj Close等于Close说明复权漏了。修复会手动补上分红调整下例为 8TRA.DE拆股场景同理Yahoo 偶尔漏调拆股当日及之前的价格修复会按拆股比例重算下例为 MOB.ST100 倍货币单位错乱同一只股票的前段价格莫名其妙放大 100 倍多半是货币单位混用。检测出 100x 跳变后修复会把异常段缩回正确量级同时注意真实货币要看Ticker.history_metadata[currency]不是Ticker.info里那个字段。缺行与坏数据某天整行缺失或数值明显损坏时修复逻辑会退到更细的粒度比如用 1 小时数据去重建日线而不是留一个洞429 限流与空数据把请求代码写成能扛的样子短时间请求过密时yfinance 会抛出YFRateLimitError对应 HTTP 429。正确姿势不是裸奔而是把限流当成一类显式异常来处理from yfinance.exceptions import YFRateLimitError try: px yf.download(^GSPC, periodmax) except YFRateLimitError: print(被限流稍后再来)批量脚本里更实用的写法是包一层指数退避重试限流、瞬时网络错误一并兜住import time import yfinance as yf def safe_download(ticker, max_retries3): for attempt in range(max_retries): try: return yf.download(ticker, period1y) except Exception: if attempt max_retries - 1: raise time.sleep(2 ** attempt)退避间隔按 1s、2s、4s 递增比固定 sleep 更不容易触发下一轮限流。再往下还有两个常被遗忘的开关直接作用在网络层import yfinance as yf yf.config.network.retries 2 # HTTP 层自动重试次数 yf.config.network.proxy http://127.0.0.1:7890 # 需要代理时启用retries让底层请求在超时后自动重试省得你为小抖动写逻辑proxy则解决网络环境受限的问题。想彻底搞清某次请求到底发生了什么打开调试日志yf.config.debug.logging True开启后 yfinance 会逐条打印每个 HTTP 请求的状态排查为什么这只票总是空时是头等功臣。批量下载加速一次 download 拉一百只票批量场景下别写 for 循环逐只请求。download的tickers参数直接接受空格分隔的字符串内部并行拉取px yf.download(AAPL MSFT GOOG JPM TSLA, period1y, threadsTrue, group_byticker) px[AAPL] # 按代码分组后直接取threadsTrue启用多线程并发group_byticker让顶层索引是股票代码取某只票的整段数据一步到位。历史跨度很长的票比如十几年日线单次请求容易超时。拆段拉取再拼接比反复重试更可靠import pandas as pd d1 yf.download(MSFT, start2015-01-01, end2018-01-01) d2 yf.download(MSFT, start2018-01-01, end2021-01-01) px pd.concat([d1, d2])注意前一段的end和后一段的start用同一个日期即可因为end不含当天天然不会重复。拿到数据后花两秒钟做质量校验能拦掉大部分下游事故px.isna().sum().sum() # 0 说明没有空洞 px.index.inferred_freq # 推断出的频率应稳定日线为 D 附近长期稳定跑三个让定时任务不翻车的小习惯第一把版本当依赖管理。Yahoo 的接口会不定期变更旧 yfinance 遇到新版接口常表现为某只票突然没数据这种难以定位的故障。每次排查前先确认版本再看仓库根目录的 CHANGELOG.rst 里对应版本修了什么import yfinance print(yfinance.__version__) # 当前应为 1.6.0第二给空数据留显式分支。退市股、代码写错、区间无数据最终都可能落到YFPricesMissingError/YFTickerMissingError上。定时任务里捕获这两类异常并记录 ticker比让整批任务崩掉更经济from yfinance.exceptions import YFPricesMissingError, YFTickerMissingError try: yf.download(DELISTED, period1y) except (YFPricesMissingError, YFTickerMissingError) as e: print(f跳过无数据代码{e})第三升级前看一眼变更轨迹。项目的改动通常先在特性分支上进行合并回主干后随版本发布像下面这张分支结构图展示的那样所以小步升级 对照 CHANGELOG 回归验证比一年一次大升级安全得多。想深入某个专题可以直接翻仓库文档缓存机制见 doc/source/advanced/caching.rst价格修复原理见 doc/source/advanced/price_repair.rst全部 API 速查见 doc/source/reference/index.rst。把上面几节的参数和习惯落进代码yfinance 从能跑一次到天天跑不坏的距离其实就差这几行配置。【免费下载链接】yfinanceDownload market data from Yahoo! Finances API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表