【PA交易】BackTrader: 讨论下分析器和评测指标

前言 

BackTrader的分析器主要使用的是analyzers模块,我们可以从Analyzers - Backtrader找到一个非常简单的示例。这个示例中使用方式很简单,其他分析器也可以通过如此简单封装方式进行装载。如果仅是复制粘贴官方教程,完全是制造互联网垃圾,更丝毫没必要写一篇博客来讨论。

但是,当我们关注微观时,我们的日线通常是通过Resample API(例如:多周期K线的Resampling)合并的,这时诸如PyFolio这样跟时序相关的分析器是否支持足够呢?同时,又有哪些框架内置的分析器?哪些分析器依赖于时序?哪些又需要哪些其他组件支持呢?如果我们定制Broker或者如前文所述基于Tick数据进行回测,那么应该如何使用框架提供的分析功能?

更进一步的,这些分析器是些个什么玩意?这些评测指标是什么?

本文将从这些问题出发,更包含了对一些框架提供的评测指标的文字解释和公式说明。阅读之前请参考官网示例实践几个分析器的挂载和使用。

Analyzer简述

要解答前面的问题,必不可少的是了解分析器内部的类关系,这是最简单但却重要的第一步。框架内部的内置分析器类层次结构如下所示:

而不同的分析器之间也存在相互依赖,比如PyFolio的结果则是另外三个分析器的汇总:

如下代码可以很简单的验证着点:

cerebro.addanalyzer(btanalyzers.Transactions, _name='mytran')
cerebro.addanalyzer(btanalyzers.PositionsValue, _name='mypos')
cerebro.addanalyzer(btanalyzers.GrossLeverage, _name='grosslv')
cerebro.addanalyzer(btanalyzers.PyFolio, _name='mypyfolio')# ....mytran = thestrat.analyzers.mytran.get_analysis()
series1 = ordered_dict_to_df('Transactions', mytran)
mypos = thestrat.analyzers.mypos.get_analysis()
series2 = ordered_dict_to_df('PositionsValue', mypos)
grosslv = thestrat.analyzers.grosslv.get_analysis()
series2 = ordered_dict_to_df('GrossLeverage', grosslv)
results = thestrat.analyzers.mypyfolio.get_analysis()
pyfolio_series = []
for key in results:series = ordered_dict_to_df(key, results[key])pyfolio_series.append(series)

如上代码使用Series对比:

分析器的next

上面的例子可以看到,多数分析器都会加入到策略的生命周期中,即使是直接继承自bt.Analyzer。以PositionsValue为例,在PositionsValue的实现中,分别会由框架调用start和next方法,如下调用堆栈:

start, positions.py:69
_start, analyzer.py:194
_start, strategy.py:397
runstrategies, cerebro.py:1269
run, cerebro.py:1132
<module>, MyAnalyzer.py:47

上述调用栈中,start, positions.py是PositionsValue分析器的实现,同样的也包括next方法实现。并且在方法中,调用了Broker的get_value和get_cash方法。而像杠杆率评测的GrossLeverage分析器则是直接在next方法中直接使用了data0的时间,而如果data0是tick级别考虑杠杆率这颗粒度显然太细了。

这对于本文开始的问题做出了一些解答:

  • 框架自身的一些基础分析器默认适配Tick级别数据的分析并不合适。
  • 分析器的很多实现需要调用Broker的接口方法。

虽然有一些计算器无法适配,但是前图中的bt.TimeFrameAnalyzerBase子类可以通过指定timeframe参数实现指定基于时间级别数据的分析。在TimeFrameAnalyzerBase的源码中可以看到:

class TimeFrameAnalyzerBase(with_metaclass(MetaTimeFrameAnalyzerBase,Analyzer)):params = (('timeframe', None),('compression', None),('_doprenext', True),)def _start(self):# Override to add specific attributesself.timeframe = self.p.timeframe or self.data._timeframe

当然,一个成熟化的、准确的、产品级回测工具需要对这些分析指标进行充分的定制化的修改和拓展。这对于能够关注到这点的朋友来讲,从技术上解决起来是很容易的。本文不在过多赘述具体如何去定制化的细节实现。


分析器评测指标

为了方便实现上述的处于是配合定制化目的的修改和拓展,有必要结合BackTrader的实现,对于几个经典评测指标进行一些讨论。

AnnualReturn

标准的年化收益率,在回测结束的stop阶段计算。计算公式没有太特殊的地方:

分别基于期初净值和期末净值以及年数做出计算。当数据不足一年时,参数特化为:

框架中的代码页基本实现了类似的逻辑。

DrawDown

回撤是简单直白的风险度指标,在BT中返回在回测结束时最终的:

  • 距离最高点的回撤比例和资金回撤
  • 回测过程中的最大回撤

这个计算不复杂,即使完全自主实现也难度不大。

Calmar

卡玛比率为年化收益率与最大回撤的比值,主要为了突出风险度,同时也是一个很重要的评测指标。实际上Calmar将年化使用回撤进行了单位化。高Calmar意味着以回撤为单位的年化收益率。虽然通常的算法交易CTA在5以上都是很厉害的了,但是有些大牛高频量化系统将Calmar率控制在10以上并不少见。

BackTrader中Calmar主要使用了TimeDrawDown类。框架示例代码:“calmar-test.py”展示了使用方式。在框架源码实现中,calmar的计算实现于on_dt_over中,由上层的TimeFrameAnalyzerBase在next中调用,也就是每个数据源周期中都会发生计算(但是可以通过timeframe参数指定要计算的周期)。

SharpeRatio

标准的夏普率计算,框架的夏普率的计算依赖于AnnualReturn。夏普率几乎是公认的最常用评测指标,虽然他的争议较大。夏普率计算公式为:

夏普率计算中主要是标准差的计算稍微有些难以理解,其实在源码中可以看到BT的实现方式主要是对年华收益率计算:

math.sqrt(average(variance(self.AnnualReturn.rets, \average([r - rate for r in returns])), \bessel=self.p.stddev_sample))

其中贝塞尔方程可以通过参数指定(具体参考SharpeRatio - Backtrader)。除了贝塞尔以外,还要考虑配置若干参数,比如无风险利率、timeframe等。参数的不同配置可能会造成结果有较大出入,也容易产生争议(争论策略的夏普率之前最好双方Sync一下夏普率参数

关于BackTrader夏普率的讨论和介绍在CSDN有大量专题讨论,此处不再过多赘述。

GrossLeverage

当我们讨论回测的时候,毛杠杆率主要目的还是体现资金的利用率。“Gross Leverage”的原始定义为:

从源码中可以看到GrossLeverage的实现相对简单。即:

lev = (self._value - self._cash) / self._value

不过需要注意的是,杠杆率的计算是逐数据帧的,并且没有提供timeframe参数,如果想要考虑这个指标可能需要有一个最终汇总操作,给策略一个整体的杠杆率评价。否则如果在微观中逐tick的评价意义不大,并且观测难度也很大(可能画图是个办法)。

几点结论

对于前言中的一些问题:

  • 诸如PyFolio这样跟时序相关的分析器是否支持足够呢?
  • 如果我们定制Broker或者如前文所述基于Tick数据进行回测,那么应该如何使用框架提供的分析功能?

继承自TimeFrameAnalyzerBase的分析器可以支持指定timeframe,但是如果考虑定制化和细颗粒度,以及从性能优化角度,特别是针对tick源数据,这些基于timeframe的分析器尚显不足。

  • 又有哪些框架内置的分析器?哪些分析器依赖于时序?

我们列出了分析器的完整框架,同时可以看出哪些分析器支持timeframe。如果这些内置分析器,则可以根据自己回测评测的需求去定制对应的分析器。

  • 哪些又需要哪些其他组件支持呢?

首先分析器多数需要Broker支持。Broker提供了标准接口,如果是自定义Broker,实现对应接口即可。同时分析器互相之间存在大量依赖,例如文中提到过得Calmar对TimerDrawDown和AnnualReturn的依赖,以及类似于前面提到的PyFolio就是对几个分析器的汇总。

  • 这些分析器是些个什么玩意?这些评测指标是什么?

本文第二部分介绍了一些常用的评测指标是什么。处于篇幅原因,没有过度展开。实际上不少指标如果微调一些参数会有很大出入。所以如果是自己的回测系统大可以根据自己需要去定制,不必过分追求指标好看。除非为了忽悠资金或者抬杠,否则纠结这些指标意义很小。

最后,愿点赞的朋友早日打造出Calmar大于20甚至50的策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/35032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Netty学习(一)——基础组件

根据黑马程序员netty视频教程学习所做笔记。 笔记demo&#xff1a;https://gitee.com/jobim/netty_learn_demo.git 参考博客&#xff1a;https://blog.csdn.net/cl939974883/article/details/122550345 一、概述 1.1 什么是Netty Netty is an asynchronous event-driven netw…

Redis-哨兵模式-主机宕机-推选新主机的过程

文章目录 1、为哨兵模式准备配置文件2、启动哨兵3、主机6379宕机3.4、查看sentinel控制台日志3.5、查看6380主从信息 4、复活63794.1、再次查看sentinel控制台日志 1、为哨兵模式准备配置文件 [rootlocalhost redis]# ll 总用量 244 drwxr-xr-x. 2 root root 150 12月 6 2…

label studio数据标注平台的自动化标注使用

&#xff08;作者&#xff1a;陈玓玏&#xff09; 开源项目&#xff0c;欢迎star哦&#xff0c;https://github.com/tencentmusic/cube-studio 做图文音项目过程中&#xff0c;我们通常会需要进行数据标注。label studio是一个比较好上手的标注平台&#xff0c;可以直接搜…

突出显示列,重点内容一目了然!

老师在发布查询时&#xff0c;希望学生家长一眼就能看到重要的信息&#xff0c;应该如何设置&#xff1f; 易查分的新功能&#xff1a;突出显示列&#xff0c;就可以轻松实现&#xff01;老师可以个性化设置突出显示列的样式&#xff0c;包括颜色、字体大小、隐藏标题等&#x…

P2实验室装修标准都有哪些

P2实验室&#xff08;也称为生物安全二级实验室&#xff0c;BSL-2实验室&#xff09;的装修标准需要满足一系列的设计和施工要求&#xff0c;以确保实验室的安全性和功能性。因此&#xff0c;P2实验室装修标准不仅要满足一般实验室的要求&#xff0c;还需符合生物安全的特殊规定…

餐厅点餐系统JAVA全栈开发(SSM框架+MYSQL)

代码仓库 GitHub - JJLi0427/Online_Order_SystemContribute to JJLi0427/Online_Order_System development by creating an account on GitHub.https://github.com/JJLi0427/Online_Order_System 项目介绍 餐厅点餐系统包含用户使用界面和功能实现&#xff0c;后台店员和管…

C++初学者指南-2.输入和输出---文件输入和输出

C初学者指南-2.输入和输出—文件输入和输出 文章目录 C初学者指南-2.输入和输出---文件输入和输出1.写文本文件2.读文本文件3.打开关闭文件4.文件打开的模式 1.写文本文件 使用&#xff1a; std::ofstream&#xff08;输出文件流&#xff09; #include <fstream> // 文…

YOLOv8关键点pose训练自己的数据集

这里写自定义目录标题 YOLOv8关键点pose训练自己的数据集一、项目代码下载二、制作自己的关键点pose数据集2.1 标注(非常重要)2.1.1 标注软件2.1.2 标注注意事项a.多类别检测框b.单类别检测框2.2 格式转换(非常重要)2.3 数据集划分三、YOLOv8-pose训练关键点数据集3.1 训练…

通过frp实现内外网映射

frp介绍和使用方法可以参考官网:安装 | frp 1、准备两台服务器&#xff0c;一台内网服务器A&#xff0c;一台有公网ip的外网服务器B(47.12.13.15) 2、去官方仓库下载frp安装包&#xff1a;Releases fatedier/frp GitHub 下载包根据自己服务系统选择 ​ 3、先在外网服务器…

《昇思25天学习打卡营第1天|onereal》

昇思25天学习打卡营第1天;有点一头雾水的感觉&#xff0c;说是要在jupyter中签到打卡&#xff0c;是不是就是复制粘贴。我以为是要在终端机器中运行代码呢。 如果只是粘贴代码&#xff0c;那未免太简单了。 我还是想运行这个算力机器&#xff0c;但是他们说每次只能2小时。太…

AI播客下载:Eye on AI(AI深度洞察)

"Eye on A.I." 是一档双周播客节目&#xff0c;由长期担任《纽约时报》记者的 Craig S. Smith 主持。在每一集中&#xff0c;Craig 都会与在人工智能领域产生影响的人们交谈。该播客的目的是将渐进的进步置于更广阔的背景中&#xff0c;并考虑发展中的技术的全球影响…

pp 学习一 生产模块主数据

生产成本&#xff1a;原材料是什么&#xff0c;价格多少&#xff0c;人工耗费时间&#xff0c;以及其他的费用 离散制造&#xff1a;有生产订单。工序是分开的&#xff08;可以停&#xff09; 重复制造&#xff1a;没有生产订单&#xff08;可能有客户下达的任务单或者计划订…

一分钟彻底掌握Java多线程生产者与消费者模型

代码 package com.example.KFC; public class Cooker extends Thread { public void run() { while (true) { synchronized (Desk.lock) { if (Desk.maxCount 0) { break; } else { if (!Desk.flag) { System.out.println("Cooker makes a hamburger"); …

unity中使用commandbuffer将自定义画面渲染到主相机上

CommandBuffer 保存渲染命令列表&#xff08;例如设置渲染目标或绘制给定网格&#xff09;。您可以指示 Unity 在内置渲染管线中的各个点安排和执行这些命令&#xff0c;因此&#xff0c;您可以自定义和扩展 Unity 的渲染功能。 这句话意味着你可以通过command buffer让相机渲…

计算机基础知识——面向对象:封装+继承+多态整理

面向对象三大特性&#xff1a;封装、继承、多态。 1.封装 将一系列相关事物的共同的属性和行为提取出来&#xff0c;放到一个类中&#xff0c;同时隐藏对象的属性和实现细节&#xff0c;仅对外提供公共的访问方式。 【JavaBean类就可以看作是封装的完美案例。】 setter和get…

云动态摘要 2024-06-25

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新产品更新 Web应用防火墙 - 验证码支持微信小程序接入 阿里云 2024-06-25 支持客户从微信小程序场景下接入&#xff0c;提供人机识别的安全防护。 工业数字模型驱动引擎 - iDME控制台换新升级 华为云…

[20] Opencv_CUDA应用之 关键点检测器和描述符

Opencv_CUDA应用之 关键点检测器和描述符 本节中会介绍找到局部特征的各种方法&#xff0c;也被称为关键点检测器关键点(key-point)是表征图像的特征点&#xff0c;可用于准确定义对象 1. 加速段测试特征功能检测器 FAST算法用于检测角点作为图像的关键点&#xff0c;通过对…

轻松掌握:工科生如何高效阅读国际期刊和撰写论文(上)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

七天速通javaSE:第三天 程序控制结构:练习题

文章目录 前言一、基础1.计算从0~100之间奇数之和和偶数之和2. 用for循环输出0~1000之间能被5整除的数&#xff0c;每行输出三个 二、进阶1. 九九乘法表2.等边三角形 前言 本文主要讲解三种基本程序控制结构的练习题&#xff0c;以期熟练掌握顺序、选择、循环三种基本结构 一、…

怎么用Python接口发送推广短信

群发短信平台推广&#xff0c;有不少优点。其中通过正规106运营商平台推送&#xff0c;信息更加正规性。尤其是对接接口短信&#xff0c;比如验证码之类的&#xff0c;个人手机号码下发的验证码一般都不靠谱。 支持点对点一对一群发&#xff0c;方便工资条、物业通知等变量信息…