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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 10:57:34