【答读者问45】谈一谈扩展backtrader中用于回测数据的列的问题(入门级别难度)
作者:yunjinqi 类别:
日期:2022-03-20 12:38:16
阅读:1560 次 消耗积分:0 分
今天有读者咨询这个问题,其实在前面的文章中已经讲过这个问题了,发给他了相关文章,还是没能解决,可能是我写的不够详细,在这篇文章中,尝试出一个入门级别的解决方案。
【答读者问23】计算指标的时候是直接使用pandas计算好指标加载进去速度快,还是在backtrader中计算指标速度快?(2021-11-17更新,修复pandas增加列添加问题)
10、backtrader的一些基本概念—feed讲解(2)—如何增加新的数据及一个基于pe-pb的小策略
学习python的读者,应该很快就会对pandas进行操作了。正常的backtrader接收的pandas的数据结构大概是这个样子的:index是具体的时间格式,如果不确定是不是时间,最好使用
df.index = pd.to_datetime(df.index)
进行下转换,然后接下来的数据依次是open,high,low,close,volume,openinterest
正常加载dataframe数据到cerebro中是这样的:
data_name = "xxx"
# df数据已经在前面生成好了
datetime_list = list(df.index)
# 添加cerebro
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(策略类名称)
# 准备数据
params = dict(
fromdate = datetime_list[0],
todate = datetime_list[-1],
)
feed = bt.feeds.PandasDirectData(dataname=df,**params)
# 添加合约数据
cerebro.adddata(feed, name = data_name)
# 添加手续费
cerebro.broker.setcommission(commission=0.0005)
# 添加资金
cerebro.broker.setcash(100000.0)
# 开始运行
cerebro.run()
但是我们接下来要用到别的数据,比如turnover_rate这样的换手率,那么,我们准备的df数据就应该考虑做成这样:
使用下面的方法加载数据到cerebro中:
class ExtendPandasFeed(bt.feeds.PandasDirectData):
# 根据需要定制这个列,其中把turnover_rate等超出openinterest的变量修改为自己想要的变量
params = (
('datetime', 0),
('open', 1),
('high', 2),
('low', 3),
('close', 4),
('volume', 5),
('openinterest', 6),
("turnover_rate",7),
)
lines = ("turnover_rate",)
datafields = [
'datetime', 'open', 'high', 'low', 'close', 'volume', 'openinterest',"turnover_rate"
]
# 形成的pandas的数据,index要是datetime,然后列一次要为open,high,low,volume,openinterest,turnover_rate
data_name = "xxx"
# df数据已经在前面生成好了
datetime_list = list(df.index)
# 添加cerebro
cerebro = bt.Cerebro()
# 添加策略
cerebro.addstrategy(策略类名称)
# 准备数据
params = dict(
fromdate = datetime_list[0],
todate = datetime_list[-1],
)
# 唯一需要修改的地方就是feed的生成,在这里直接使用
# feed = bt.feeds.PandasDirectData(dataname=df,**params)
feed = ExtendPandasFeed(dataname=data,**params)
# 添加合约数据
cerebro.adddata(feed, name = data_name)
# 添加手续费
cerebro.broker.setcommission(commission=0.0005)
# 添加资金
cerebro.broker.setcash(100000.0)
# 开始运行
cerebro.run()
在strategy中,可以直接使用self.datas[0].turnover_rate
访问具体的turnover_rate的数据,就跟open,high,low,close这些常用的数据一样。