精华内容
下载资源
问答
  • Backtrader

    2021-05-02 12:25:06
      最近开始做量化交易,发现了一个很好的开源回测框架——Backtrader。这是一款基于Python功能强大的开源回测框架,并且支持实盘交易。Backtrader有以下一些特性: 灵活:可以用Backtrader内置的功能,也可以自己...

    一、简介

      最近开始做量化交易,发现了一个很好的开源回测框架——Backtrader。这是一款基于Python功能强大的开源回测框架,并且支持实盘交易。Backtrader有以下一些特性:

    • 灵活:可以用Backtrader内置的功能,也可以自己开发
    • 支持多种证券:股票、期货、数字货币等等
    • 支持多种周期:tick级、秒级、分钟级、天、周、月、年

    二、安装

      Backtrader支持python2.7,python3.x。安装命令:

    pip install backtrader
    

      如果要用到backtrader的画图功能,安装命令:

    pip install backtrader[plotting]
    

    三、组成模块

      Backtrader包含若干个模块,如下图所示,其中Cerebro是Backtrader的基石,是回测的“大脑”,负责收集数据、策略等等与回测相关的模块,并按一定的逻辑运行这些模块,最后得到回测结果。
    在这里插入图片描述

    四、构建回测

      用Backtrader构建回测的流程如下:

    • 第一步:创建策略类
      • 确定可调整的参数
      • 计算策略需要的指标
      • 写买卖的逻辑
    • 第二步:创建Cerebro的实例对象
      • 添加策略
      • 添加数据
      • 添加其他需要的功能
      • 执行cerebro.run()
      • 可视化

      可用如下的图来表示以上的步骤:
    在这里插入图片描述
      红色是可选的。
      用双均线策略实现一个最简的回测程序:

    import backtrader as bt 
    import pandas as pd
    # 创建策略类:双均线
    class TwoSmaStrategy(bt.Strategy):
        params = (('short', 5), ('long', 10))   #可调整的参数
        def __init__(self):
            self.order = None           #初始化订单
            self.sma_s = bt.indicators.MovingAverageSimple(self.datas[0].lines.close, period=self.params.short) #短期均线指标
            self.sma_l = bt.indicators.MovingAverageSimple(self.datas[0].lines.close, period=self.params.long) #长期均线指标
        
        # 策略方法
        def next(self):
            # 检查是否已经买入
            if not self.position:
                # 如果没有买入,并且短期均线 > 长期均线,说明涨势,买入
                if self.sma_s[0] > self.sma_l[0]:
                    self.order = self.buy()
            else:
                # 已经买了,并且短期均线 < 长期均线,说明跌势,卖出
                if self.sma_s[0] < self.sma_l[0]:
                    self.order = self.sell()
    
    if __name__ == '__main__':
        cerebro = bt.Cerebro() #实例化cerebro对象
        
        #获取数据
        data_path = './data/sz.000961.csv'
        df = pd.read_csv(data_path)
        df['date'] = pd.to_datetime(df['date'])
        data = bt.feeds.PandasData(dataname=df, datetime='date')
        
        cerebro.addstrategy(TwoSmaStrategy) #加载策略类到cerebro对象中
        cerebro.adddata(data) #加载数据对象到cerebro对象中    
        ret = cerebro.run() #进行回测
        cerebro.plot() #可视化
    
    展开全文
  • backtrader-docs:backtrader文档
  • backtrader基础教程

    2021-07-31 08:48:13
    使用大数据,比如政府公布的数据及实时舆情信息、财务信息等,制定特定策略,并使用backtrader进行回测与评价,可带来稳定的收益,破解股市的密码,获取高额稳定收益。 购买课程后,发送购买用户的帐号信息至邮箱...
  • backtrader Yahoo API Note: [2018-11-16] After some testing it would seem that data downloads can be again relied upon over the web interface (or API v7) Tickets The ticket system is (was, ...
  • 羊驼backtrader-api alpaca-backtrader-api是backtrader框架内的backtrader trade API的python库。 通过支持REST和流接口,它可以轻松快速地开发交易算法。 有关每种API行为的详细信息,请参阅在线API文档。 请...
  • backtrader_plotting 为backtrader添加扩展绘图功能的backtrader ( )。 目前唯一可用的后端是Bokeh ( )。 特征 互动图 实时交易支持(需要自定义backtrader - 请参阅 Wiki 以获取更多信息) 数据回放支持 交互式...
  • Backtrader量化平台教程(一):backtrader的整体框架

    万次阅读 多人点赞 2017-03-13 21:15:03
    AD:(本人录制的backtrader视频课程,大家多多支持哦~https://edu.csdn.net/course/detail/9040) 无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像...

    AD:(本人录制的backtrader视频课程,大家多多支持哦~ https://edu.csdn.net/course/detail/9040) 

     无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。教程链接:https://www.cbedai.net/qtlyx       

     

    backtrader是一个量化策略的回测分析平台,功能还是很强大的。

    1.安装backtrader

    安装很简单,和别的lib安装一模一样,pip install backtrader。

    2.从代码开始

     

    from __future__ import (absolute_import, division, print_function,
                            unicode_literals)
    
    import datetime  # For datetime objects
    import os.path  # To manage paths
    import sys  # To find out the script name (in argv[0])
    import pandas as pd
    from WindPy import w
    # Import the backtrader platform
    import backtrader as bt
    
    
    # Create a Stratey
    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):
            # Keep a reference to the "close" line in the data[0] dataseries
            self.dataclose = self.datas[0].close
            # To keep track of pending orders
            self.order = None
    
        def notify(self, order):
            if order.status in [order.Submitted, order.Accepted]:
                # Buy/Sell order submitted/accepted to/by broker - Nothing to do
                return
    
            # Check if an order has been completed
            # Attention: broker could reject order if not enougth cash
            if order.status in [order.Completed, order.Canceled, order.Margin]:
                if order.isbuy():
                    self.log('BUY EXECUTED, %.2f' % order.executed.price)
                elif order.issell():
                    self.log('SELL EXECUTED, %.2f' % order.executed.price)
    
                self.bar_executed = len(self)
    
            # Write down: no pending order
            self.order = None
    
        def next(self):
            # Simply log the closing price of the series from the reference
            self.log('Close, %.2f' % self.dataclose[0])
    
            # Check if an order is pending ... if yes, we cannot send a 2nd one
            if self.order:
                return
    
            # Check if we are in the market
            if not self.position:
    
                # Not yet ... we MIGHT BUY if ...
                if self.dataclose[0] < self.dataclose[-1]:
                    # current close less than previous close
    
                    if self.dataclose[-1] < self.dataclose[-2]:
                        # previous close less than the previous close
    
                        # BUY, BUY, BUY!!! (with default parameters)
                        self.log('BUY CREATE, %.2f' % self.dataclose[0])
    
                        # Keep track of the created order to avoid a 2nd order
                        self.order = self.buy()
    
            else:
    
                # Already in the market ... we might sell
                if len(self) >= (self.bar_executed + 5):
                    # SELL, SELL, SELL!!! (with all possible default parameters)
                    self.log('SELL CREATE, %.2f' % self.dataclose[0])
    
                    # Keep track of the created order to avoid a 2nd order
                    self.order = self.sell()
    
    
    if __name__ == '__main__':
        # Create a cerebro entity
        cerebro = bt.Cerebro()
    
        # Add a strategy
        cerebro.addstrategy(TestStrategy)
    
        # Create a Data Feed
        # 本地数据,笔者用Wind获取的东风汽车数据以csv形式存储在本地。
        # parase_dates = True是为了读取csv为dataframe的时候能够自动识别datetime格式的字符串,big作为index
        # 注意,这里最后的pandas要符合backtrader的要求的格式
        dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True)
        dataframe['openinterest'] = 0
        data = bt.feeds.PandasData(dataname=dataframe,
                            fromdate = datetime.datetime(2015, 1, 1),
                            todate = datetime.datetime(2016, 12, 31)
                            )
        # Add the Data Feed to Cerebro
        cerebro.adddata(data)
    
        # Set our desired cash start
        cerebro.broker.setcash(100000.0)
    
        # Print out the starting conditions
        print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
    
        # Run over everything
        cerebro.run()
    
        # Print out the final result
        print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
        # Plot the result
        cerebro.plot()

    上面这段代码整个框架来自于backtrader的官网(https://www.backtrader.com),笔者自己修改了获取数据的方式。大家安装完backtrader之后可以复制过去运行一样,一般来说,运行通过就说明环境没有问题(数据文件下文有提到)。接下来我们就分析一下这个不赚钱的策略。

     

    我们想想,量化回测,首先得有数据。

    在backtrader里面,DataFeed就是这样一个数据的概念。

    dataframe = pd.read_csv('dfqc.csv', index_col=0, parse_dates=True)
    dataframe['openinterest'] = 0
    data = bt.feeds.PandasData(dataname=dataframe,
                            fromdate = datetime.datetime(2015, 1, 1),
                            todate = datetime.datetime(2016, 12, 31)
                            )

    这一段代码从本地csv文件获得某一个股票的交易数据,包括open,close,high,low,volume。大家注意到,这里我们的存储形式的pandas。backtrader是支持pandas这样的一种数据格式的,无形中方便了很多

    关于该数据文件,大家可以去笔者的百度云下载。

    链接:https://pan.baidu.com/s/1slnULbv 密码:wi3k

    后面的很多教程案例,都会用到这一数据。

     

    backtrader对每种数据的来源都有一定的标准,要不然咱们相信,不订立标准,框架怎么会知道每一列数据都是干嘛的呢。backtrader对于pandas的标准就是这些列的名字得是open,close,high,low,volume,openinterest。我们这里没有用到openinterest,所以把它设置为零就可以了,这里提示一下,backtrader要求pandas下的DataFeed,pandas的DataFrame的index是时间。

    数据的问题解决了,那么数据要交给回测平台。这里整个回测功能的实现都是依赖于cercbro这个类实现的。这个单词的意思,在西班牙语里就是大脑。

    我们创造一个大脑,

     

    # Create a cerebro entity
        cerebro = bt.Cerebro()

    然后把之前的数据喂给大脑:

     

     

    # Add the Data Feed to Cerebro
        cerebro.adddata(data)

    基础建设基本就完成了。

     

    接下来就是技术性的较量,策略啦。

     

    class TestStrategy(bt.Strategy):

    每一个策略都是一个类,是一个继承bt.Strategy类的父类。具体里面的细节,下次再说。

     

    假设我们写好了一个策略,换句话说,就是构造好了一个Strategy类,那么我们就应该把它喂给大脑。

     

    # Add a strategy
        cerebro.addstrategy(TestStrategy)

    好了,都齐全了。但是别忘了,我们还应该制定初始资金。

     

     

    # Set our desired cash start
        cerebro.broker.setcash(100000.0)
    

     

    cerebro里面的broker成员就是管这事的。我们给了他100000元。

    到这里,该有的都有了,我们run就可以了。cerebro.run()方法就是把上述东西跑起来。

    跑完之后,我们想看一下效果,人嘛,可视化的最好,所以:

     # Plot the result
        cerebro.plot()

    就能把结果跑出来。

    3.我的结果

    很显然,亏钱了,但是不要紧,程序对了,万里长征第一步对了。

    俗话说的好,万事开头难,中间也难,结尾更难。

    4.总结

    最后总结一下,一个策略,你需要的是数据,而且要让回测平台认识,所以是满足一定规则整理的数据。然后就是回测的“脑子”。这些基础设施有了,写好你的策略。策略其实就是一个类,重写类里的方法就实现了一个个策略。接下来,run就可以了。so easy!

     

     

     

     

     

     

    展开全文
  • Python Backtrader-Metaquotes MQL5-API 开发状态:第一次稳定发布。 在Debian 10上进行生产。 目录 关于该项目 这是该项目的Backtrader部分。 此项目的MQL5端位于此处: 开发中: 重新连接时上传数据 安装 pip ...
  • backtrader指南

    2021-05-29 14:11:33
    目录Backtrader基础概念Data FeedsShortcurs for Data FeedsOmitting the Data FeedsLineLines declarationAccessing `lines` in Data FeedLines lenInheritance of Lines and ParamsIndexing: 0 and -1...

    Backtrader

    用于量化交易的机器人,可以对于数据进行有效回测和指定策略等。

    基础概念

    Data Feeds

    平台工作的基础将通过策略完成。这些将通过数据馈送,数据馈送以数组的形式自动提供给策略的成员变量,并提供数组位置的快捷方式。

    class MyStrategy(bt.Strategy):
        params = dict(period=20)
        
        def __init__(self):
            sma = btind.SimpleMovingAverage(self.datas[0], period=self.params.period)
        
        ...
        
    cerebro = bt.Cerebro()
    
    ...
    
    data = btfeeds.MyFeed(...)
    cerebro.adddata(data)
    
    ...
    
    cerebro.addstrategy(MyStrategy, period=30)
    ...
    

    Tip:

    • *args**kwargs该策略的__init__方法可以接收使用
    • self.datas为一个数组/列表/可迭代对象,需要至少有一项数据

    Shortcurs for Data Feeds

    • self.data表示self.datas[0]
    • self.dataX表示self.datas[X]
    class MyStrategy(bt.Strategy):
        params = dict(period=20)
        
        def __init__(self):
            sma = btind.SimpleMovingAverage(self.data, period=self.params.period)
    

    Omitting the Data Feeds

    class MyStrategy(bt.Strategy):
        params = dict(period=20)
        
        def __init__(self):
            sma = btind.SimpleMovingAverage(period=self.params.period)
    

    Line

    大部分对象都包含一个Line对象,用户角度上来看

    • 它可以容纳一个或多个线,是一系列的线,是一组值的数组,放置在图表中表现为一条线

    比较经典的线是由股票收盘价形成的线,称为收盘时线

    class MyStrategy(bt.Strategy):
        params = dict(period=20)
        
        def __init__(self):
            self.movav = btind.SimpleMovingAverage(self.data, period=self.params.period)
        
        def next(self):
            if self.movav.lines.sma[0] < self.data.lines.close[0]:
                print('平均线高于收盘价格')
    

    常见的缩写形式

    • xxxx.lines -> xxx.l
    • xxx.lines.name -> xxx.line_name
    • self.data_name -> self.data.lines.name
    • self.data1_name -> self.data1.lines.name

    Lines declaration

    定义对象中的线对象,可以采用line的类参数。

    class SimpleMovingAverage(Indicator):
        lines = ('sma', )
    

    访问:

    • self.lines[0] -> self.lines.sma
    • self.line -> self.lines[0]
    • self.lineX -> self.lines[X]
    • self.line_X -> self.lines[X]
    • self.dataY -> self.data.lines[Y]
    • self.dataX_Y -> self.data[X].lines[Y]

    Accessing lines in Data Feed

    通过省略形式访问lines数据

    data = btfeeds.BacktraderCSVData(dataname="mydata.csv")
    ...
    
    class MyStrategy(bt.Strategy):
        ...
        
        def next(self):
            if self.data.close[0] > 30.0:
                ...
    

    Lines len

    线对象是一组点,并在执行过程中,动态增长,可以通过调用len随时测量长度。

    这些适用于:

    • Data Feeds
    • Strategies
    • Indicators

    buflen可以查看预加载的数量。len返回已处理的条数,buflen报告已经加载的组数。

    Inheritance of Lines and Params

    Indexing: 0 and -1

    • index:0 当前值
    • index:-1 前一个值

    Slicing

    backtrader不支持对于线对象的切片方法。切片本身的意义不大。

    Getting Slice

    backtrader支持通过get方法对于对象进行切片。

    myslice = self.my_sma.get(ago=0, size=1)
    

    Lines:DELAYED indexing

    class MyStrategy(bt.Strategy):
        params = dict(period=20)
        
        def __init__(self):
            self.movav = btind.SimpleMovingAverage(self.data, period=self.p.period)
            sefl.cmpval = self.data.close(-1) > self.sam
        
        def next(self):
            if self.cmpval[0]:
                print("收盘价高于平均线")
    

    Lines Coupling

    class MyStrategy(bt.Strategy):
        params = dict(period=20)
        
        def __init__(self):
            
            sma0 = btind.SMA(self.data0, period=15)
            sma1 = btind.SMA(self.data1, period=5)
            
            self.butsig = sma0 > sma1
          
        def next(self):
            if self.buysig[0]:
                print('日均移线大雨周均平均线')
    

    Operators, using natural constructs

    支持操作符:

    • and -> And
    • or -> Or

    支持逻辑控制:

    • if -> If

    支持函数:

    • any -> Any
    • all -> All
    • cmp -> Cmp
    • max -> Max
    • min -> Min
    • sum -> Sum
    • reduce -> Reduce

    操作平台

    class SimpleMovingAverage(Indicator):
        lines = ('sma', )
        params = dict(period=20)
        
        def __init__(self):
            ...
            
        def prenext(self):
            print(len(self))
            
        def nextstart(self):
            print(len(self))
            self.next()
        
        def next(self):
            print(len(self))
    
    

    Up and Running

    • Data Feed
    • Strategy
    • Cerebro

    Data Feeds

    平台提供了集合数据源

    • 几种csv格式和通用csv阅读器
    • Yahoo在线提取器
    • 支持接受pandas DataFrame和blaze对象
    • 通过Interacive Brokers、Visual Chart和Oanda进行数据馈送

    雅虎财经数据

    import backtrader as bt
    import backtrader.feeds as btfeeds
    
    ...
    
    datapath = "path/to/you/yahoo/data.csv"
    
    data = btfeeds.YahooFinanceCSVData(
        dataname=datapath,
        reversed=True
    )
    

    A Strategy(derived) class

    如果平台使用者是为了对数据进行回测,这些是在Strategy的派生类中实现的,至少需要定制两种方法:

    • init
    • next

    基础使用

    class MyStrategy(bt.Strategy):
        
        def __init__(self):
            self.sma = btind.SMA(self.data, period=20)
            
        def next(self):
            if self.sma > self.data.close:
                self.buy()
            if self.sma < self.data.close:
                self.sell()
    

    更多方法定制

    class MyStrategy(bt.Strategy):
    
        def __init__(self):
    
            self.sma = btind.SimpleMovingAverage(self.data, period=20)
    
        def next(self):
    
            if self.sma > self.data.close:
                submitted_order = self.buy()
    
            elif self.sma < self.data.close:
                submitted_order = self.sell()
    
        def start(self):
            print('Backtesting is about to start')
    
        def stop(self):
            print('Backtesting is finished')
    
        def notify_order(self, order):
            print('An order new/changed/executed/canceled has been received')
    
    • start 回测开始调用
    • stop 回测结束调用
    • notify_order 通知订单状态变更

    更多的方法

    • buy/sell/close 使用底层经纪商和sizer向经纪人发送买/卖订单
    • getposition 获取当前市场位置
    • setsizer/getsizer 设置/获取基础的权重Sizer

    A Cerebro

    一旦数据馈送可用并定义了策略,Cerebro就会将所有的内容整合到一起并执行操作。

    cerebro = bt.Cerebro()
    

    一些默认值

    • 一个默认的broker被创建
    • 操作的佣金比例为0
    • 数据馈送预加载
    • 默认为批量处理模式

    添加数据和策略

    cerebro.adddata(data)
    cerebro.addstrategy(MyStrategy, period=25)
    cerebro.run()
    

    以上操作产生的效果如下:

    • 添加Data Feed实例
    • 添加自定义策略

    更多的操作可见如下:

    • 设置操作模式
    cerebro = bt.Cerebro(runonce=True, preload=True)
    
    • getbroker/setbroker
    • ploting
    cerebro.run()
    cerebro.plot()
    

    plot支持的几个参数

    - numfigs=1 设置分图数量
    - plotter=None 传递给绘图仪表实例
    - **kwargs 常用的关键词参数
    
    • 优化策略
    cerebro.optstrategy(MyStrategy, period=xrange(10, 20))
    

    Cerebro

    Cerebro

    Cerebro

    此类为backtrader的基石,主要从事下列事务:

    • 收集所有输入、执行策略、观察行情、分析、生成文档
    • 执行回测/实时数据馈送/交易
    • 返回结果
    • 进行图像绘制

    收集输入数据

    1. 创建一个cerebro
    cerebro = bt.Cerebro(**kwargs)
    
    1. 添加数据馈送
    data = bt.BacktraderCSVData(dataname="mypath.days", timeframe=bt.TimeFrame.Days)
    cerebro.adddata(data)
    

    可以对于数据进行重新采样

    data = bt.BacktraderCSVData(dataname="mypath.min", timeframe=bt.TimeFrame.Minutes)
    cerebro.resampledata(data, timeframe=bt.TimeFrame.Days)
    

    或者

    data = bt.BacktraderCSVData(dataname="mypath.min", timeframe=bt.TimeFrame.Minutes)
    cerebro.replaydatadata(data, timeframe=bt.TimeFrame.Days)
    
    1. 添加策略
    cerebro.addstrategy(MyStrategy, myparam1=value1, myparam2=value2)
    

    优化参数可以采用迭代器

    cerebro.optstrategy(MyStrategy, myparam1=range(10, 20)
    
    1. 其它部分

    还可以通过一些其它元素来增强回测体验,相关方法为:

    • addwriter
    • addanalyzer
    • addobserver / addmultiobserver
    1. 更换经纪人
    broker = MyBroker()
    cerebro.broker = broker
    
    1. 接受通知

    当代理商或者数据馈送发送通知是,他们将通过Cerebro.notify_store执行。有三种方法可以执行这些通知:

    • 通过回调cerebro.addnotifycallback(callback)
    callback(msg, *args, **kwargs)
    
    • 在策略子类中,覆盖notify_store方法
    • 在Cerebro子类中覆盖notify_store方法

    执行回测

    result = cerebro.run(**kwargs)
    

    标准观察员

    • 一个经纪人观察员跟踪cashvalue
    • 一个交易员观察员
    • 一个买卖观察员

    返回结果

    result = cerebro.run(**kwargs)
    

    result的格式取决于run是否使用了优化

    • 添加一个策略addstrategy,返回一个结果
    • 添加1个或更多策略optstrategy,但会一组结果

    绘图

    cerebro.plot()
    

    回测逻辑

    1. 发送任何通知
    2. 要求数据馈送提供下一句分时柱线
    3. 通知有关订单、交易和现金/价值的经济人的信息
    4. 通知经纪人接受排队订单并使用新数据执行挂单
    5. 调用策略的next方法,允许策略评估新数据
    6. 告诉writer将数据写入新目标

    Cerebro - Memory Savings

    Saving Memory

    backtrader认为通过绘图获得的视觉反馈是一个很好且必须的事情。因此设计上将所有内容放在了内存中,这样设计有一些缺陷:

    • array.array用于数据存储的数据必须在超出某些边界时分配和移动数据
    • 内存不足的机器会受影响
    • 实时馈赠系统可以在线数周/数月接受分辨率为秒/分钟的数据
    • 有可能backtrader运行在嵌入式设备中

    因此需要backtrader支持动态内存方案:

    • exactbars(default: False)
      使用默认False值则内容存储在内存中

      可能的值

      • True or 1
        仅仅保存最小周期数据
        • 停用preloadrunonce
        • 停用绘图功能
      • -1 策略级别的数据会存储到内存中
        • 允许执行plottingpreloading
        • runonce将会停用
      • -2 作为策略属性保存的数据和指标保存在内存中

    Optimization improvements

    backtrader支持改善Data Feed和结果返回等。

    支持的参数:

    • optdata(Default: False) 优化DataFeed流程
    • optreturn(Default: True) 优化返回结果
      如果设置为True则返回的不是完整的策略对象,而是具有以下属性的对象
      • params(or p)
      • analyzers

    Data Feed Management

    • preload=True 回测前,预加载数据馈送
    • runonce=True 批处理模式

    运行测试

    • maxcpus=None 限定执行回测的cpu核数

    Exception

    编写异常可以尽早可能的退出,让用户清晰了解错误的发生。

    异常基类

    所有异常都是基于BacktraderError实现。

    访问异常

    import backtrader as bt
    
    ...
    
    class MyStrategy(bt.Strategy):
        
        def __init__(self):
            if something_goes_wrong():
                raise bt.errors.StrategySkipError # or raise bt.StrategySkipError
    

    已知的异常

    • StrategySkipError 跳过该策略的异常

    Writer

    以下内容将写入流

    • 带有数据源、策略、指标和观察者的csv流
    • 属性的总结
      • 数据馈送
      • 策略
      • 指标/观察者
      • 分析器

    将writer添加到系统中

    • 设置cerebro实例中的writer参数
    • 执行cerebro实例中的addwriter方法
    cerebro.addwriter(bt.WriterFile, csv=True)
    

    DataFeed

    Data Feed

    backtrader提供了一组数据馈送器

    • Yahoo
    • VisualChart
    • Backtrader CSV
    • Generic CSV support

    Data Feed Common paramters

    • dataname(default: None) Required
    • name(default: “”) 绘图中装饰使用
    • fromdate(default: mindate) 开始时间
    • todate(default: maxdate) 结束时间
    • timeframe(default: TimeFrame.Days) 可能的值: Ticks, Seconds, Minutes, Days, Weeks, Months和Years
    • compression(default: 1) 样条图的实际条数
    • sessionstart(default: None) 设置数据会话开始时间
    • sessionend(default: None) 设置数据会话结束时间

    CSV Data Feed Common parameters

    • headers(default: True)
    • separator(default: ‘,’)

    GenericCSVData

    • dataname
    • datetime(default: 0)
    • time(default: -1)
    • open(default: 1), high(default: 2), low(default: 3), close(default: 4), volume(default: 5), opeinterest(default: 6)
    • nullvalue(default: float(‘NaN’))
    • dtformat(default: %Y-%m-%d %H:%M:%S)
    • tmformat(default: %H:%M:%S)

    Extending a Datafeed

    可以通过继承的方法,扩展数据馈送,增加部分数据。

    from backtrader.feeds import GenericCSVData
    
    class GenericCSV_PE(GenericCSVData):
        lines = ('pe', )
        params = (('pe', 8), )
    

    Data - Multiple Timeframes

    有时投资决策是在不同的时间范围内做出的,比如每周的趋势指标和每日的执行指标。甚至5分钟和60分钟。

    这意味着需要组合多个时间范围的数据,backtrader支持这种组合。

    cerebro已经支持了该种策略,用户应该遵循以下规则:

    • 时间范围最小的数据最先添加
    • 数据必须正确对齐才有意义

    函数cerebro.resample用于创建更大的时间范围。

    # Load the Data
    datapath = args.dataname or '../../datas/2006-day-001.txt'
    data = btfeeds.BacktraderCSVData(dataname=datapath)
    cerebro.adddata(data)  # First add the original data - smaller timeframe
    
    tframes = dict(daily=bt.TimeFrame.Days, weekly=bt.TimeFrame.Weeks,
                   monthly=bt.TimeFrame.Months)
    
    # Handy dictionary for the argument timeframe conversion
    # Resample the data
    if args.noresample:
        datapath = args.dataname2 or '../../datas/2006-week-001.txt'
        data2 = btfeeds.BacktraderCSVData(dataname=datapath)
        # And then the large timeframe
        cerebro.adddata(data2)
    else:
        cerebro.resampledata(data, timeframe=tframes[args.timeframe],
                             compression=args.compression)
    
    # Run over everything
    cerebro.run()
    

    Data Resampling

    函数cerebro.resampledata支持的参数

    • timeframe(default: bt.TimeFrame.Days) 压缩的时间尺度
    • compression(default: 1) 压缩生成样条数
    • bar2edge(default: True) 使用时间边界进行目标冲采样
    • adjbartime(default: True) 调整重采样柱数
    • rightedge(default: True) 使用时间边界右边界
    • boundoff(default: 0) 按照一定数量的单位推动重采样/重播的边界
    import datetime
    import backtrader as bt
    
    
    cerebro = bt.Cerebro()
    data = bt.feeds.YahooFinanceCSVData(
        dataname="./data/orcl-1995-2014.txt",
        fromdate=datetime.datetime(2000, 1, 1),
        todate=datetime.datetime(2000, 12, 31),
        reverse=0
    )
    
    cerebro.adddata(data)
    cerebro.resampledata(data, timeframe=bt.TimeFrame.Weeks)
    
    cerebro.run()
    cerebro.plot(style='bar')
    

    Data Replay - 数据重播

    函数cerebro.replaydata支持的参数

    • timeframe(default: bt.TimeFrame.Days) 压缩的时间尺度
    • compression(default: 1) 压缩生成样条数
    • bar2edge(default: True) 使用时间边界进行目标冲采样
    • adjbartime(default: True) 调整重播柱数
    • rightedge(default: True) 使用时间边界右边界

    Data Filter

    定义datafilter需要满足两种形式:

    • callable(data, *args, **kwargs)
    • init(self, data, *args, **kwargs)和__call__(self, data, *args, **kwargs)

    简单示例

    class SessionFilter(object):
        def __init__(self, data):
            pass
    
        def __call__(self, data):
            if data.p.sessionstart <= data.datetime.time() <= data.p.sessionend:
                # bar is in the session
                return False  # tell outer data loop the bar can be processed
    
            # bar outside of the regular session times
            data.backwards()  # remove bar from data stack
            return True  # tell outer data loop to fetch a new bar
    
    展开全文
  • python backtrader

    2020-09-11 22:38:52
    (dotensor) C:\Users\deaokylin>pip install backtrader[plotting] -i https://pypi.tuna.tsinghua.edu.cn/simple ...Collecting backtrader[plotting] Downloading https://pypi.tuna.tsinghua.edu.cn/pack..

    (dotensor) C:\Users\deaokylin>pip install backtrader[plotting]  -i https://pypi.tuna.tsinghua.edu.cn/simple
    Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
    Collecting backtrader[plotting]
      Downloading https://pypi.tuna.tsinghua.edu.cn/packages/1a/bf/78aadd993e2719d6764603465fde163ba6ec15cf0e81f13e39ca13451348/backtrader-1.9.76.123-py2.py3-none-any.whl (410 kB)
         |████████████████████████████████| 410 kB 1.3 MB/s
    Requirement already satisfied: matplotlib; extra == "plotting" in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from backtrader[plotting]) (3.3.1)
    Collecting pillow>=6.2.0
      Downloading https://pypi.tuna.tsinghua.edu.cn/packages/f0/03/bec597cb6cc3cab8e3d684c6167c3beafae753f2ed6753af6f072a0714c1/Pillow-7.2.0-cp36-cp36m-win_amd64.whl (2.0 MB)
         |████████████████████████████████| 2.0 MB 182 kB/s
    Requirement already satisfied: python-dateutil>=2.1 in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from matplotlib; extra == "plotting"->backtrader[plotting]) (2.8.1)
    Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.3 in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from matplotlib; extra == "plotting"->backtrader[plotting]) (2.4.7)
    Requirement already satisfied: certifi>=2020.06.20 in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from matplotlib; extra == "plotting"->backtrader[plotting]) (2020.6.20)
    Requirement already satisfied: cycler>=0.10 in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from matplotlib; extra == "plotting"->backtrader[plotting]) (0.10.0)
    Requirement already satisfied: kiwisolver>=1.0.1 in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from matplotlib; extra == "plotting"->backtrader[plotting]) (1.2.0)
    Requirement already satisfied: numpy>=1.15 in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from matplotlib; extra == "plotting"->backtrader[plotting]) (1.15.4)
    Requirement already satisfied: six>=1.5 in d:\programdata\anaconda3\envs\dotensor\lib\site-packages (from python-dateutil>=2.1->matplotlib; extra == "plotting"->backtrader[plotting]) (1.10.0)
    Installing collected packages: backtrader, pillow
      Attempting uninstall: pillow
        Found existing installation: Pillow 5.4.1
        Uninstalling Pillow-5.4.1:
          Successfully uninstalled Pillow-5.4.1
    Successfully installed backtrader-1.9.76.123 pillow-7.2.0

    展开全文
  • 有不少的读者咨询如何更快的学习backtrader,在这一讲中,我将基于自己的经验与理解,分享下对backtrader整体框架的理解,以便能够让大家在学习的过程中能够事半功倍。 预计在下一篇文章中,将会分享一下,学习...
  • backtrader的画图主要是通过matplotlib来实现的,当cerebro中加载的数据比较多,指标比较多的时候,用matplotlib画图就会显得比较臃肿,现在也有不少人对backtrader的画图功能进行了扩展,比如backtrader_plotting...
  • backtrader_custom_datafeed:以json格式自定义生成的数据输入到backtrader
  • 课程通过学习Backtrader这一功能丰富的开源回测平台来逐步实现多个量化cta策略的回测实现。Backtrader是一个功能齐全的开源平台,但由于功能多样,且作者出于平台实现性的考虑,对于入门的使用者有一定的难度。这一...
  • backtrader中7种订单类型的示例代码,包括订单类型Market、Close、Limit、Stop、StopLimit、StopTrail、StopTrailLimit。
  • 扫地僧Backtrader给力教程样书和源码。目前唯一全面地、系统化介绍python开源量化框架backtrader的技术教程。
  • 1.backtrader官方文档全翻译,甚至包括全部代码的注释。 2.迄今为止,最全的backtrader资料。 3.适用范围:本地回测,搭建交易框架,量化交易。
  • 系统化介绍基于python的著名量化回测交易平台Backtrader的使用方法和技术细节 本系列课程基于我们独家编写的国内首本纸质版教程《扫地僧Backtrader给力教程系列一:量化回测核心篇》,本次课程基于其中第1章的内容。
  • Backtrader Binance机器人 机器人使用Backtrader在交易比特币的一个例子。 该项目未维护,仅是backtrader使用的一个示例。 不要在生产中使用它! 在 (PT-BR)中的演示 安装 激活 make init source venv/bin/...
  • Backtrader 来了!

    2021-04-14 00:18:24
    量化投资与机器学习公众号独家撰写今天,公众号将为全网读者带来Backtrader系列!公众号将为大家多维度、多策略、多场景来讲述Backtrader在量化投资领域的实践应用。同时,我们对...
  • backtrader参考手册.pdf

    2019-01-26 13:09:19
    一个功能丰富的Python测试和交易框架。backtrader能够让策略研究员专注于编写可重用的交易策略、指标和分析器,而不是花时间构建基础设施。
  • BitMEX in BackTrader

    2020-09-23 11:51:08
    BitMEX in BackTrader XBTUSD on BitMEX is an “inverse perpetual contract”. “Inverse” means the fund attained as margin is the underlying asset, i.e., BTC. This brings some trouble when using ...
  • Backtrader Orders 订单

    2021-04-10 10:06:30
    Cerebro is the key control system in backtrader and Strategy (a subclass) is the key control point of the end user. The latter needs a chaining method to other parts of the system and that’s where .
  • 18年的时候开始做量化分析,当时看了市场上很多的...在看到backtrader之前,我把abu的开源代码看了一遍,觉得难度不大,想在abu的基础上自己改一个平台出来。策略部分的功能基本上都开发完成,debug也完成了。偶然...
  • BackTrader简介 Backtrader是一个用python编写的回测和交易框架。功能强大,文档详细,开发社区也很活跃,出现问题容易得到支持。同时它还是一款开源的工具。遗憾的是交易接口不支持国内的券商,否则就可以直接交易...
  • backtrader_stocks_api-源码

    2021-03-10 15:54:00
    backtrader_stocks_api
  • backtrader_plotting是一个扩展库,用来增强backtrader的绘图功能。它不仅功能更加强大,比如能够把结果分成多个Tab显示,而且显示效果也更加优雅美观。所以推荐大家使用这个,而不是backtrader缺省的plot功能。 ...
  • BackTrader从数据采集到实盘交易

    千人学习 2019-05-09 15:36:44
    BackTrader从数据采集到实盘交易》是本系列的第一个中级课程。本网站的课程宗旨是缩短个人或小型投资者与大型机构投资者之间的的差距。 课程内容从python环境的安装开始使用,到股票数据采集,BackTrader开源回测...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,142
精华内容 456
关键字:

backtrader