You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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)

代码说明

  1. 避免数据重置:把存储数据的列表symbol_listshares_data放在循环外初始化,每次循环只追加新数据,不会清空之前的结果。
  2. 异常处理:用try-except捕获所有可能的异常,保证即使某只股票数据获取失败,程序也能继续处理剩下的股票,不会直接崩溃。
  3. 非空过滤:添加if outstanding_shares is not None的判断,过滤掉那些没有流通股数据的股票,避免DataFrame中出现空值(如果需要保留空值可以移除这个判断)。
  4. DataFrame构造:明确指定列名和索引,生成你期望的格式——股票代码作为行索引,唯一的列是流通股数量。

运行后输出的结果如下:

sharesOutstanding
AAPL      4375479808
MSFT      7606049792

这段代码完全可以复用在你的6375只股票的列表上,只需要把stock_list替换成你的大列表即可。

内容的提问来源于stack exchange,提问作者ker_laeda86

火山引擎 最新活动