Backtrader回测访问DataFrame列SRNE触发AttributeError问题求助
Backtrader访问DataFrame自定义列报错解决方案
错误原因
Backtrader内置的PandasData数据源默认仅识别datetime、open、high、low、close、volume、openinterest这几个标准行情字段,未提前注册的自定义列不会被映射为数据对象的属性,因此会抛出属性不存在的错误。
解决步骤
1. 预处理DataFrame
Backtrader要求时间序列数据必须将时间列作为索引,首先对原数据做预处理:
import pandas as pd import backtrader as bt # 读取你的原始数据 df = pd.read_csv('你的数据路径.csv') # 将timestamp转为时间格式并设为索引 df['timestamp'] = pd.to_datetime(df['timestamp']) df.set_index('timestamp', inplace=True)
2. 定义自定义数据源类
继承bt.feeds.PandasData,注册你需要用到的自定义列:
class CustomPandasData(bt.feeds.PandasData): # 声明自定义line,每个列对应一个line lines = ('SRNE', 'CRSR', 'GME', 'ASO', 'TH', 'DTE', 'ATH',) # 配置参数,指定line对应DataFrame中的列名,同名可直接写列名字符串 params = ( ('SRNE', 'SRNE'), ('CRSR', 'CRSR'), ('GME', 'GME'), ('ASO', 'ASO'), ('TH', 'TH'), ('DTE', 'DTE'), ('ATH', 'ATH'), )
如果只需要用到SRNE这一列,仅注册该列即可,无需添加所有列。
3. 加载自定义数据到Cerebro
cerebro = bt.Cerebro() # 用自定义类加载处理好的DataFrame data = CustomPandasData(dataname=df) cerebro.adddata(data)
4. 策略中正常访问自定义列
修改后你原来的策略代码可以直接运行,不会再报错:
class TestStrategy(bt.Strategy): def log(self, txt, dt=None): ''' Logging function fot this strategy''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): # 现在可以正常访问SRNE属性 self.dataclose = self.datas[0].SRNE
注意事项
- 自定义列的取值方式除了属性访问,还可以用下标写法:
self.datas[0].lines['SRNE'][0] - 最新的取值用下标
[0],上一根K线的取值用[-1],符合Backtrader的索引规则
内容的提问来源于stack exchange,提问作者YanRemes
相关产品推荐
相关产品推荐

