使用YahooFinancials拉取股票数据时遇'NoneType'下标错误求助
解决YahooFinancials拉取股票数据时的TypeError问题
你遇到的TypeError: 'NoneType' object is not subscriptable错误,核心原因是某个股票代码没有从Yahoo Finance拉取到有效数据,导致data[a]返回了None——当你尝试访问None['prices']时,自然就触发了这个错误。比如你列表里的BASWW可能是无效代码、已退市,或者Yahoo Finance没有收录该标的的历史数据。
解决步骤:
先排查无效代码
你可以先打印拉取到的data,直观查看哪个股票对应的取值是None:print(data)或者逐个测试代码,精准定位问题标的:
for symbol in symbollist: yahoo_fin = YahooFinancials(symbol) temp_data = yahoo_fin.get_historical_price_data(start_date='2020-01-01', end_date='2020-04-26', time_interval='daily') if temp_data[symbol] is None: print(f"⚠️ 股票代码 {symbol} 无可用数据")过滤无效数据,构建有效DataFrame
在构建DataFrame前,先过滤掉data中取值为None的股票项,只处理有有效数据的标的:import pandas as pd import yfinance as yf from yahoofinancials import YahooFinancials import datetime # 导入CSV股票代码列表 stocksmini = pd.read_csv('watchlistmini.csv') symbollist = stocksmini['Symbol'].tolist() # 拉取股票信息 yahoo_financials = YahooFinancials(symbollist) data = yahoo_financials.get_historical_price_data(start_date='2020-01-01', end_date='2020-04-26', time_interval='daily') # 过滤掉无数据的股票 valid_data = {symbol: info for symbol, info in data.items() if info is not None} # 构建最终的DataFrame test2 = pd.DataFrame({ a: {x['formatted_date']: x['adjclose'] for x in valid_data[a]['prices']} for a in valid_data }) print(test2)
这样修改后,程序就会自动跳过那些无法获取数据的股票,避免触发None下标访问的错误。
内容的提问来源于stack exchange,提问作者Jailey




