如何处理yfinance中股票代码变更后的数据连续性及退市报错问题
解决yfinance 1.2.0中股票代码变更后历史数据连续性丢失的问题(以LTIMindtree为例)
问题背景
使用yfinance 1.2.0时,遇到股票代码变更后无法获取完整历史数据的问题:
- LTIMindtree股票代码从
LTIM.NS变更为LTM.NS - 查询新代码
LTM.NS的period="max"数据,仅返回更名日(2026年2月27日)起的52条数据,无法获取更名前的历史记录 - 查询旧代码
LTIM.NS时,返回"symbol may be delisted"错误,无法获取任何数据
复现代码
import yfinance as yf import pandas as pd df_new = yf.download("LTM.NS", period="max") print(f"New Ticker Shape: {df_new.shape}") df_old = yf.download("LTIM.NS", start="2024-01-01", end="2026-02-01")
报错信息
[*********************100%***********************] 1 of 1 completed New Ticker Shape: (52, 5) $LTIM.NS: possibly delisted; no price data found (1d 2024-01-01 -> 2026-02-01) (Yahoo error = "No data found, symbol may be delisted") [*********************100%***********************] 1 of 1 completed 1 Failed download: ['LTIM.NS']: possibly delisted; no price data found (1d 2024-01-01 -> 2026-02-01) (Yahoo error = "No data found, symbol may be delisted")
解决方案
方法1:手动合并新旧代码数据(需处理复权)
由于Yahoo Finance未自动关联新旧代码的历史数据,可手动下载旧代码的历史数据(限定到更名前的时间范围),再与新代码数据合并,同时确保复权基准一致。
示例代码:
import yfinance as yf import pandas as pd # 下载新代码数据(更名后) df_new = yf.download("LTM.NS", period="max", auto_adjust=True) # 下载旧代码数据(仅更名前,需确认准确的更名日期) df_old = yf.download("LTIM.NS", start="2000-01-01", end="2026-02-26", auto_adjust=True) # 合并数据并按日期排序 df_combined = pd.concat([df_old, df_new]).sort_index() # 检查合并后的数据规模 print(f"Combined Data Shape: {df_combined.shape}")
方法2:使用Ticker对象的history()方法尝试获取完整数据
部分场景下,yfinance的Ticker对象history()方法可能能获取到关联的完整历史数据,可替代download()函数尝试:
import yfinance as yf ltm_ticker = yf.Ticker("LTM.NS") df_full = ltm_ticker.history(period="max", auto_adjust=True) print(f"Full Data Shape: {df_full.shape}")
注意事项
- 确认更名日期的准确性:需通过财经渠道核实LTIMindtree的代码变更时间,确保旧代码的查询时间范围不包含更名后的日期
- 强制复权处理:务必开启
auto_adjust=True参数,保证新旧数据的价格基准统一,避免合并后数据失真
内容的提问来源于stack exchange,提问作者Ajeesh Sunil




