BackTrader 中文文档(十)(2)https://developer.aliyun.com/article/1505299
分析员参考
AnnualReturn
class backtrader.analyzers.AnnualReturn()
此分析器通过查看年初和年末来计算年度回报
参数:
- (无)
成员属性:
rets
:计算的年度回报列表ret
:年度回报的字典(键:年份)
get_analysis:
- 返回年度回报的字典(键:年份)
Calmar
class backtrader.analyzers.Calmar()
此分析器计算 CalmarRatio 时间范围,该范围可能与基础数据中使用的范围不同 参数:
timeframe
(默认:None
)如果为None
,则系统中第 1 个数据的timeframe
将被使用
传递TimeFrame.NoTimeFrame
以考虑没有时间约束的整个数据集compression
(默认:None
)
仅用于次日时间范围,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来在小时时间范围上工作
如果为None
,则将使用系统的第 1 个数据的压缩- None
fund
(默认:None
)
如果为None
,则经纪人的实际模式(fundmode - True/False)将被自动检测,以决定收益是否基于总净资产价值或基金价值。参见经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定行为
- get_analysis
()
返回具有时间段键和相应滚动 Calmar 比率的 OrderedDict
- calmar
最新计算的 calmar 比率()
回撤
class backtrader.analyzers.DrawDown()
此分析器计算交易系统的回撤统计数据,例如以%为单位和以美元为单位的回撤值,以%为单位和以美元为单位的最大回撤,回撤长度和最大回撤长度
参数:
fund
(默认:None
)
如果为None
,则经纪人的实际模式(fundmode - True/False)将被自动检测,以决定收益是否基于总净资产价值或基金价值。参见经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定行为
- get_analysis
()
返回一个字典(支持点表示法和子字典)作为值的回撤统计,可用以下键/属性:
drawdown
- 0.xx%的回撤值moneydown
- 货币单位中的回撤值len
- 回撤长度max.drawdown
- 0.xx%的最大回撤值max.moneydown
- 最大资金单位中的最大回撤值max.len
- 最大回撤长度
TimeDrawDown
class backtrader.analyzers.TimeDrawDown()
此分析器计算所选时间范围内的交易系统回撤,该时间范围可能与基础数据中使用的范围不同 参数:
timeframe
(默认:None
)如果为None
,则系统中第 1 个数据的timeframe
将被使用
传递TimeFrame.NoTimeFrame
以考虑没有时间约束的整个数据集compression
(默认:None
)
仅用于亚日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来在小时时间框架上工作
如果为None
,则将使用系统第一条数据的压缩- None
fund
(默认:None
)
如果为None
,则将自动检测经纪人的实际模式(fundmode - True/False),以决定收益是基于总净资产价值还是基金价值。请参阅经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定行为
- get_analysis
()
返回一个字典(支持.
表示法和子字典)作为值的回撤统计信息,可用的键/属性如下:
drawdown
- 回撤值为 0.xx %maxdrawdown
- 回撤值为货币单位maxdrawdownperiod
- 回撤长度
- 这些在运行时作为属性可用()
dd
maxdd
maxddlen
总杠杆
类backtrader.analyzers.GrossLeverage()
此分析器按时间框架计算当前策略的总杠杆
参数:
fund
(默认:None
)
如果为None
,则将自动检测经纪人的实际模式(fundmode - True/False),以决定收益是基于总净资产价值还是基金价值。请参阅经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定行为
- get_analysis()
返回一个字典,其中值为收益,键为每个收益的日期时间点
PositionsValue
类backtrader.analyzers.PositionsValue()
此分析器报告当前数据集的持仓价值
参数:
- 时间框架(默认:
None
)如果为None
,则将使用系统第一条数据的时间框架 - 压缩(默认:
None
)
仅用于亚日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来在小时时间框架上工作
如果为None
,则将使用系统第一条数据的压缩 - headers(默认:
False
)
向字典添加一个初始键,其中包含结果的名称(“Datetime”作为键 - 现金(默认:
False
)
将实际现金作为额外头寸包含(对于标题,将使用“cash”作为名称)
- get_analysis()
返回一个字典,其中值为收益,键为每个收益的日期时间点
PyFolio
类backtrader.analyzers.PyFolio()
此分析器使用 4 个子分析器收集数据并将其转换为与pyfolio
兼容的数据集
子分析器
TimeReturn
用于计算全局投资组合价值的收益PositionsValue
用于计算每个数据的持仓价值。它将headers
和cash
参数设置为True
Transactions
用于记录每笔交易的数据(大小,价格,价值)。将headers
参数设置为True
GrossLeverage
跟踪总杠杆(策略投资了多少)
参数:
These are passed transparently to the children * timeframe (default: `bt.TimeFrame.Days`) If `None` then the timeframe of the 1st data of the system will be used * compression (default: 1\`) If `None` then the compression of the 1st data of the system will be used
timeframe
和 compression
都遵循 pyfolio
的默认行为,即使用 daily 数据并将其上采样以获得年度收益等值。
- 获取分析()
返回一个以值为收益和以键为每个收益的日期时间点的字典
获取 pf_items()
返回一个包含收益为值和每个收益为键的字典
pyfolio` returns, positions, transactions, gross_leverage
因为对象旨在直接输入到 pyfolio
,此方法通过本地导入 pandas
将内部 backtrader 结果转换为 pandas DataFrames,这是例如 pyfolio.create_full_tear_sheet
期望的输入
如果未安装 pandas
,则该方法将中断
LogReturnsRolling
类 backtrader.analyzers.LogReturnsRolling()
此分析器计算给定时间框架和压缩的滚动收益
参数:
timeframe
(默认:None
)如果None
系统中的第一个数据的timeframe
将被使用
传递TimeFrame.NoTimeFrame
来考虑没有时间约束的整个数据集compression
(默认:None
)
仅用于子日时间框架,例如通过指定“TimeFrame.Minutes”和压缩为 60 来工作在小时时间框架上
如果为None
,则将使用系统的第一个数据的压缩data
(默认:None
)
跟踪的参考资产,而不是组合价值。
注意:此数据必须已经通过addata
、resampledata
或replaydata
添加到cerebro
实例中firstopen
(默认:True
)当跟踪data
的收益时,当穿越时间框架边界时,例如Years
时,将执行以下操作:
- 上一年的最后一个
close
用作参考价格,以查看当前年份的收益
- 问题在于第一个计算,因为数据没有上一个收盘价。因此,当此参数为
True
时,将使用 开盘 价格进行第一个计算。
这要求数据源具有open
价格(对于close
,将使用标准的[0]
符号,不涉及字段价格)
否则将使用初始收盘价。 fund
(默认:None
)
如果为None
,则将自动检测经纪人的实际模式(fundmode - True/False),以决定收益是基于总净资产价值还是基金价值。请参阅经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定行为
- 获取分析()
返回一个以值为收益和以键为每个收益的日期时间点的字典
期间统计
类 backtrader.analyzers.PeriodStats()
计算给定时间框架的基本统计信息
参数:
timeframe
(默认:Years
)如果为None
,则将使用系统中第一个数据的timeframe
传递TimeFrame.NoTimeFrame
来考虑没有时间约束的整个数据集compression
(默认:1
)
仅用于子日时间框架,例如通过指定“TimeFrame.Minutes”和压缩为 60 来工作在小时时间框架上
如果是None
,则将使用系统的第一个数据进行压缩fund
(默认值:None
)
如果是None
,则会自动检测经纪人的实际模式(fundmode - True/False),以决定收益是否基于总净资产价值或基金价值。参见经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定行为
get_analysis
返回一个包含键的字典:
average
stddev
positive
negative
nochange
best
worst
如果参数zeroispos
设置为True
,则没有变化的期间将被视为正值
返回
类 backtrader.analyzers.Returns()
使用对数方法计算的总、平均、复合和年化收益
参见:
参数:
timeframe
(默认值:None
)
如果是None
,则将使用系统的第一个数据的timeframe
将TimeFrame.NoTimeFrame
传递以考虑整个数据集,不受时间限制compression
(默认值:None
)
仅用于亚日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架
如果是None
,则将使用系统的第一个数据进行压缩tann
(默认值:None
)年度化(normalization)所使用的周期数即:
days: 252
weeks: 52
months: 12
years: 1
fund
(默认值:None
)
如果是None
,则会自动检测经纪人的实际模式(fundmode - True/False),以决定收益是否基于总净资产价值或基金价值。参见经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定行为
- get_analysis()
返回一个以返回值为值和每个返回值的日期时间点为键的字典
返回的字典有以下键:
rtot
:总复合回报ravg
:整个周期的平均回报(特定于时间框架)rnorm
:年化/标准化回报rnorm100
:以 100%表示的年化/标准化回报
SharpeRatio
类 backtrader.analyzers.SharpeRatio()
此分析器使用一个风险免费资产(简单地是利率)计算策略的 SharpeRatio
参数:
timeframe
:(默认值:TimeFrame.Years
)compression
(默认值:1
)
仅用于亚日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架riskfreerate
(默认值:0.01 -> 1%)
以年为单位表达(见下文的convertrate
)convertrate
(默认值:True
)
将riskfreerate
从年度转换为月度、周度或日度利率。不支持亚日转换factor
(默认值:None
)
如果是None
,则将从预定义表中选择将风险无风险利率的转换因子从年度转换为所选择的时间框架
天数:252,周数:52,月数:12,年数:1
否则将使用指定的值annualize
(默认值:False
)
如果convertrate
为True
,则SharpeRatio将以所选的timeframe
传递。
在大多数情况下,SharpeRatio 以年化形式呈现。将riskfreerate
从年化转换为月度、周度或日度利率。不支持亚日转换stddev_sample
(默认值:False
)
如果设置为True
,则将计算标准差,并将平均值中的分母减1
。当计算标准差时使用此项,如果考虑到并非所有样本都用于计算,则会使用此项。这称为Bessels’校正daysfactor
(默认值:None
)
旧名称为factor
。如果设置为除None
之外的任何值,并且timeframe
为TimeFrame.Days
,则会假定这是旧代码,并将使用该值legacyannual
(默认值:False
)
使用AnnualReturn
返回分析器,正如其名称所示,仅适用于年份fund
(默认值:None
)
如果为None
,则将自动检测经纪人的实际模式(fundmode - True/False),以决定回报是基于总净资产值还是基金值。请参阅经纪人文档中的set_fundmode
将其设置为True
或False
以获取特定行为
- 获取分析()
返回一个带有键“sharperatio”的字典,其中包含比率
SharpeRatio_A
class backtrader.analyzers.SharpeRatio_A()
SharpeRatio 的扩展,直接以年化形式返回 Sharpe 比率
以下参数已从SharpeRatio
更改
annualize
(默认值:True
)
SQN
class backtrader.analyzers.SQN()
SQN 或系统质量数。由 Van K. Tharp 定义以对交易系统进行分类。
- 1.6 - 1.9 低于平均水平
- 2.0 - 2.4 平均
- 2.5 - 2.9 良好
- 3.0 - 5.0 优秀
- 5.1 - 6.9 极好
- 7.0 - 圣杯?
公式:
- 平方根(交易次数)* 平均(交易利润)/ 标准差(交易利润)
当交易次数≥ 30 时,sqn 值应被视为可靠
- 获取分析()
返回一个带有键“sqn”和“trades”(考虑的交易数)的字典
TimeReturn
class backtrader.analyzers.TimeReturn()
此分析器通过查看时间范围的起始点和结束点来计算回报
参数:
timeframe
(默认值:None
)如果为None
,则将使用系统中的第一个数据的timeframe
通过传递TimeFrame.NoTimeFrame
来考虑没有时间约束的整个数据集compression
(默认值:None
)
仅用于亚日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理每小时时间框架
如果为None
,则将使用系统的第一个数据的压缩data
(默认值:None
)
跟踪的参考资产而不是投资组合价值。
注意:此数据必须已添加到具有addata
、resampledata
或replaydata
的cerebro
实例中firstopen
(默认值:True
)当跟踪data
的回报时,当跨越时间范围边界时,例如Years
时,会执行以下操作:
- 上一年的最后一个
close
用作参考价格,以查看当前年度的回报
- 问题是第一次计算,因为数据没有先前的收盘价。 因此,当此参数为
True
时,将使用开盘价进行第一次计算。
这需要数据源具有open
价格(对于close
,将使用标准[0]表示法,而不参考字段价格)
否则将使用初始收盘价。 fund
(默认值:None
)
如果为None
,则将自动检测经纪人的实际模式(fundmode - True/False),以决定基于总净资产值还是基金价值的回报。请参阅经纪人文档中的set_fundmode
将其设置为特定行为的True
或False
- get_analysis()
返回一个带有值作为值的字典,并将每个返回的日期时间点作为键
TradeAnalyzer
类 backtrader.analyzers.TradeAnalyzer()
提供了有关已关闭交易的统计信息(还保留了未平仓交易的计数)
- 总开/闭交易
- Streak 赢得/失去 当前/最长的
- 利润与损失 总数/平均数
- 赢得/失去 计数/总 PNL/平均 PNL/最大 PNL
- 长/空头 计数/ 总 PNL / 平均 PNL / 最大 PNL
- 赢得/失去 计数/总 PNL/平均 PNL/最大 PNL
- 长度(市场上的条)
- 总数/平均数/最大值/最小值
- 赢得/失去 总数/平均数/最大值/最小值
- 长/短 总数/平均值/最大值/最小值
- 赢得/失去 总数/平均数/最大值/最小值
注意:分析器使用“自动”字典进行字段处理,这意味着如果没有执行交易,将不会生成任何统计数据。
在这种情况下,get_analysis
返回的字典中将有一个字段/子字段,即:
- dictname[‘total’][‘total’],其值将为 0(该字段还可以使用点表示法 dictname.total.total)。
交易
类 backtrader.analyzers.Transactions()
此分析器报告了系统中发生的每笔交易
它查看订单执行位以从每个next
周期开始创建Position
,初始值为 0。
结果将在下一个周期记录交易时使用
参数:
- headers(默认值:
True
)
向字典添加一个初始键,该键包含具有数据名称的结果
这个分析器的建模是为了方便与pyfolio
集成,头部名称取自用于它的样本:
'date', 'amount', 'price', 'sid', 'symbol', 'value'`
- get_analysis()
返回一个带有值作为值的字典,并将每个返回的日期时间点作为键
VWR
类 backtrader.analyzers.VWR()
变异性加权回报:对数收益率的夏普比率更好
别名:
- 变异性加权回报
见:
参数:
timeframe
(默认值:None
)如果为None
,则将报告整个回测期间的完整收益
传递TimeFrame.NoTimeFrame
以考虑没有时间限制的整个数据集compression
(默认值:None
)
仅用于亚日时间框架,例如通过指定“TimeFrame.Minutes”和 60 作为压缩来处理小时时间框架
如果为None
,则将使用系统第一个数据的压缩tann
(默认值:None
)用于计算平均收益的年化(标准化)周期数。如果为None
,则将使用标准的t
值,即:
days: 252
weeks: 52
months: 12
years: 1
tau
(默认值:2.0
)
计算的因子(参见文献)sdev_max
(默认值:0.20
)
最大标准偏差(参见文献)fund
(默认值:None
)
如果为None
,则会自动检测经纪人的实际模式(fundmode - True/False),以决定收益是基于总净资产值还是基金价值。请参阅经纪人文档中的set_fundmode
将其设置为True
或False
以获得特定的行为
- 获取分析()
返回一个字典,其中收益作为值,每个收益对应的日期时间点作为键
返回的字典包含以下键:
vwr
: 变异权重收益
观察者
观察者和统计
原文:
www.backtrader.com/docu/observers-and-statistics/observers-and-statistics/
在backtrader
中运行的策略大多与数据源和指标有关。
数据源被添加到Cerebro实例中,并最终成为策略的输入之一(以实例的属性形式解析和提供),而指标则由策略本身声明和管理。
所有backtrader
示例图表到目前为止都有 3 个似乎被视为理所当然的东西,因为它们没有在任何地方声明:
- 现金和价值(经纪人的资金情况)
- 交易(又名操作)
- 买入/卖出订单
它们是观察者
,存在于子模块backtrader.observers
中。它们在那里是因为Cerebro支持一个参数,用于自动添加(或不添加)它们到策略中:
stdstats
(默认:True
)
如果默认值被遵守,Cerebro将执行以下等效的用户代码:
import backtrader as bt ... cerebro = bt.Cerebro() # default kwarg: stdstats=True cerebro.addobserver(bt.observers.Broker) cerebro.addobserver(bt.observers.Trades) cerebro.addobserver(bt.observers.BuySell)
让我们看看具有这 3 个默认观察者的常规图表(即使没有发出订单,因此没有交易发生,也没有现金和投资组合价值的变化)
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import backtrader.feeds as btfeeds if __name__ == '__main__': cerebro = bt.Cerebro(stdstats=False) cerebro.addstrategy(bt.Strategy) data = bt.feeds.BacktraderCSVData(dataname='../../datas/2006-day-001.txt') cerebro.adddata(data) cerebro.run() cerebro.plot()
现在让我们在创建Cerebro实例时将stdstats
的值更改为False
(也可以在调用run
时执行):
cerebro = bt.Cerebro(stdstats=False)
现在图表不同了。
BackTrader 中文文档(十)(4)https://developer.aliyun.com/article/1505302