You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 08:11:27