Cerebro- backtrader中文教程
Cerebro
This类的基石backtrader
因为它作为一个中央点:
- 收集所有输入(Data Feeds),演员(Stratgegies),观众(Observers),批评(Analyzers)和资料员(Writers)保证节目仍然在任何moment.
- Execute那张回溯测试/或实时数据料/ trading
- Returning到绘图facilities
- 的results
Giving访问`收集input
- Start通过创建一个
cerebro
:cerebro = bt.Cerebro(**kwargs)
一些
**kwargs
控制执行支持,请参阅参考(相同的参数可以在以后施加到run
方法) - 添加Data feeds
最常用的图案是
cerebro.adddata(data)
,其中data
是data feed已经实例。例如:data = bt.BacktraderCSVData(dataname="mypath.days", timeframe=bt.TimeFrame.Days) cerebro.adddata(data)
Resampling和Replaying数据是可能的,遵循相同的模式:
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.
- Add
Strategies
不像
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
不会到达) - 其他elements
还有可以添加,以提高其他一些元素回溯测试经验。请参阅相关章节吧。方法分别是:
addwriter
addanalyzer
addobserver
(或addobservermulti
)
- 更改broker
Cerebro将使用默认的经纪人
backtrader
,但是这可能是重写:broker = MyBroker() cerebro.broker = broker # property using getbroker/setbroker methods
- 接收notifications
Ifdata feeds和/或brokers发送通知(或store提供商它创建它们),他们将通过接收
Cerebro.notify_store
方法。有三(3)的方式一起工作这些notifications- Add一个callback的
cerebro
通过实例addnotifycallback(callback)
调用。回调有支持此签名:
callback(msg, *args, **kwargs)
实际的
msg
,*args
和**kwargs
收到有定义实现(上完全取决于data/broker/store),但一般来说,不要指望他们是printable允许接收和experimentation.- Override在
notify_store
子类中的Strategy
方法,其被添加到cerebro
instance.
The签名:
notify_store(self, msg, *args, **kwargs)
- 子类
Cerebro
和覆盖notify_store
(相同的签名中该Strategy
)
这应该是最不优选method
- Add一个callback的
执行backtesting
There是做一个单一的方法,但它支持多种选项(可也指定实例化时)来决定如何运行:
result = cerebro.run(**kwargs)
见下面reerence了解哪些参数是available.
Standard Observers
cerebro
(除非另有说明)自动实例化three标准observers
- ABroker观察这使
cash
和value
(组合)的轨道 - 了Trades观察者应显示各行业如何有效有been
- 一个Buy/Sell观察者时操作executed
Should一个清洁剂,应记录绘制只是希望用stdstats=False
返还results
cerebro
其返回期间创建的策略的情况下,回溯测试。这使得分析他们做了什么,因为在所有元素策略是可访问的:
result = cerebro.run(**kwargs)
`的result
<>96<>run
<>97<>optimization<>98<>strategy与optstrategy
)补充说:
- 添加了
addstrategy
result
将是一个list
在backtesting - 1期间运行实例的`所有策略或者用
optstrategy
result
会添加更多的策略了list
的list
`。每个内部列表将包含后`每个优化run
Note
The默认行为策略optimization改为只回报在analyzers存在于系统中,以使消息传递跨计算机核心lighter.
If了一套完整的策略是希望为返回值,设置参数optreturn
到False
给予访问密谋facilities
As一个额外的,如果matplotlib
安装,该策略可绘制。与通常的图案是:
cerebro.plot()
用于参考和事物的流的部分Plotting
Backtesting logic
Brief轮廓见下文:
- 交付任何商店notifications
- Ask数据馈送传送下一组蜱/ bars
Versionchanged:改变在1.9.0.99版本:New Behavior
数据馈送通过在偷看同步的datetime这是会要通过现有的数据提要未来提供。订阅哪些没有在新的时期成交仍然提供旧的数据点,而数据提要其中有新的数据可供认购的发售这一个(与一起指标计算)
Old Behavior(当使用
oldsync=True
与Cerebro保留)的1st数据插入系统是
datamaster
和系统将等待能够为客户提供tickThe其他数据源是,或多或少,奴隶了
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
- Notify数据输入有关订单的排队经纪人通知的策略,交易现金/ value
- Tell代理接受排队命令和执行挂单新data
- Call战略
next
方法让战略评估新数据(这是在经纪人排队,也许发号施令)根据不同的阶段,可能是
prenext
或nextstart
前战略/指标最低期限要求metInternally策略也会踢
observers
,
indicators
,analyzers
等活性elements - Tell任何
writers
写数据到其target
Important考虑到:
Note
In步骤1
以上时data feeds提供新的设定酒吧,这些酒吧closed。这意味着数据已经happened.
As例如,orders在步骤策略发出4
不能executed与来自步骤数据1
.
这意味着,命令将与x +
的概念来执行。凡
1x
是执行该命令的那一刻吧和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<>
这将同时禁止preload
和runonce
。它将对存储器中保存schemes.
RunIndicators
<>183<>
maxcpus
<>184<>多少个内核同时使用optimization
stdstats
(默认:True
)
如果真默认观察员将被添加:经纪(现金和价值),贸易和BuySell
oldbuysell
(默认:False
)
如果stdstats
是True
和观察员将自动获得加入,该开关控制的主要行为BuySell
observer
False
:用现代行为在其中购买/卖出信号绘制下面/上面的低/高价格分别以避免弄乱plotTrue
:使用已弃用的行为,其中买入/卖出信号绘制,其中平均价格顺序执行的的在给定的时间时刻。当然,这可能是在一个OHLC条顶部或对克洛条线路,difficulting的plot.oldtrades
(默认:False
)
如果stdstats
是True
和观察员将自动获得加入,该开关控制的主要行为Trades
observer
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
这种方法可以在Cerebro
subclasses
实际的*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
类的组合。实例将在完成run
time
addobservermulti(obscls,*指定参数时,** kwargs)
添加一个Observer
类的组合。实例将在完成run
time
这将每一次的“数据”在系统中添加。用例是一个买/卖观察者观察其个人datas.
A反例是CashValue,其中观察系统范围values
<>406<>
<>407<>Analyzer
<>408<>run
time
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
实例被创建和kwargs
instantiation.
numfigs
期间传递给它在图表的指定数目的分割积减少图表密度如果wished
iplot
:如果True
和在运行notebook
的图表将显示inline
use
:它设置为所需matplotlib后端的名称。它会优先于iplot
start
:一个索引到策略或一个的日期时间线阵列datetime.date
, datetime.datetime
实例表示开始索引的策略或一个的日期时间线阵列:所述plot
end
的datetime.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,这一直是他们的标准behaviorpytz
实例。它将被用作这样为UTC时间转换到所选择的timezonestring
。实例化一个pytz
实例将被attempted.integer
。使用,对于策略,同时区的在对应data
的self.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
引用其必须为一个会话endoffset
一个datetime.timedelta
instance
Used抵消值
when
。它以一种有意义的使用与SESSION_START
和SESSION_END
,以组合来表示事情就像一个被称为计时器15 minutes
在会议结束后start.repeat
必须是datetime.timedelta
instanceIndicates如果1st电话后,进一步的调用将被安排在同一会话中定
repeat
deltaOnce定时器越过会议结束时就被复位到用于
when
weekdays
原始值:一个sorted迭代与指示对整数这天(ISO代码,星期一是1,星期日是7)定时器可以实际上是不invokedIf规定,定时器将在所有days
weekcarry
有效(默认:False
)。如果True
和平日是没有看到(例如:交易假期),定时器会在执行第二天(即使在新的一周)monthdays
:一sorted迭代的用于指示整数其中一个定时器,必须执行该月的日子。例如总是在一天15不指定monthIf,定时器将在所有days
monthcarry
有效(默认:True
)。如果一天中没有发现有(周末,假期交易),定时器将在接下来的执行可day.allow
(默认:None
)。其接收的回调datetime.date`实例,并返回True
如果日期允许定时器或否则返回False
tzdata
其可以是None
(默认值),一个pytz
实例或data feed
instance.None
:when
的表面价值被解释(这相当于以处理它,如果它在那里UTC即使它不是)pytz
比如:when
将被解释为指定由时区instance.data feed
实例指定的本地时间:when
会被解释为在通过的tz
参数指定的本地时间规定数据馈送instance.Note
If
when
是要么SESSION_START
或SESSION_END
和tzdata
是None
,在系统中的1st data feed(又名self.data0
)将用作参考,找出会议times.strats
(默认:False
)调用也是notify_timer
的strategiescheat
(默认False
)如果True
定时器将被称为代理之前,有机会评估订单。这将打开根据开盘价例如合适的机会来发布命令会议starts*args
前:任何额外的参数将被传递给notify_timer
**kwargs
:任何额外kwargs将被传递给notify_timer
返回值:
- 创建的计时器
notify_timer(计时器的时候,*指定参数时,** kwargs)
接收计时器通知其中timer
是这是计时器通过返回add_timer
和when
就是通话时间。args
和kwargs
是传递给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 [页面没有自动跳转]]其中在元件中括号内是optionalsize
是一个整数(正到buy,负到sell)price
是浮点值/ integerdata
如果存在可以采用任何以下values- None的 – 的1st数据馈送将被用作target
- integer – 数据与该索引(插入为了在Cerebro)将被used
- string – 具有该名称的数据,分配给例如具有
cerebro.addata(data, name=value)
,将是target
notify
(默认:True)如果
True
的1st战略插入系统将创建人工订单的通知后的信息从在orders
Note
隐在说明是需要添加一个数据馈送这是命令的目标。这例如通过在需要分析仪,其跟踪例如returns