使用Yfinance提取股票Sector字段时触发KeyError问题求助
解决Yfinance提取Sector时的KeyError问题
问题原因
你遇到的KeyError: 'sector',大概率是部分标的(比如ETF、基金、退市股或者小众证券)的Yfinance返回信息里确实没有sector字段——哪怕你默认所有股票都应该有这个字段,但实际调用时个别标的会缺失该键。另外也可能是Yfinance的缓存机制导致部分信息未加载完全。
解决方案
1. 用字典get()方法避免KeyError
直接通过键名取值会在键不存在时报错,改用get()方法可以指定默认值,确保程序不中断:
sector = stock_info.get('sector', '未知行业')
如果标的没有sector字段,会自动填充“未知行业”,而不是触发报错。
2. 定位缺失字段的标的
在循环里加入判断,打印出没有sector字段的ticker,方便排查具体是哪些标的出问题:
for ticker in my_tickers: stock_info = yf.Ticker(ticker).info price = stock_info['regularMarketPrice'] # 检查sector是否存在 if 'sector' in stock_info: sector = stock_info['sector'] else: sector = '未知行业' print(f"标的{ticker}未找到sector字段") ibkr.loc[i, ['Price of share']] = price ibkr.loc[i, ['Sector']] = sector i += 1
3. 优化代码:复用已创建的Tickers对象
你已经创建了tickers = yf.Tickers(my_tickers),没必要在循环里重复创建yf.Ticker(ticker),直接复用已有的对象能减少网络请求,提升效率:
i = 0 for ticker in my_tickers: stock_info = tickers.tickers[ticker].info price = stock_info['regularMarketPrice'] sector = stock_info.get('sector', '未知行业') ibkr.loc[i, ['Price of share']] = price ibkr.loc[i, ['Sector']] = sector i += 1
4. 强制刷新Yfinance缓存
如果是缓存问题导致信息不全,可以在获取info时添加参数强制刷新:
stock_info = yf.Ticker(ticker).info(proxy=None)
修改后的完整代码
import yfinance as yf import pandas as pd import numpy as np ibkr = pd.read_excel("BKR_WISHLIST.xlsx") ibkr.columns = ['Company_name', 'Symbol', 'Number of shares', 'Price of share', 'Total_value_share, USD'] ibkr.dropna(subset=['Total_value_share, USD', 'Number of shares'], inplace=True) ibkr.insert(2, "Sector", "XXX") ibkr.reset_index(drop = True, inplace = True) my_tickers = ibkr["Symbol"].tolist() tickers = yf.Tickers(my_tickers) i = 0 for ticker in my_tickers: stock_info = tickers.tickers[ticker].info # 用get()给价格也加容错 price = stock_info.get('regularMarketPrice', np.nan) sector = stock_info.get('sector', '未知行业') ibkr.loc[i, ['Price of share']] = price ibkr.loc[i, ['Sector']] = sector # 打印异常标的,方便排查 if pd.isna(price): print(f"标的{ticker}未获取到价格") if sector == '未知行业': print(f"标的{ticker}未获取到行业信息") i += 1 # 保存更新后的文件 ibkr.to_excel("更新后的投资组合.xlsx", index=False)
内容的提问来源于stack exchange,提问作者Alef
相关产品推荐
相关产品推荐

