ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

yfinance `FundsData` 完全指南:用 Python 抓取 ETF 与共同基金的持仓、费率与资产配置数据

yfinance `FundsData` 完全指南:用 Python 抓取 ETF 与共同基金的持仓、费率与资产配置数据 yfinanceFundsData完全指南用 Python 抓取 ETF 与共同基金的持仓、费率与资产配置数据【免费下载链接】yfinanceDownload market data from Yahoo! Finances API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance本指南围绕 yfinance 官方 API 参考文档 FundsData 类 展开深入讲解如何通过Ticker.funds_data获取 ETF交易所交易基金与共同基金Mutual Fund的底层数据包括基金描述、投资组合概况、运营费率、前十大持仓、债券评级与行业权重等。读完本文你将掌握FundsData的全部公开属性、底层数据流quoteSummaryAPI 与_fetch_and_parse解析管线、返回的数据结构dict/pd.DataFrame并能直接参考 示例代码 与 单元测试 快速落地实战。一、FundsData是什么为 ETF / 共同基金定制的数据门面yfinance 的Ticker类主要面向个股但 ETF 与共同基金除了行情与历史价格外还有一套特有的基金数据持仓明细、资产类别分布、行业权重、债券评级、费率结构等。这些数据在 Yahoo! Finance 上属于quoteSummary接口的不同模块yfinance 将其封装为一个独立的公开类类全名yfinance.scrapers.funds.FundsData见 funds.py文档注册入口doc/source/reference/yfinance.funds_data.rst属于 API Reference 的一部分reference/index.rst公开接入点Ticker.funds_data属性从 ticker.py 可以看到Ticker通过属性转发到基类property def funds_data(self) - FundsData: return self.get_funds_data()而get_funds_data()在 base.py 中实现了懒加载单例模式def get_funds_data(self) - Optional[FundsData]: if not self._funds_data: self._funds_data FundsData(self._data, self.ticker) return self._funds_data即首次访问时创建FundsData实例之后复用避免重复初始化。构造FundsData只需要两个参数funds.py参数类型说明dataYfData负责发请求的底层数据对象共享Ticker的会话与缓存symbolstr基金代码如SPY、VTSAX适用范围说明FundsData只对 ETF 与共同基金有效。对普通股票如 AAPL调用_fetch_and_parse()会抛出YFDataException——这一点在测试 test_ticker.py 中有明确验证ticker.funds_data._fetch_and_parse()对 AAPL 会assertRaises(YFDataException)。二、底层数据流一次请求四个quoteSummary模块FundsData的源码注释明确列出了它查询的模块funds.pyQueried Modules:quoteType,summaryProfile,fundProfile,topHoldings2.1 请求构造_fetch()方法funds.py负责组装 HTTP 请求def _fetch(self): modules ,.join([quoteType, summaryProfile, topHoldings, fundProfile]) params_dict {modules: modules, corsDomain: finance.yahoo.com, symbol: self._symbol, formatted: false} result self._data.get_raw_json(_QUOTE_SUMMARY_URL_ self._symbol, paramsparams_dict) return result关键细节请求端点_QUOTE_SUMMARY_URL_ f{_BASE_URL_}/v10/finance/quoteSummary/其中_BASE_URL_在 const.py 中定义为https://query2.finance.yahoo.com四个模块一次性拼入modules参数一次 HTTP 往返拿到全部基金数据formatted: false要求返回未格式化的原始数值raw 值方便后续解析与计算这与后面_parse_raw_values的设计是配套的请求通过YfData.get_raw_json发出从而复用了 yfinance 的会话管理、限流与缓存机制。2.2 解析管线_fetch_and_parse()funds.py是核心解析入口def _fetch_and_parse(self) - None: result self._fetch() try: data result[quoteSummary][result][0] # check quote type self._quote_type data[quoteType][quoteType] self._parse_description(data[summaryProfile]) self._parse_top_holdings(data[topHoldings]) self._parse_fund_profile(data[fundProfile]) except KeyError: if not YfConfig.debug.hide_exceptions: raise raise YFDataException(f{self._symbol}: No Fund data found.) except Exception as e: if not YfConfig.debug.hide_exceptions: raise logger utils.get_yf_logger() logger.error(fFailed to get fund data for {self._symbol} reason: {e}) ...要点解读先取 quoteType 做类型校验——确保目标确实是基金类标的三个解析器分工明确_parse_description简介、_parse_top_holdings持仓族数据、_parse_fund_profile基金画像异常处理双通道KeyError表示响应中没有基金数据典型的非基金标的场景统一转为YFDataException其他异常则记录日志。两条路径都受全局配置YfConfig.debug.hide_exceptions控制关闭该开关默认关闭hide_exceptions即为False时会直接向上抛出原始异常方便调试详见 config.py。懒加载机制所有公开属性如description、top_holdings都遵循同一模式——缓存字段为None时触发一次_fetch_and_parse()之后直接返回缓存结果。因此多次访问同一属性不会重复发请求这也是测试里连续调用多个属性而只发生少量请求的原因。三、公开属性全览从简介到持仓的一站式接口FundsData共暴露 10 个公开属性/方法以下按主题分组均可在 funds.py 中找到实现。3.1 基金画像fundProfile / summaryProfilequote_type()funds.py 返回字符串类型的基金类别例如ETF或MUTUALFUND。注意它是一个方法而非属性调用需写data.quote_type()。descriptionfunds.py 返回基金的longBusinessSummary长文业务简介类型为str。底层取自summaryProfile模块。fund_overviewfunds.py 返回Dict[str, Optional[str]]包含三个键见_parse_fund_profilefunds.py键含义categoryName基金所属类别名称如 Large Growth、High Yield Bondfamily基金家族 / 发行公司如 Vanguard、SPDRlegalType法律结构类型如 Open Ended Investment Companyfund_operationsfunds.py 返回pd.DataFrame对比基金自身与同类平均Category Average的运营指标funds.py指标index: Attributes字段Annual Report Expense RatiofeesExpensesInvestment.annualReportExpenseRatioAnnual Holdings TurnoverfeesExpensesInvestment.annualHoldingsTurnoverTotal Net AssetsfeesExpensesInvestment.totalNetAssetsDataFrame 的列为[Attributes, symbol, Category Average]行索引为指标名。其中基金侧数值取自feesExpensesInvestment同类平均取自feesExpensesInvestmentCat。3.2 持仓族数据topHoldingsasset_classesfunds.py 返回Dict[str, float]表示基金资产的类别分布百分比funds.py键包括cashPosition现金stockPosition股票bondPosition债券preferredPosition优先股convertiblePosition可转债otherPosition其他top_holdingsfunds.py 返回pd.DataFrame行索引为Symbol列含Name持仓名称与Holding Percent持仓占比。解析逻辑见 funds.py_holdings data.get(holdings, []) for item in _holdings: _symbol.append(item[symbol]) _name.append(item[holdingName]) _holding_percent.append(item[holdingPercent]) self._top_holdings pd.DataFrame({ Symbol: _symbol, Name: _name, Holding Percent: _holding_percent }).set_index(Symbol)equity_holdingsfunds.py 返回pd.DataFrame行索引为Average列为[Average, symbol, Category Average]六行估值指标funds.pyPrice/Earnings市盈率Price/Book市净率Price/Sales市销率Price/Cashflow市现率Median Market Cap市值中位数3 Year Earnings Growth三年盈利增长bond_holdingsfunds.py 返回pd.DataFrame同样带同类平均对比三行指标funds.pyDuration久期Maturity到期期限Credit Quality信用质量bond_ratingsfunds.py 返回Dict[str, float]债券评级分布。解析采用字典推导funds.pyself._bond_ratings dict((key, d[key]) for d in data.get(bondRatings, []) for key in d)sector_weightingsfunds.py 返回Dict[str, float]行业权重分布如 Technology、Health Care 等解析方式与bond_ratings相同funds.py。数值清洗的通用工具_parse_raw_values(data, defaultNone)funds.py专门处理 Yahoo 的{raw: ..., fmt: ...}双字段结构——只取raw原始数值若传入的不是 dict 则原样返回缺字段时返回default多数场景为pd.NA。这正是formatted: false请求模式下安全解析的关键。3.3 各属性的返回类型速查表属性返回类型数据来源模块quote_type()strquoteTypedescriptionstrsummaryProfilefund_overviewDict[str, Optional[str]]fundProfilefund_operationspd.DataFramefundProfileasset_classesDict[str, float]topHoldingstop_holdingspd.DataFrametopHoldingsequity_holdingspd.DataFrametopHoldingsbond_holdingspd.DataFrametopHoldingsbond_ratingsDict[str, float]topHoldingssector_weightingsDict[str, float]topHoldings四、实战五分钟拉取 SPY 的完整基金画像官方在 examples/funds_data.py 中给出了最简示例文档 index.rst 的Funds一节也展示了同样的用法import yfinance as yf # 1. 拿到 FundsData 对象 spy yf.Ticker(SPY) data spy.funds_data # 2. 基金简介 data.description # 3. 运营信息 data.fund_overview # 类别 / 家族 / 法律类型 data.fund_operations # 费率、换手率、净资产含同类平均 # 4. 持仓族信息 data.asset_classes # 资产类别分布 data.top_holdings # 前十大持仓 data.equity_holdings # 股票估值指标含同类平均 data.bond_holdings # 债券特征含同类平均 data.bond_ratings # 债券评级分布 data.sector_weightings # 行业权重几个实战要点兼容性判断先用data.quote_type()判断标的类型避免对非基金标的误用普通股票会触发YFDataException见 tests/test_ticker.py 的TestTickerFundsData用例测试覆盖的标的类型仓库测试用 SPY股票 ETF、JNK债券 ETF、VTSAX共同基金三类标的验证了全部属性test_ticker.py说明FundsData对权益 ETF、债券 ETF 与共同基金均有良好支持无重复请求得益于懒加载缓存同一FundsData实例上多次访问任一属性不会产生额外网络请求可放心在循环/批量脚本中使用同类平均对比fund_operations、equity_holdings、bond_holdings均同时返回基金自身值与 Category Average可直接用于横向对比基金相对同类的性价比与估值水平。五、注意事项与限制不适用于普通股票FundsData面向 ETF 与共同基金对个股调用会因响应缺少基金模块而抛出YFDataExceptionfundPerformance模块未实现源码注释明确说明fundPerformance module is not implemented as better data is queryable using historyfunds.py——历史业绩表现应改用Ticker.history()等历史数据接口获取不要期待FundsData提供业绩曲线依赖网络可用性所有数据来自 Yahoo! Finance 的quoteSummary接口字段可能随上游 API 变化而增减解析逻辑对缺失字段做了兜底default/pd.NA但字段结构变化仍可能影响结果完整性异常开关YfConfig.debug.hide_exceptions见 config.py决定解析异常是被隐藏并以YFDataException兜底还是直接抛出排查问题时可以临时调整该配置查看完整错误栈与响应日志。六、延伸阅读类实现源码yfinance/scrapers/funds.pyAPI 参考文档doc/source/reference/yfinance.funds_data.rst入门示例doc/source/reference/examples/funds_data.py 与 doc/source/index.rst 的 Funds 小节完整测试用例tests/test_ticker.py 中的TestTickerFundsData接入方式与懒加载实现yfinance/base.py、yfinance/ticker.py底层请求地址常量yfinance/const.py【免费下载链接】yfinanceDownload market data from Yahoo! Finances API项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表