BackTrader 中文文档(十一)(2)

简介: BackTrader 中文文档(十一)

BackTrader 中文文档(十一)(1)https://developer.aliyun.com/article/1505308

观察者参考

原文:www.backtrader.com/docu/observers-reference/

基准

backtrader.observers.Benchmark()

此观察者存储策略的回报和作为系统传递的数据之一的参考资产的回报

参数:

  • timeframe(默认:None)如果为None,则将报告整个回测期间的完整收益
  • compression(默认:None
    仅用于子日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架
  • data(默认:None
    用于跟踪的参考资产,以进行比较。
    注意:此数据必须已添加到 cerebro 实例中,并使用 addataresampledatareplaydata
  • _doprenext(默认:False
    基准将从策略启动的时间点开始进行(即:当策略的最小周期已满足时)。
    将此设置为True将记录从数据源的起始点开始的基准值。
  • firstopen(默认:False
    将其保持为False可确保价值与基准之间的第一个比较点从 0%开始,因为基准不会使用其开盘价。
    查看 TimeReturn 分析器参考以获取参数含义的全面解释
  • fund(默认:None
    如果为None,则经纪人的实际模式(fundmode - True/False)将被自动检测以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的 set_fundmode
    将其设置为TrueFalse以获取特定行为

请记住,在run的任何时刻,可以通过查看lines的名称以索引0来检查当前值。

经纪人

类 backtrader.observers.Broker(*args, **kwargs)

此观察者在经纪人中跟踪当前现金金额和投资组合价值(包括现金)

参数:无

经纪人 - 现金

类 backtrader.observers.Cash(*args, **kwargs)

此观察者跟踪经纪人中当前现金金额

参数:无

经纪人 - 值

类 backtrader.observers.Value(*args, **kwargs)

此观察者在经纪人中跟踪当前投资组合价值,包括现金。

参数:

  • fund(默认:None
    如果为None,则经纪人的实际模式(fundmode - True/False)将被自动检测以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的 set_fundmode
    将其设置为TrueFalse以获取特定行为

BuySell

类 backtrader.observers.BuySell(*args, **kwargs)

此观察者跟踪个别买入/卖出订单(单独执行),并将它们绘制在图表上,沿着执行价格水平附近的数据

参数:

* `barplot` (default: `False`) Plot buy signals below the minimum and
  sell signals above the maximum.
  If `False` it will plot on the average price of executions during a
  bar
* `bardist` (default: `0.015` 1.5%) Distance to max/min when
  `barplot` is `True

回撤

类 backtrader.observers.DrawDown()

此观察者跟踪当前回撤水平(绘制)和最大回撤(不绘制)水平

参数:

  • fund(默认:None
    如果为None,则会自动检测经纪人的实际模式(基金模式 - True/False),以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的set_fundmode
    将其设置为TrueFalse以实现特定行为

时间收益

backtrader.observers.TimeReturn()

该观察器存储策略的收益

参数:

  • timeframe(默认:None)如果为None,则将报告整个回测期间的完整收益
    TimeFrame.NoTimeFrame传递以考虑整个数据集而没有时间约束
  • compression(默认:None
    仅用于子日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架
  • fund(默认:None
    如果为None,则会自动检测经纪人的实际模式(基金模式 - True/False),以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的set_fundmode
    将其设置为TrueFalse以实现特定行为

请记住,在run的任何时刻,可以通过查看索引为0名称来检查当前值。

交易

backtrader.observers.Trades()

该观察器跟踪完整交易并绘制在关闭交易时实现的 PnL 水平。

当仓位从 0(或越过 0)变为 X 时,交易处于开放状态,然后在回到 0(或以相反方向越过 0)时关闭

参数:

* `pnlcomm` (def: `True`)
  Show net/profit and loss, i.e.: after commission. If set to `False`
  if will show the result of trades before commission

对数收益

backtrader.observers.LogReturns()

该观察器存储策略或 a 的对数收益

参数:

  • timeframe(默认:None)如果为None,则将报告整个回测期间的完整收益
    TimeFrame.NoTimeFrame传递以考虑整个数据集而没有时间约束
  • compression(默认:None
    仅用于子日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架
  • fund(默认:None
    如果为None,则会自动检测经纪人的实际模式(基金模式 - True/False),以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的set_fundmode
    将其设置为TrueFalse以实现特定行为

请记住,在run的任何时刻,可以通过查看索引为0名称来检查当前值。

对数收益 2

backtrader.observers.LogReturns2()

扩展观察器 LogReturns 以显示两个工具

基金价值

backtrader.observers.FundValue(*args, **kwargs)

该观察器跟踪当前基金样式的值

参数:无

基金份额

backtrader.observers.FundShares(*args, **kwargs)

该观察器跟踪当前基金样式的份额

参数:无

Sizers

Sizers

原文:www.backtrader.com/docu/sizers/sizers/

  • 智能押注

Strategy提供了交易方法,即:buysellclose。让我们看看buy的签名:

def buy(self, data=None,
        size=None, price=None, plimit=None,
        exectype=None, valid=None, tradeid=0, **kwargs):

注意,如果调用者没有指定,size的默认值为None。这就是Sizers发挥重要作用的地方:

  • size=None请求Strategy向其Sizer请求实际押注

这显然意味着Strategies有一个Sizer:是的,确实!背景机制会为Strategy添加一个默认的sizer,如果用户没有添加一个。添加到strategy的默认SizerSizerFix。定义的初始行:

class SizerFix(SizerBase):
    params = (('stake', 1),)

很容易猜到这个Sizer只是使用1单位的stake买入/卖出(无论是股票、合约等)

使用Sizers

Cerebro

Sizers可以通过 2 种不同的方法通过Cerebro添加:

  • addsizer(sizercls, *args, **kwargs)
    添加一个将应用于添加到cerebro的任何策略的Sizer。这可以说是默认的Sizer。例如:
cerebro = bt.Cerebro()
cerebro.addsizer(bt.sizers.SizerFix, stake=20)  # default sizer for strategies` 
  • addsizer_byidx(idx, sizercls, *args, **kwargs)Sizer只会添加到由idx引用的Strategy这个idx可以从addstrategy的返回值中获取。就像这样:
cerebro = bt.Cerebro()
cerebro.addsizer(bt.sizers.SizerFix, stake=20)  # default sizer for strategies
idx = cerebro.addstrategy(MyStrategy, myparam=myvalue)
cerebro.addsizer_byidx(idx, bt.sizers.SizerFix, stake=5)
cerebro.addstrategy(MyOtherStrategy)` 
  • 在这个例子中:
  • 系统中已经添加了一个默认的Sizer。这适用于所有没有分配特定Sizer的策略
  • 对于MyStrategy,在收集到其插入idx之后,会添加一个特定的调整sizer参数的sizer
  • 第二个策略,MyOtherStrategy,被添加到系统中。没有为其添加特定的Sizer
  • 这意味着:
  • MyStrategy最终将拥有一个内部特定的Sizer
  • MyOtherStrategy将获得默认的sizer

注意

default并不意味着策略共享一个单一的Sizer实例。每个strategy都会收到一个不同的默认sizer实例

要共享一个单一实例,要共享的sizer应该是一个单例类。如何定义一个超出了backtrader的范围

Strategy

Strategy类提供了一个 API:setsizergetsizer(以及一个property sizer)来管理Sizer。签名如下:

  • def setsizer(self, sizer): 接受一个已实例化的Sizer
  • def getsizer(self): 返回当前的Sizer实例
  • sizer是可以直接get/set的属性

在这种情况下,Sizer可以是:

  • 作为参数传递给策略
  • __init__期间使用Sizersetsizer属性设置,如:
class MyStrategy(bt.Strategy):
    params = (('sizer', None),)
    def __init__(self):
        if self.p.sizer is not None:
            self.sizer = self.p.sizer` 
  • 例如,这将允许在与cerebro调用发生在同一级别的Sizer并将其作为参数传递给系统中的所有策略,从而有效地实现共享Sizer

Sizer开发

这样做很容易:

  1. backtrader.Sizer继承这使您可以访问self.strategyself.broker,尽管在大多数情况下不需要。可以通过broker访问的内容
  • 通过 self.strategy.getposition(data) 获取数据的持仓
  • 通过 self.broker.getvalue() 获取完整的投资组合价值
    请注意,当然也可以用 self.strategy.broker.getvalue() 来实现
  1. 其他一些东西已经作为参数列在下面了
  2. 覆盖方法_getsizing(self, comminfo, cash, data, isbuy)
  • comminfo: 包含有关数据委托的委员会信息的 CommissionInfo 实例,并允许计算持仓价值、操作成本和操作的委员会费用
  • cash: 经纪人当前可用的现金
  • data: 操作目标
  • isbuy: 对于 买入 操作将为 True,对于 卖出 操作将为 False
  1. 该方法返回 买入/卖出 操作的期望 size
    返回的符号无关紧要,即:如果操作是 卖出 操作(isbuy 将为 False),则该方法可能返回 5-5卖出 操作仅使用绝对值。
    Sizer 已经去到 broker 并为给定的 data 请求了 委员会信息,实际的 现金 水平,并提供了对操作目标 data 的直接引用

让我们来看一下 FixedSize 尺寸器的定义:

import backtrader as bt
class FixedSize(bt.Sizer):
    params = (('stake', 1),)
    def _getsizing(self, comminfo, cash, data, isbuy):
        return self.params.stake

这很简单,因为 Sizer 不做任何计算,参数就在那里。

但是这种机制应该允许构建复杂的 大小(又称 定位)系统,在进入/退出市场时管理利害关系。

另一个例子:头寸翻转者

class FixedRerverser(bt.FixedSize):
    def _getsizing(self, comminfo, cash, data, isbuy):
        position = self.broker.getposition(data)
        size = self.p.stake * (1 + (position.size != 0))
        return size

这个构建在现有的 FixedSize 基础上,继承了 params 并覆盖了 _getsizing 以实现:

  • 通过属性 broker 获取 dataposition
  • 使用 position.size 来决定是否加倍固定赌注
  • 返回计算出的值

这将从 策略 上卸下决定是否反向或开仓的负担,Sizer 控制着,可以随时替换而不影响逻辑。




BackTrader 中文文档(十一)(3)https://developer.aliyun.com/article/1505310

相关文章
|
18天前
|
存储 编解码 算法
BackTrader 中文文档(十一)(3)
BackTrader 中文文档(十一)
22 0
|
18天前
|
存储 测试技术 API
BackTrader 中文文档(十一)(4)
BackTrader 中文文档(十一)
24 0
|
18天前
|
Oracle 关系型数据库 测试技术
BackTrader 中文文档(十一)(1)
BackTrader 中文文档(十一)
18 0
|
18天前
|
存储 测试技术 API
BackTrader 中文文档(十二)(1)
BackTrader 中文文档(十二)
32 0
|
18天前
|
存储 编解码
BackTrader 中文文档(十二)(3)
BackTrader 中文文档(十二)
25 0
|
18天前
|
索引 Python
BackTrader 中文文档(十二)(2)
BackTrader 中文文档(十二)
14 0
|
18天前
BackTrader 中文文档(十二)(4)
BackTrader 中文文档(十二)
13 0
|
18天前
|
存储
BackTrader 中文文档(十四)(4)
BackTrader 中文文档(十四)
18 0
BackTrader 中文文档(十四)(4)
|
18天前
|
算法 数据可视化 程序员
BackTrader 中文文档(十四)(1)
BackTrader 中文文档(十四)
19 0
BackTrader 中文文档(十四)(1)
|
18天前
|
Python
BackTrader 中文文档(十四)(2)
BackTrader 中文文档(十四)
18 0