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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:57:19