今天有读者咨询这个问题,其实在前面的文章中已经讲过这个问题了,发给他了相关文章,还是没能解决,可能是我写的不够详细,在这篇文章中,尝试出一个入门级别的解决方案。
【答读者问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这些常用的数据一样。
系统当前共有 440 篇文章