如何在Python中遍历yfinance类获取多只股票的流通股数据?
解决yfinance批量获取股票流通股数据并生成指定DataFrame的问题
问题分析
你碰到的情况很常见:用简单for循环遍历yfinance的Ticker类时,要么变量被重复重置导致只保留最后一只股票的数据,要么没处理异常导致批量运行时中途报错中断。尤其是你要处理6375只股票的大列表,必须保证代码稳定且能正确关联股票代码和对应数据。
你原来的代码里,每次循环都重新初始化a = [],这相当于把之前存的数据全清空了,最后自然只剩最后一只股票的结果。而且没有把股票代码和数据绑定,也没法生成带股票代码索引的DataFrame。
解决方案代码
先确保导入所需库,然后用如下代码实现:
import yfinance as yf import pandas as pd # 你的股票列表(替换成你那6375只股票的列表即可) stock_list = ['AAPL', 'MSFT'] # 初始化两个列表,分别存储股票代码和对应的流通股数据 symbol_list = [] shares_data = [] for ticker_symbol in stock_list: try: # 创建Ticker实例 stock = yf.Ticker(ticker_symbol) # 获取流通股数据,用get方法避免字段不存在时抛出KeyError outstanding_shares = stock.info.get('sharesOutstanding') # 只保留成功获取到的数据(如果允许空值可以去掉这个判断) if outstanding_shares is not None: symbol_list.append(ticker_symbol) shares_data.append(outstanding_shares) except Exception as e: # 捕获所有可能的异常,比如网络问题、数据缺失等 print(f"获取{ticker_symbol}数据失败: {str(e)}") # 跳过当前股票,继续处理下一只 continue # 生成你需要的格式的DataFrame,股票代码作为索引 result_df = pd.DataFrame( {'sharesOutstanding': shares_data}, index=symbol_list ) # 查看结果 print(result_df)
代码说明
- 避免数据重置:把存储数据的列表
symbol_list和shares_data放在循环外初始化,每次循环只追加新数据,不会清空之前的结果。 - 异常处理:用
try-except捕获所有可能的异常,保证即使某只股票数据获取失败,程序也能继续处理剩下的股票,不会直接崩溃。 - 非空过滤:添加
if outstanding_shares is not None的判断,过滤掉那些没有流通股数据的股票,避免DataFrame中出现空值(如果需要保留空值可以移除这个判断)。 - DataFrame构造:明确指定列名和索引,生成你期望的格式——股票代码作为行索引,唯一的列是流通股数量。
运行后输出的结果如下:
sharesOutstanding AAPL 4375479808 MSFT 7606049792
这段代码完全可以复用在你的6375只股票的列表上,只需要把stock_list替换成你的大列表即可。
内容的提问来源于stack exchange,提问作者ker_laeda86




