使用bt库获取股票数据时出现KeyError: 'Adj Close'错误
解决bt库获取股票数据时KeyError: 'Adj Close'的问题
问题根源
bt库默认的数据源配置或字段获取逻辑未正确拉取Adj Close列——即便你已升级所有依赖,单独用yfinance能正常获取该字段,但bt内部调用时可能未指定要获取这个列。
解决方案
方案1:手动用yfinance获取数据后传入bt
绕开bt内部的数据源调用逻辑,直接通过yfinance拉取包含Adj Close的数据集,再传入bt进行回测:
import yfinance as yf import bt # 拉取目标股票的调整收盘价 tickers = ["GOOG", "AMZN", "TSLA"] adj_close_data = yf.download(tickers, start="2020-01-01")["Adj Close"] # 创建并运行bt策略 test_strategy = bt.Strategy( "EqualWeight", [ bt.algos.RunMonthly(), bt.algos.SelectAll(), bt.algos.WeighEqually(), bt.algos.Rebalance() ] ) backtest = bt.Backtest(test_strategy, adj_close_data) result = bt.run(backtest) result.plot()
方案2:调用bt.get()时指定数据源和字段
如果坚持使用bt的get()方法,需明确指定provider为yfinance,并通过fields参数强制获取Adj Close:
import bt # 指定数据源和目标字段 data = bt.get( "GOOG,AMZN,TSLA", start="2020-01-01", provider="yfinance", fields=["Adj Close"] ) # 后续策略代码正常编写即可
方案3:手动修正列名映射
若bt返回的数据集列名格式异常(比如小写的adj close),可手动重命名列:
import bt data = bt.get("GOOG,AMZN,TSLA", start="2020-01-01", provider="yfinance") # 打印列名确认格式 print(data.columns) # 重命名为bt预期的'Adj Close' data = data.rename(columns={"adj close": "Adj Close"})
内容的提问来源于stack exchange,提问作者Wassim Mlaouhia
相关产品推荐
相关产品推荐

