BackTrader 中文文档(十一)(1)https://developer.aliyun.com/article/1505308
观察者参考
基准
类 backtrader.observers.Benchmark()
此观察者存储策略的回报和作为系统传递的数据之一的参考资产的回报。
参数:
timeframe
(默认:None
)如果为None
,则将报告整个回测期间的完整收益compression
(默认:None
)
仅用于子日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架data
(默认:None
)
用于跟踪的参考资产,以进行比较。
注意:此数据必须已添加到cerebro
实例中,并使用addata
、resampledata
或replaydata
。_doprenext
(默认:False
)
基准将从策略启动的时间点开始进行(即:当策略的最小周期已满足时)。
将此设置为True
将记录从数据源的起始点开始的基准值。firstopen
(默认:False
)
将其保持为False
可确保价值与基准之间的第一个比较点从 0%开始,因为基准不会使用其开盘价。
查看TimeReturn
分析器参考以获取参数含义的全面解释fund
(默认:None
)
如果为None
,则经纪人的实际模式(fundmode - True/False)将被自动检测以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的set_fundmode
将其设置为True
或False
以获取特定行为
请记住,在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
将其设置为True
或False
以获取特定行为
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
将其设置为True
或False
以实现特定行为
时间收益
类backtrader.observers.TimeReturn()
该观察器存储策略的收益。
参数:
timeframe
(默认:None
)如果为None
,则将报告整个回测期间的完整收益
将TimeFrame.NoTimeFrame
传递以考虑整个数据集而没有时间约束compression
(默认:None
)
仅用于子日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架fund
(默认:None
)
如果为None
,则会自动检测经纪人的实际模式(基金模式 - True/False),以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的set_fundmode
将其设置为True
或False
以实现特定行为
请记住,在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
将其设置为True
或False
以实现特定行为
请记住,在run
的任何时刻,可以通过查看索引为0
的名称的行来检查当前值。
对数收益 2
类backtrader.observers.LogReturns2()
扩展观察器 LogReturns 以显示两个工具
基金价值
类backtrader.observers.FundValue(*args, **kwargs)
该观察器跟踪当前基金样式的值
参数:无
基金份额
类backtrader.observers.FundShares(*args, **kwargs)
该观察器跟踪当前基金样式的份额
参数:无
Sizers
Sizers
- 智能押注
Strategy提供了交易方法,即:buy
,sell
和close
。让我们看看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的默认Sizer是SizerFix
。定义的初始行:
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:setsizer
和getsizer
(以及一个property sizer
)来管理Sizer。签名如下:
def setsizer(self, sizer)
: 接受一个已实例化的Sizerdef getsizer(self)
: 返回当前的Sizer实例sizer
是可以直接get/set的属性
在这种情况下,Sizer可以是:
- 作为参数传递给策略
- 在
__init__
期间使用Sizer
或setsizer
属性设置,如:
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开发
这样做很容易:
- 从
backtrader.Sizer
继承这使您可以访问self.strategy
和self.broker
,尽管在大多数情况下不需要。可以通过broker
访问的内容
- 通过
self.strategy.getposition(data)
获取数据的持仓 - 通过
self.broker.getvalue()
获取完整的投资组合价值
请注意,当然也可以用self.strategy.broker.getvalue()
来实现
- 其他一些东西已经作为参数列在下面了
- 覆盖方法
_getsizing(self, comminfo, cash, data, isbuy)
comminfo
: 包含有关数据委托的委员会信息的 CommissionInfo 实例,并允许计算持仓价值、操作成本和操作的委员会费用cash
: 经纪人当前可用的现金data
: 操作目标isbuy
: 对于 买入 操作将为True
,对于 卖出 操作将为False
- 该方法返回 买入/卖出 操作的期望
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
获取 data 的position
- 使用
position.size
来决定是否加倍固定赌注 - 返回计算出的值
这将从 策略 上卸下决定是否反向或开仓的负担,Sizer 控制着,可以随时替换而不影响逻辑。
BackTrader 中文文档(十一)(3)https://developer.aliyun.com/article/1505310