使用yfinance获取全球指数遇IndexError越界错误,求修复方案
修复yfinance获取指数涨跌幅时的IndexError问题
错误原因
yf.Ticker.history()默认只返回最近1天的行情数据,部分指数可能因无足够历史数据,导致DataFrame的Close列仅有1条记录。此时用iloc[-2]访问倒数第二条数据,必然触发IndexError: single positional indexer is out-of-bounds。
解决方案
方案1:指定足够的历史数据周期
调用history()时通过period参数指定获取至少2天的数据,比如获取最近5天的行情:
import pandas as pd import yfinance as yf tickers = ['^FTSE','^GSPTSE','^DJI','^GSPC','^GDAXI','^KS11','^IBEX','^GSPTSE','^AXJO','^STI','000001.SS','399001.SZ','000132.SS','000852.SS','^N225','^NSEI','^BSESN','^HSI','^GSPC','^IXIC','^RUT'] for ticker in tickers: ticker_yahoo = yf.Ticker(ticker) # 指定获取最近5天数据,确保至少有2条记录 data = ticker_yahoo.history(period="5d") if len(data) < 2: print(f"{ticker}: 数据不足,无法计算涨跌幅") continue last_quote = '%.2f' % data['Close'].iloc[-1] prev_close = '%.2f' % data['Close'].iloc[-2] change1 = float(last_quote) - float(prev_close) change = '%.2f' % change1 percent_change1 = ((float(last_quote) - float(prev_close)) / float(prev_close)) * 100 percent_change = '%.2f' % percent_change1 + '%' print(f"{ticker}: {last_quote} {change} {percent_change}")
方案2:直接使用yfinance内置的价格字段
yfinance的Ticker.info属性已封装好当前价和昨收价,无需手动提取历史数据,效率更高:
import yfinance as yf tickers = ['^FTSE','^GSPTSE','^DJI','^GSPC','^GDAXI','^KS11','^IBEX','^GSPTSE','^AXJO','^STI','000001.SS','399001.SZ','000132.SS','000852.SS','^N225','^NSEI','^BSESN','^HSI','^GSPC','^IXIC','^RUT'] for ticker in tickers: ticker_yahoo = yf.Ticker(ticker) info = ticker_yahoo.info # 校验必要字段是否存在 if 'regularMarketPrice' not in info or 'regularMarketPreviousClose' not in info: print(f"{ticker}: 无法获取有效价格数据") continue last_quote = '%.2f' % info['regularMarketPrice'] prev_close = '%.2f' % info['regularMarketPreviousClose'] change1 = float(last_quote) - float(prev_close) change = '%.2f' % change1 percent_change1 = ((float(last_quote) - float(prev_close)) / float(prev_close)) * 100 percent_change = '%.2f' % percent_change1 + '%' print(f"{ticker}: {last_quote} {change} {percent_change}")
内容的提问来源于stack exchange,提问作者Pissed Off Banker
相关产品推荐
相关产品推荐

