您的位置:  首页 » 量化交易与机器学习 » backtrader » Cerebro- backtrader中文教程

Cerebro

This类的基石backtrader因为它作为一个中央点:

  1. 收集所有输入(Data Feeds),演员(Stratgegies),观众(Observers),批评(Analyzers)和资料员(Writers)保证节目仍然在任何moment.
  2. Execute那张回溯测试/或实时数据料/ trading
  3. Returning到绘图facilities
  4. 的results

Giving访问`收集input

  1. Start通过创建一个cerebro
    cerebro = bt.Cerebro(**kwargs)
    

    一些**kwargs控制执行支持,请参阅参考(相同的参数可以在以后施加到run方法)

  2. 添加Data feeds

    最常用的图案是cerebro.adddata(data),其中datadata feed已经实例。例如:

    data = bt.BacktraderCSVData(dataname="mypath.days", timeframe=bt.TimeFrame.Days)
    cerebro.adddata(data)
    

    ResamplingReplaying数据是可能的,遵循相同的模式:

    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)
    

    该系统可以接受任何数量的数据饲料,包括混合常规数据与重采样和/或重放的数据。当然,一些本combinationns将肯定就没有任何意义和限制适用于为了能够结合DATAS:time aligment。查看数据 – 不同的时间周期,数据重采样 – Resampling`和数据 – 重播sections.

  3. AddStrategies

    不像datas feeds这已经是一个类的实例,cerebro采取直接的Strategy<>34<>in an optimization scenario the class
    will be instantiated several times and passed different arguments

    <>35<>optimization<>36<>

    cerebro.addstrategy(MyStrategy, myparam1=value1, myparam2=value2)
    

    <>37<><>38<><>39<><>40<><>41<>

    cerebro.optstrategy(MyStrategy, myparam1=range(10, 20))
    

    <>42<>MyStrategy<>43<>myparam1取值从10到19(还记得范围在Python是半开放和20不会到达)

  4. 其他elements

    还有可以添加,以提高其他一些元素回溯测试经验。请参阅相关章节吧。方法分别是:

    • addwriter
    • addanalyzer
    • addobserver(或addobservermulti
  5. 更改broker

    Cerebro将使用默认的经纪人backtrader,但是这可能是重写:

    broker = MyBroker()
    cerebro.broker = broker  # property using getbroker/setbroker methods
    
  6. 接收notifications

    Ifdata feeds和/或brokers发送通知(或store提供商它创建它们),他们将通过接收Cerebro.notify_store方法。有三(3)的方式一起工作这些notifications

    • Add一个callbackcerebro通过实例addnotifycallback(callback)调用。回调有支持此签名:
    callback(msg, *args, **kwargs)
    

    实际的msg, *args**kwargs收到有定义实现(上完全取决于data/broker/store),但一般来说,不要指望他们是printable允许接收和experimentation.

    • Override在notify_store子类中的Strategy方法,其被添加到cerebroinstance.

    The签名:notify_store(self, msg, *args, **kwargs)

    • 子类Cerebro和覆盖notify_store(相同的签名中该Strategy

    这应该是最不优选method

执行backtesting

There是做一个单一的方法,但它支持多种选项(可也指定实例化时)来决定如何运行:

result = cerebro.run(**kwargs)

见下面reerence了解哪些参数是available.

Standard Observers

cerebro(除非另有说明)自动实例化three标准observers

  • ABroker观察这使cashvalue(组合)的轨道
  • Trades观察者应显示各行业如何有效有been
  • 一个Buy/Sell观察者时操作executed

Should一个清洁剂,应记录绘制只是希望用stdstats=False

返还results

cerebro其返回期间创建的策略的情况下,回溯测试。这使得分析他们做了什么,因为在所有元素策略是可访问的:

result = cerebro.run(**kwargs)

`的result<>96<>run<>97<>optimization<>98<>strategyoptstrategy)补充说:

  • 添加了addstrategy

    result将是一个list在backtesting

  • 1期间运行实例的`所有策略或者用optstrategy

    result会添加更多的策略了listlist`。每个内部列表将包含后`每个优化run

Note

The默认行为策略optimization改为只回报在analyzers存在于系统中,以使消息传递跨计算机核心lighter.

If了一套完整的策略是希望为返回值,设置参数optreturnFalse

给予访问密谋facilities

As一个额外的,如果matplotlib安装,该策略可绘制。与通常的图案是:

cerebro.plot()

用于参考和事物的流的部分Plotting

Backtesting logic

Brief轮廓见下文:

  1. 交付任何商店notifications
  2. Ask数据馈送传送下一组蜱/ bars

    Versionchanged:改变在1.9.0.99版本:New Behavior

    数据馈送通过在偷看同步的datetime这是会要通过现有的数据提要未来提供。订阅哪些没有在新的时期成交仍然提供旧的数据点,而数据提要其中有新的数据可供认购的发售这一个(与一起指标计算)

    Old Behavior(当使用oldsync=TrueCerebro保留)

    的1st数据插入系统是datamaster和系统将等待能够为客户提供tick

    The其他数据源是,或多或少,奴隶了datamaster和:

     * If the next tick to deliver is newer (datetime-wise) than the one
       delivered by the `datamaster` it will not be delivered
    
     * May return without delivering a new tick for a number of reasons
    

    的逻辑被设计为容易地同步多个数据馈送和不同timeframes

  3. Notify数据输入有关订单的排队经纪人通知的策略,交易现金/ value
  4. Tell代理接受排队命令和执行挂单新data
  5. Call战略next方法让战略评估新数据(这是在经纪人排队,也许发号施令)

    根据不同的阶段,可能是prenextnextstart前战略/指标最低期限要求met

    Internally策略也会踢observers,
    indicators, analyzers等活性elements

  6. Tell任何writers写数据到其target

Important考虑到:

Note

In步骤1以上时data feeds提供新的设定酒吧,这些酒吧closed。这意味着数据已经happened.

As例如,orders在步骤策略发出4不能executed与来自步骤数据1.

这意味着,命令将与x +
1
的概念来执行。凡x是执行该命令的那一刻吧和x + 1下一个,这是最早的时刻了一个可能的顺序execution

Reference

class backtrader.Cerebro()

PARAMS:

  • preload(默认值:True

是否预装不同的data feeds传递到脑的在Strategies

  • runonce(默认:True

运行Indicators<>172<>

  • live<>173<>False<>174<>

<>175<>live<>176<>islive<>177<>live<>178<>

这将同时禁止preloadrunonce。它将对存储器中保存schemes.

RunIndicators<>183<>

  • maxcpus<>184<>

    多少个内核同时使用optimization

  • stdstats(默认:True

如果真默认观察员将被添加:经纪(现金和价值),贸易和BuySell

  • oldbuysell(默认:False

如果stdstatsTrue和观察员将自动获得加入,该开关控制的主要行为BuySellobserver

  • False:用现代行为在其中购买/卖出信号绘制下面/上面的低/高价格分别以避免弄乱plot
  • True:使用已弃用的行为,其中买入/卖出信号绘制,其中平均价格顺序执行的的在给定的时间时刻。当然,这可能是在一个OHLC条顶部或对克洛条线路,difficulting的plot.
  • oldtrades(默认:False

如果stdstatsTrue和观察员将自动获得加入,该开关控制的主要行为Tradesobserver

  • False<>203<>
  • True<>204<>
  • exactbars<>205<>False<>206<>

<>207<>

<>208<>

* `True` or `1`: all “lines” objects reduce memory usage to the
  automatically calculated minimum period.

  If a Simple Moving Average has a period of 30, the underlying data
  will have always a running buffer of 30 bars to allow the
  calculation of the Simple Moving Average

  * This setting will deactivate `preload` and `runonce`

  * Using this setting also deactivates **plotting**

* `-1`: datafreeds and indicators/operations at strategy level will
  keep all data in memory.

  For example: a `RSI` internally uses the indicator `UpDay` to
  make calculations. This subindicator will not keep all data in
  memory

  * This allows to keep `plotting` and `preloading` active.

  * `runonce` will be deactivated

* `-2`: data feeds and indicators kept as attributes of the
  strategy will keep all points in memory.

  For example: a `RSI` internally uses the indicator `UpDay` to
  make calculations. This subindicator will not keep all data in
  memory

  If in the `__init__` something like
  `a = self.data.close - self.data.high` is defined, then `a`
  will not keep all data in memory

  * This allows to keep `plotting` and `preloading` active.

  * `runonce` will be deactivated
  • objcache<>209<>False<>210<>

<>211<>

bp = self.data.close - TrueLow(self.data)
tr = TrueRange(self.data)  # -> creates another TrueLow(self.data)

<>212<>True<>213<><>214<> TrueLow(self.data)<>215<>TrueRange<>216<>bp<>217<>

<>218<>

  • writer<>219<>False<>220<>

<>221<>True默认WriterFile将创建这将打印到标准输出。它将被添加到策略(除了任何由用户代码添加其他作家)

  • tradehistory(默认值:False

如果设置为True下,会激活更新事件记录在各个行业所有的策略。这也可以在每个策略实现基础与战略方法set_tradehistory

  • optdatas(默认:True

如果True和优化(并且系统可以preload和使用runonce,数据预载将只有一次的主要工序完成为了节省时间和resources.

The测试表明近似20%加速从样品移动执行中83秒的66

  • optreturn(默认:True

如果True优化结果不会是完整的Strategy对象(和所有datas, indicators, observers<>241<>Strategy<>242<>

* `params` (or `p`) the strategy had for the execution

* `analyzers` the strategy has executed

<>243<>analyzers<>244<>params<>245<>indicators<>246<>

<>247<>13% - 15%<>248<>optdatas<>249<>32%<>250<>

  • oldsync<>251<>False<>252<>

<>253<>

<>254<>

  • tz<>255<>None<>256<>

<>257<>tz可以be

* `None`: in this case the datetime displayed by strategies will be
  in UTC, which has been always the standard behavior

* `pytz` instance. It will be used as such to convert UTC times to
  the chosen timezone

* `string`. Instantiating a `pytz` instance will be attempted.

* `integer`. Use, for the strategy, the same timezone as the
  corresponding `data` in the `self.datas` iterable (`0` would
  use the timezone from `data0`)
  • cheat_on_open(默认:False

next_open策略方法将被调用。有时候是这样的之前next和前经纪人有机会评估命令。该指标尚未重新计算。这允许发出奥德其中考虑到先前的指标一天,但使用了open价格为股权calculations

对于cheat_on_open订单执行,还需要使叫cerebro.broker.set_coo(True)或instantite与经纪人BackBroker(coo=True)(其中,coo代表骗上打开)或集该broker_coo参数True<>270<>

  • broker_coo<>271<>True<>272<>

<>273<>set_coo<>274<>True<>275<>cheat_on_open<>276<>cheat_on_open<>277<>True

  • quicknotify<>278<>False<>279<>

<>280<>next<>281<>True<>282<>qcheck<>283<>

<>284<>False<>285<>True

<>286<>

<>287<>

<>288<>

  • callback(msg, *args, **kwargs)

<>289<>msg, *args<>290<>**kwargs<>291<>data/broker/store<>292<>printable<>293<>

<>294<>

<>295<>

<>296<>Cerebro<>297<>

实际的msg, *args**kwargs收到的是定义实现(完全取决于data/broker/store),但一般来说,不要指望他们是printable允许接待和experimentation.

adddatacb(回调)

添加一个回调以获取这将被处理的消息notify_data回调method

The签名必须支持以下内容:

  • 回调(数据,状态,* ARGS,** kwargs)

实际的*args<>308<>**kwargs<>309<>data/broker/store<>310<>printable允许接收和experimentation.

notify_data(数据,状态,*指定参数时,** kwargs)

在接收数据cerebro

这种方法可以在Cerebrosubclasses

实际的*args<>317<>**kwargs收到的是定义实现(上完全取决于data/broker/store),但一般来说,不要指望他们是printable允许接收和experimentation.

adddata(数据,姓名=无)

添加了Data Feed实例的mix.

Ifname是不是没有它会被放入data._name这是意味着装饰/绘制purposes.

resampledata(数据名,名=无,** kwargs)

添加一个Data Feed由system

Ifname可以重新取样`是不是没有它会被放入data._name这是意味着装饰/绘图purposes.

Any其他kwargs像timeframe, compression, todate<>334<>

<>335<>

<>336<>Data Feed<>337<>

<>338<>name是不是无它会被放入data._name这是意味着装饰/绘图purposes.

Any其他kwargs像timeframe, compression, todate这通过重播过滤器的支持将传递transparently

<>343<>

<>344<>

<>345<>name<>346<>data._name<>347<>

<>348<>None<>349<><>350<><>351<>

<>352<>

<>353<>

<>354<>name<>355<>data._name<>356<>

<>357<>None<>358<><>359<><>360<>

<>361<>

<>362<>

<>363<>Strategy<>364<>run<>365<>

<>366<>

<>367<>

<>368<>

<>369<>Strategy<>370<>run<>371<>

<>372<>

<>373<>period<>374<>optstrategy<>375<>

  • cerebro.optstrategy(MyStrategy,周期=(15,25))

这将执行一个优化值15和25 Whereas

  • cerebro.optstrategy(MyStrategy,周期=范围(15,25))

<>379<>period<>380<>

<>381<>

  • <>382<>

<>383<>period<>384<>

backtrader<>385<>

  • cerebro.optstrategy(MyStrategy,周期= 15)

和如果possible

optcallback(CB)

添加一个callback到回调的名单将与被称为优化时,每个策略一直run

The签名:CB(策略)

addindicator(indcls,* ARGS,** kwargs)

添加一个Indicator类的组合。实例将在完成run的时间在传递strategies

addobserver(obscls,*指定参数时,** kwargs)

添加一个Observer类的组合。实例将在完成runtime

addobservermulti(obscls,*指定参数时,** kwargs)

添加一个Observer类的组合。实例将在完成runtime

这将每一次的“数据”在系统中添加。用例是一个买/卖观察者观察其个人datas.

A反例是CashValue,其中观察系统范围values

<>406<>

<>407<>Analyzer<>408<>runtime

addwriter(wrtcls,* ARGS,** kwargs)

添加一个Writer类的组合。实例将在完成run时间cerebro

运行(** kwargs)

核心方法来执行回溯测试。任何kwargs传递给它会影响到标准参数的值Cerebro是实例化with.

如果cerebro有没有DATAS方法会立即保释out.

它有不同的返回值:

  • 对于没有优化:列表contanining战略的实例加入班级,addstrategy
  • 对于优化:包含的实例列表的列表添加策略类与addstrategy

RUNSTOP()

如果从策略中调用或其他任何地方,包括其他线程的执行,就立即停止为possible.

setbroker(经纪人)

设置一个特定的broker实例,该策略,更换一个从cerebro.

getbroker继承()

返回经纪人instance.

This也可作为一个property用名称broker

图(绘图仪=无,numfigs = 1,IPLOT =真,开始=无,结束=无,宽度= 16,高度= 9,DPI = 300,紧=真,采用=无,** kwargs)

地块内cerebro

If策略plotter是没有默认的Plot实例被创建和kwargsinstantiation.

numfigs期间传递给它在图表的指定数目的分割积减少图表密度如果wished

iplot:如果True和在运行notebook的图表将显示inline

use:它设置为所需matplotlib后端的名称。它会优先于iplot

start:一个索引到策略或一个的日期时间线阵列datetime.date, datetime.datetime实例表示开始索引的策略或一个的日期时间线阵列:所述plot

enddatetime.date, datetime.datetime实例表示端在保存figure

width英寸:在保存figure

height英寸:质量点每保存figure

dpi英寸的plot

tight的`:仅保存实际内容和figure

addsizer的不是框架(sizercls,*指定参数时,** kwargs)

添加一个Sizer类(和args),其是默认的分级机对任何策略添加到cerebro

addsizer_byidx(IDX,sizercls,*指定参数时,** kwargs)

由IDX添加一个Sizer类。这IDX是一个参考兼容在一个由addstrategy返回。只有战略,引用idx将收到此size

add_signal(sigtype,sigcls,* sigargs,** sigkwargs)

添加一个信号,以将在后面加入到系统SignalStrategy

signal_concurrent(ONOFF)

如果信号被加入到该系统和concurrent值设置为True,并发订单将被allowed

signal_accumulate(ONOFF)

如果信号被添加到系统和accumulate值设置为True,在市场进入市场的时候已经,将允许增加一个position

signal_strategy(stratcls,* ARGS,** kwargs)

添加一个SignalStrategy子类可以接受signals

addcalendar(CAL)

增加了全球贸易日历系统。个人数据供稿可能有单独的日历,其覆盖全局one

cal可以的TradingCalendar一个字符串或的pandas_market_calendars。一个字符串会会实例的PandasMarketCalendar(这需要模块pandas_market_calendar安装在system.

如果TradingCalendarBase的子类传递(不是实例),它将instantiated

addtz(TZ)

这也可以使用参数做tz

增加了对战略的全球时区。该参数tz可以be

  • None:在这种情况下,通过策略显示的日期时间将是在UTC,这一直是他们的标准behavior
  • pytz实例。它将被用作这样为UTC时间转换到所选择的timezone
  • string。实例化一个pytz实例将被attempted.
  • integer。使用,对于策略,同时区的在对应dataself.datas可迭代(0将使用时区从data0

add_timer(何时,偏移= datetime.timedelta(0),则重复= datetime.timedelta(0),平日= [],weekcarry =假,monthdays =[],monthcarry =真,允许=无,的tzdata =无,strats =假,欺骗=假,*指定参数时,** kwargs)

时刻表的计时器来调用notify_timer

  • Parameters

    when) – 可以be

    • datetime.time实例(见下文tzdata
    • bt.timer.SESSION_START引用会话开始
    • bt.timer.SESSION_END引用其必须为一个会话end
    • offset一个datetime.timedeltainstance

    Used抵消值when。它以一种有意义的使用与SESSION_STARTSESSION_END,以组合来表示事情就像一个被称为计时器15 minutes在会议结束后start.

    • repeat必须是datetime.timedeltainstance

      Indicates如果1st电话后,进一步的调用将被安排在同一会话中定repeatdelta

      Once定时器越过会议结束时就被复位到用于when

    • weekdays原始值:一个sorted迭代与指示对整数这天(ISO代码,星期一是1,星期日是7)定时器可以实际上是不invoked

      If规定,定时器将在所有days

    • weekcarry有效(默认:False)。如果True和平日是没有看到(例如:交易假期),定时器会在执行第二天(即使在新的一周)
    • monthdays:一sorted迭代的用于指示整数其中一个定时器,必须执行该月的日子。例如总是在一天15不指定month

      If,定时器将在所有days

    • monthcarry有效(默认:True)。如果一天中没有发现有(周末,假期交易),定时器将在接下来的执行可day.
    • allow(默认:None)。其接收的回调datetime.date`实例,并返回True如果日期允许定时器或否则返回False
    • tzdata其可以是None(默认值),一个pytz实例或data feedinstance.

      Nonewhen的表面价值被解释(这相当于以处理它,如果它在那里UTC即使它不是)

      pytz比如:when将被解释为指定由时区instance.

      data feed实例指定的本地时间:when会被解释为在通过的tz参数指定的本地时间规定数据馈送instance.

      Note

      Ifwhen是要么SESSION_STARTSESSION_ENDtzdataNone,在系统中的1st data feed(又名self.data0)将用作参考,找出会议times.

    • strats(默认:False)调用也是notify_timer的strategies
    • cheat(默认False)如果True定时器将被称为代理之前,有机会评估订单。这将打开根据开盘价例如合适的机会来发布命令会议starts
    • *args前:任何额外的参数将被传递给notify_timer
    • **kwargs:任何额外kwargs将被传递给notify_timer

返回值:

  • 创建的计时器

notify_timer(计时器的时候,*指定参数时,** kwargs)

接收计时器通知其中timer是这是计时器通过返回add_timerwhen就是通话时间。argskwargs是传递给add_timer

实际的when时间可以以后任何额外的参数,但系统可能不会能之前调用定时器。该值是定时器值和无系统time.

add_order_history(订单,通知= TRUE)

添加到在经纪人直接执行订单的历史性能evaluation

  • orders:是一个可迭代(例如:列表,元组,迭代器,发电机)在其中每个元素也将是一个可迭代(长度)与以下子元素(2种格式是可能的)

    [datetime, size, price][datetime, size, price, data]

    Note

    it必须进行排序(或产生已排序的元素)由日期时间ascending

    其中:

    • datetime是一个pythondate/datetime实例或串与格式YYYY-MM-DD [THH:MM:SS [页面没有自动跳转]]其中在元件中括号内是optional
    • size是一个整数(正到buy,负到sell
    • price是浮点值/ integer
    • data如果存在可以采用任何以下values
      • None的 – 的1st数据馈送将被用作target
      • integer – 数据与该索引(插入为了在Cerebro)将被used
      • string – 具有该名称的数据,分配给例如具有cerebro.addata(data, name=value),将是target
  • notify(默认:True

    如果True的1st战略插入系统将创建人工订单的通知后的信息从在orders

Note

隐在说明是需要添加一个数据馈送这是命令的目标。这例如通过在需要分析仪,其跟踪例如returns

发表评论

电子邮件地址不会被公开。 必填项已用*标注