【答读者问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这些常用的数据一样。


版权所有,转载本站文章请注明出处:云子量化, http://www.woniunote.com/article/95
上一篇:【答读者问44】backtrader中如何根据订单的order_id查找包括订单状态在内的订单信息?
下一篇:【答读者问46】一场由夏普率引发的乱斗(backtrader,pyfolio和聚宽都是怎么计算夏普率的?)