简介

Backtrader observer观测器主要用于观察策略运行过程中的各个状态指标,如资金、买卖点等,在调用cerebro.plot()后可以方便地可视化状态指标的变化情况,如下图展示的Broker、Trades和BuySell 3个observer观测器可以用来查看现金和市值、交易盈亏以及买卖点在回测过程中的变化情况。

使用方法

  1. 通过cerebro.addobserver() 添加observer观测器

import backtrader as bt
# 查看收益序列
cerebro.addobserver(bt.observers.TimeReturn)
# 查看回撤序列
cerebro.addobserver(bt.observers.DrawDown)
  • addobserver(obscls, args, **kwargs):参数obscls 对应 observer观测器,args, **kwargs 对应观测器支持的参数

cerebro = bt.Cerebro(stdstats=False)
cerebro.addobserver(bt.observers.Broker)
cerebro.addobserver(bt.observers.Trades)
cerebro.addobserver(bt.observers.BuySell)
  • cerebro会默认添加Broker(Cash & Value)、Trades、BuySell 3个观测器(stdstats=True),可以在实例化cerebro时,通过 bt.Cerebro(stdstats=False) 来控制不默认展示

  1. observers观测器执行时间: observers观测器是在所有指标以及策略的next 方法运行后才运行并统计数据的,因此在策略next方法里面读到的observer最新数据 [0] 相对于next 的当前时刻是晚一个bar的

  2. 如何读取observer观测器中的数据

  • observers观测器属于lines对象,存储了历史回测数据,可以像行情lines对象一样操作。可以通过策略属性self.stats来访问observers观测器

class MyStrategy(bt.Strategy):def next(self):# 当前时点的前一天的可用现金self.stats.broker.cash[0]self.stats.broker.value[0]# 获取当前时刻前一天的收益self.stats.timereturn.line[0]
  1. 如何保存observer观测器中的数据

backtrader目前没有直接保存observer观测器数据到文件的机制,需要我们自己来实现。backtrader推荐的实现方法是:

  • 在策略的start方法中打开文件

  • 在策略的next、stop方法中写入对应的值

以DrawDown观察者模式为例,示例代码如下:

class MyStrategy(bt.Strategy):def start(self):self.mystats = open('mystats.csv', 'wb')self.mystats.write('datetime,drawdown, maxdrawdown\n')def next(self):self.mystats.write(self.data.datetime.date(-1).strftime('%Y-%m-%d'))self.mystats.write(',%.2f' % self.stats.drawdown.drawdown[0])self.mystats.write(',%.2f' % self.stats.drawdown.maxdrawdown[0])self.mystats.write('\n')def stop(self):self.mystats.write(self.data.datetime.date(0).strftime('%Y-%m-%d'))self.mystats.write(',%.2f' % self.stats.drawdown.drawdown[0])self.mystats.write(',%.2f' % self.stats.drawdown.maxdrawdown[0])self.mystats.write('\n')

backtrader自带的observer观测器

自带的observers观测器有:

  • Benchmark:记录了业绩基准的收益序列,业绩基准的数据必须事先通过 adddata、resampledata、replaydata等添加函数添加进cerebro,可视化时会同时绘制策略本身的收益序列和业绩基准的收益曲线

  • Broker、Cash、Value: Broker观测器记录了经纪商 broker 中各时间点的可用资金和总资产,可视化时会同时展示 cash 和 values 曲线;如果想各自单独展示 cash 和 values,可以分别调用 backtrader.observers.Cash和backtrader.observers.Value

  • BuySell:记录了回测过程中的买入和卖出信号,可视化时会在价格曲线上标注买卖点

  • DrawDown:记录了回测过程的回撤序列,可视化时绘制回撤曲线

  • TimeReturn: 记录了回测过程中的收益序列,可视化时会绘制 TimeReturn 收益曲线

  • Trades: 记录了回测过程中每次交易的盈亏,可视化时会绘制盈亏点

  • LogReturns:记录了策略的log回报

  • LogReturns2:扩展了LogReturns支持2个数据,data0和data1

  • FundValue:记录了回测过程中的fund值

  • FundShares:记录了回测过程中的fund份额

其中,常用的observers观测器有:Broker、BuySell、Trades、TimeReturn、DrawDown、Benchmark等。

新建observers观测器

Broker观测器有2个lines对象:cash、value。其实现类似如下:

class Broker(Observer):alias = ('CashValue',)lines = ('cash', 'value')plotinfo = dict(plot=True, subplot=True)def next(self):self.lines.cash[0] = self._owner.broker.getcash()self.lines.value[0] = value = self._owner.broker.getvalue()

可以看出,自定义observer观测器步骤如下:

  • 自定义 observer观测器继承自bt.observer.Observer;也可以继承自已有其他的观测器

  • 声明需要的lines和参数,参数可选。在next方法中存入对应的数据

  • 声明plotinfo、plotlines属性,用于cerebro.plot() 可视化展示

  • 存在一个自动属性_owner表示持有该observer的策略

进一步,我们可以自定义OrderObserver(参考官网): 标准的BuySell观测器只关心已经执行的操作,我们可以创建一个observer观测器查看订单创建和过期情况,如下所示。

class OrderObserver(bt.observer.Observer):lines = ('created', 'expired',)plotinfo = dict(plot=True, subplot=True, plotlinelabels=True)plotlines = dict(created=dict(marker='*', markersize=8.0, color='lime', fillstyle='full'),expired=dict(marker='s', markersize=8.0, color='red', fillstyle='full'))def next(self):for order in self._owner._orderspending:if order.data is not self.data:continueif not order.isbuy():continue# Only interested in "buy" orders, because the sell orders# in the strategy are Market orders and will be immediately# executedif order.status in [bt.Order.Accepted, bt.Order.Submitted]:self.lines.created[0] = order.created.priceelif order.status in [bt.Order.Expired]:self.lines.expired[0] = order.created.price

当然,我们也可以从已有其他的观测器继承,参考代码:

class MyBuySell(bt.observers.BuySell):# 将barplot默认值改为Trueparams = (('barplot', True), ('bardist', 0.015))# 将三角形改为箭头plotlines = dict(buy=dict(marker=r'$\Uparrow$', markersize=8.0, color='#d62728' ),sell=dict(marker=r'$\Downarrow$', markersize=8.0, color='red'))

结论 & 交流

关注微信公众号:诸葛说talk,获取更多内容。同时还能获取邀请加入投资交流群、量化投资研讨群, 与众多投资爱好者、量化从业者、技术大牛一起交流、切磋,快速提升自己的投资水平。

写文章不易,觉得本文对你有帮助的话,帮忙点个在看吧。

参考

  • Observers - Statistics - Backtrader

  • Observers - Reference - Backtrader

  • https://github.com/mementum/backtrader/blob/master/backtrader/observers/buysell.py

量化框架backtrader之一文读懂observer观测器相关推荐

  1. 量化框架backtrader之一文读懂Analyzer分析器

    诺贝尔奖获得者威廉夏普 简介 策略绩效评价是量化交易很重要的一环,投资不仅需要了解策略的收益率, 也需要了解策略的风险.backtrader提供多种analyzer分析器,可以输出多种绩效指标,用来分 ...

  2. 任务调度框架 Quartz 一文读懂

    1.Quartz 简介 Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,完全由Java开发,可以用来执行定时任务,类似于java.util.Timer. ...

  3. hdfs文档存储服务器,一文读懂HDFS分布式存储框架分析

    一文读懂HDFS分布式存储框架分析 HDFS是一套基于区块链技术的个人的数据存储系统,利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务,将闲置的存储空间利用起来,服务于正处于爆发期 ...

  4. hdfs读写流程_一文读懂HDFS分布式存储框架分析

    一文读懂HDFS分布式存储框架分析 HDFS是一套基于区块链技术的个人的数据存储系统,利用无处不在的私人PC存储空间及便捷的网络为个人提供数据加密存储服务,将闲置的存储空间利用起来,服务于正处于爆发期 ...

  5. 一文读懂程序化交易算法交易量化投资高频交易统计利

    转 一文读懂程序化交易.算法交易.量化投资.高频交易. 统计套利 在央行发布的<中国金融稳定报告(2016)>中,对于高频交易的解释为程序化交易的频率超过一定程度,就成为高频交易.而对程序 ...

  6. 一文读懂PQuant与QQuant量化易金工

    转 一文读懂P Quant与 Q Quant ,量化交易与金融工程 原标题:P Quant 和 Q Quant 到底哪个是未来?  来源:李老师与何老师的CFA学习课堂  作者:何璇 P-Quant ...

  7. ​一文读懂EfficientDet

    一文读懂EfficientDet. 今年年初Google Brain团队在 CVPR 2020 上发布了 EfficientDet目标检测模型, EfficientDet是一系列可扩展的高效的目标检测 ...

  8. 独家 | 一文读懂语音识别(附学习资源)

    原标题:独家 | 一文读懂语音识别(附学习资源) 一.前言 6月27日,美国权威科技杂志<MIT科技评论>公布2017全球最聪明50家公司榜单.科大讯飞名列中国第一.全球第六.全世界排在科 ...

  9. 【原理篇】一文读懂Mask RCNN

    Mask RCNN 何凯明大神的经典论文之一,是一个实例分割算法,正如文中所说,Mask RCNN是一个简单.灵活.通用的框架,该框架主要作用是实例分割,目标检测,以及人的关键点检测.Mask RCN ...

最新文章

  1. 模拟一个连接来自搜索引擎
  2. Contest Hunter CH6201 走廊泼水节 最小生成树 Kruskal
  3. Spring-学习笔记08【面向切面编程AOP】
  4. 1337:【例3-2】单词查找树
  5. 习题11-7 奇数值结点链表 (20 分) -链表
  6. SAP MM 采购订单收货被取消了还是不能增加新的delivery cost!
  7. PHP exec() has been disabled for security reasons
  8. android分享文字到朋友圈,微信,分享朋友圈,只能分享图,文字带不过来,这是什么原因?是BUG吗?...
  9. 【记得交作业】波波离散实验报告一(python实现)
  10. 前端:分享几个前端素材网站
  11. python对电商运营有帮助吗_做电商运营需要学习python嘛?
  12. 小恐龙游戏制作挑战:第9天-打完大部分计分器模块的代码
  13. 【CVE】CVE-2015-5254:ActiveMQ 反序列化漏洞利用
  14. 打开Adobe Premiere Pro提示“由于找不到msvcp110.dll,无法继续执行代码。重新安装程序可能会解决此问题”。【方法适用于几乎所有dll文件丢失时】
  15. 苹果计算机重装系统步骤,苹果mac系统重装_苹果电脑Mac系统重装方法
  16. SSM网页聊天室游戏平台
  17. java如何找出勾股数组_勾股数组 学习笔记
  18. 《高难度谈话》你需要知道的高效沟通技巧
  19. 利用jsdelivr+github使用免费又好用的全球节点CDN
  20. 一张A4纸对折不了8次?

热门文章

  1. 《Mask TextSpotter v3: Segmentation Proposal Network for Robust Scene Text Spotting》论文阅读笔记
  2. 命运、态度以及勇往直前
  3. 【Android 很基础】异常出现在show和dimiss dialog
  4. 人民网评:不要再为不良软件贡献流量,沦为被收割的“韭菜”了
  5. Zepto.js框架
  6. 工业控制电脑有哪些优点?
  7. 30万“被消失”的视障用户,如何在淘宝剁手盖楼?
  8. python bs4模块报错_Python3安装bs4报错及解决方案
  9. Clean Code 总结
  10. 2019 计蒜之道 复赛 D——“星云系统”(单调栈||队列+贪心)