使用Python的yahoo_fin获取股票自由现金流数据遇问题求助
批量获取股票自由现金流数据的问题与解决办法
问题梳理
- 用yfinance库的
ticker.info['freeCashflow']能拿到MSFT这类股票的自由现金流数据,但GRMN等股票无数据 - 切换到yahoo_fin库时遇到两个问题:
- 执行
import yahoo_fin as si后调用si.stock_info.get_stats('AAPL'),触发AttributeError: module 'yahoo_fin' has no attribute 'stock_info' - 改用
import yahoo_fin.stock_info as si能获取NFLX的历史价格,但调用si.get_cash_flow('NFLX')触发IndexError: list index out of range
- 执行
问题原因
导入错误原因
yahoo_fin的模块结构是子模块需要直接导入,yahoo_fin主模块不会暴露stock_info属性,所以第一种导入方式必然报错。
get_cash_flow索引错误原因
这个错误主要来自三个方面:
- 目标股票的Yahoo Finance现金流页面结构和yahoo_fin预期的不一致,解析时找不到对应列表元素
- 部分股票(比如小盘股、非美股)的财务数据未在Yahoo Finance公开,或者数据格式有变动
- yahoo_fin版本过旧,没跟上Yahoo Finance的页面更新
解决办法
方法1:修复yahoo_fin使用并更新版本
- 先把yahoo_fin更到最新版:
pip install --upgrade yahoo-fin
- 正确调用接口并加异常处理,避免单只股票报错中断批量任务:
import yahoo_fin.stock_info as si def get_free_cash_flow(ticker): try: cash_flow = si.get_cash_flow(ticker) # 取最新一期的自由现金流,根据报表结构调整索引 fcf = cash_flow.loc["Free Cash Flow"].iloc[0] return {ticker: fcf} except Exception as e: print(f"获取{ticker}数据失败: {str(e)}") return {ticker: None} # 批量获取示例 tickers = ["MSFT", "GRMN", "NFLX"] results = {} for ticker in tickers: results.update(get_free_cash_flow(ticker)) print(results)
方法2:用yfinance的完整现金流报表接口
yfinance的ticker.info只有摘要数据,用ticker.cashflow能拉取完整财务报表,兼容性更好,能解决GRMN这类股票无数据的问题:
import yfinance as yf def get_fcf_yfinance(ticker): try: stock = yf.Ticker(ticker) cash_flow = stock.cashflow # 取最新一期的自由现金流 fcf = cash_flow.loc["Free Cash Flow"].iloc[0] return {ticker: fcf} except Exception as e: print(f"获取{ticker}数据失败: {str(e)}") return {ticker: None} # 批量获取 tickers = ["MSFT", "GRMN", "NFLX"] results = {} for ticker in tickers: results.update(get_fcf_yfinance(ticker)) print(results)
方法3:双库 fallback 提高成功率
如果单个库不稳定,可以同时用两个库做备用,确保数据获取成功率:
import yfinance as yf import yahoo_fin.stock_info as si def get_fcf_fallback(ticker): # 先试yfinance try: stock = yf.Ticker(ticker) cash_flow = stock.cashflow fcf = cash_flow.loc["Free Cash Flow"].iloc[0] return {ticker: fcf} except: # 失败再试yahoo_fin try: cash_flow = si.get_cash_flow(ticker) fcf = cash_flow.loc["Free Cash Flow"].iloc[0] return {ticker: fcf} except Exception as e: print(f"{ticker}数据获取失败: {str(e)}") return {ticker: None} # 批量获取示例 tickers = ["MSFT", "GRMN", "NFLX"] results = {ticker: get_fcf_fallback(ticker)[ticker] for ticker in tickers} print(results)
内容的提问来源于stack exchange,提问作者user28496902
相关产品推荐
相关产品推荐

