
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),僅供參考