BackTrader-Commission 06

Backtrader 策略实例,该部分内容通过使用backtrader对常用的策略实例的编写,提高和熟悉backtrader的实际场景的使用。
[Backtrader]实例:均线策略
[Backtrader] 实例:MACD策略
[Backtrader] 实例:KDJ 策略
[Backtrader] 实例:RSI 与 EMA 结合
[Backtrader] 实例:SMA自定义数据源
[Backtrader] 实例:海龟策略
[Backtrader] 实例:网格交易
[Backtrader] 实例: 配对交易

本系列是使用Backtrader在量化领域的学习与实践,着重介绍Backtrader的使用。Backtrader 中几个核心组件:

  • Cerebro:BackTrader的基石,所有的操作都是基于Cerebro的。
  • Feed:将运行策略所需的基础数据加载到Cerebro中,一般为K线数据。
  • Indicator:BackTader自带的指标,并集成了talib中的指标。我们也可以选择继承一个Indicator实现自己的指标。
  • Strategy:交易策略。这里是整个过程中最复杂的部分,需要我们计算买入/卖出信号。
  • Analyzer:分析器,以图形和风险收益等指标对交易策略的回测结果进行分析评价。
  • Order:订单,记录了与当前订单相关的所有数据。
  • Trader:交易,记录了与当前交易相关的所有数据。
  • Position:持仓,记录了与当前持仓相关的所有数据。
  • Broker:可以理解成经纪人,整个策略的初始资金、交易费率、滑点等参数需要通过Broker进行设置。
  • Observer:观察者,对数据进行监控观察,比如资金曲线等等。
  • Plotting:可视化组件

本次介绍Backtrader中Commission Schemes 模块,其是Backtrader核心模块之一, 时通过Commission Schemes模块进行交易税费、佣金、手续费设置。

在使用Backtrader时,结合量化策略编写过程通常会考虑:

  1. Commission Schemes 交易税费如何设置?
  2. 支持哪些标的?不同标的设置差异在哪里?
  3. 对于策略回测,在多资产组合情况下如何设置交易税费?

Commission Schemes 交易税费

Broker模拟经纪商交易系统相关功能,支持不同订单类型、对交易进行“验资验券”,并模拟交易所进行交易撮合。最常见的有初始资金、交易税费、滑点、期货保证金比率等。而期货保证金比率、佣金、手续费等在Commission Schemes模块中进行设置。

Broker

在 Backtrader 中,从数据准备、策略编制、策略回测到绩效分析,整个回测流程各个模块相互协调,从交易流程大致如下:

  • step1:设置交易条件:初始资金、交易税费、滑点、成交量限制等;
  • step2:在 Strategy 策略逻辑中下达交易指令 buy、sell、close,或取消交易 cancel;
  • step3:Order 模块会解读交易订单,解读的信息将交由经纪商 Broker 模块处理;
  • step4:经纪商 Broker 会根据订单信息检查订单并确定是否接收订单;
  • step5:经纪商 Broker 接收订单后,会按订单要求撮合成交 trade,并进行成交结算;
  • step6:Order 模块返回经纪商 Broker 中的订单执行结果。

在backtrader中做策略回测,在策略运行前,Broker实现账户资金、份额等信息初始化,同时通过Commission Schemes模块进行交易税费、佣金、手续费设置。

交易中的交易税费

在常规情况,交易过程总体金额包含交易费用还有佣金、手续费等,在不同市场不同的标的的费用收费规则不同,以股票、期货为例:

  1. 股票:沪深A股市场收费项包括:佣金、交易经手费、证券证管费、登记过户费、印花税;

    • 佣金:采用双向收费(买卖),收取比例也存在一定的浮动,通常在不得超过成交金额的3‰;券商可以在此区间自由调整,最低5元起,即单笔交易佣金不满5元按5元收取
    • 交易经手费:由交易所收取,买卖双向收取,成交金额的万分之0.341(0.0341‰);
    • 证券证管费:由券商代收后交给证监会,买卖双向收取。收费标准为成交金额的万分之0.2(0.02‰)
    • 登记过户费:由券商代收后交给中国证券登记结算有限公司,买卖双向收取,收费标准为成交金额的万分之0.1(0.01‰)
    • 印花税:仅在卖出时收取,税率万分之5(0.5‰);

    假设沪市买入1万元:

    • 券商全佣金 = 交易经手费(万分之0.341) + 证券证管费(万分之0.2) + 登记过户费(万分之0.1) + 佣金(万分之0.2)= 0.341 + 0.2 + 0.1 + 0.2 = 0.841元。由于不满5元,按5元收取。
    • 印花税 = 0

    假设沪市卖出1万元:

    • 券商全佣金 = 交易经手费(万分之0.341) + 证券证管费(万分之0.2) + 登记过户费(万分之0.1) + 佣金(万分之0.2)= 0.341 + 0.2 + 0.1 + 0.2 = 0.841元。由于不满5元,按5元收取。
    • 印花税 = 5
  2. 期货:期货总手续费=交易所手续费+期货公司手续费,交易所手续费一般固定不变,期货公司手续费弹性较大。除了交易费用外,期货交易时还需上交一定比例的保证金 。

    • 交易所手续费一般固定不变,但不同期货品种的收取方式不相同,有的按照固定费用收取,有的按成交金额的固定百分比收取:合约现价 * 合约乘数 * 手续费费率 。例如:IF(沪深300指数) 采用双向收费,费率为万分之0.23;TL(30年期国债)采用单边收费,费用3元。

    • 期货公司手续费弹性较大

税费模式

在Backtrader中,通过 Commission Schemes 进行交易费设置,也可以自定义费用函数。在Commission Schemes中,

  • 根据交易品种:提供 股票(stocklike) 和 期货 两类的税费收取模式;
  • 根据计算方式不同:提供 PERC百分比模式 和 FIXED固定收费模式;

目前Backtrader,品种(股票、期货)下可支持的模式:

  • 股票

    • 百分比 + 无保证金
  • 期货

    • 固定收费 + 保证金
    • 百分比 + 保证金
# 期货品种,手续费/佣金为2.0,保证金为2000.0 ,乘数10.0 , stocklike = False 表示期货模式
cerebro.broker.setcommission(commission=2.0, margin=2000.0, mult=10.0,stocklike=False)# 股票品种,佣金为:0.5%。
cerebro.broker.setcommission(commission=0.005,stocklike=True) 

Backtrader中3种税费设置方式

在Backtrader中,提供了3种税费设置方式,分别为setcommission()、addcommissioninfo()、BackBroker():

setCommission()的参数

setCommission()中常用的参数:

    def setcommission(self,commission=0.0, margin=None, mult=1.0,commtype=None, percabs=True, stocklike=False,interest=0.0, interest_long=False, leverage=1.0,automargin=False,name=None):
  • commission(默认: 0.0) 手续费/佣金

    股票:如果stocklike=True,则commission代表百分比值;

    期货:如果stocklike=False,margin为0 或 None,则commission代表每份合约固定费用;

  • margin(默认: None) 保证金/保证金比例

    如果 margin 为默认值,则commission代表百分比,否则代表固定费用,在双向操作(买入、卖出)计算相应费用;

  • mult(默认: 1.0) 乘数

    mult 乘数 专用于期货品种的参数。

  • commtype(默认:None) 交易费用计算方式:COMM_PERC、COMM_FIXED

    若赋值为COMM_PERC 百分比费用方式,COMM_FIXED 固定费用方式;若为None,bt将更加margin取值来确定类型

  • percabs(默认:True)

    当交易费用以百分比模式下时,commission 是否以 % 形式。若为True,则表示不以% 为单位,采用0.xx形式;若False,则表示以 % 为单位,采用x% 形式;

  • stocklike(默认:False)是否为股票模式

    是否为股票模式,该模式通常由margin和commtype参数决定。margin=None或COMM_PERC模式时,就会stocklike=True,对应股票手续费;margin设置了取值或COMM_FIXED模式时,就会stocklike=False,对应期货手续费

  • interest(默认:0.0)空头头寸的年化利息

    计算持有的空头头寸的年化利息 = days * price * abs(size) * (interest / 365)

  • interest_long(默认:False)

    计算持有的多头头寸的年化利息

  • leverage(默认1.0)杠杆比率

    交易时按该杠杆调整所需现金

  • automargin(默认: False) 自动计算保证金

    如果False,则通过margin参数确定保证金;如果automargin<0,通过mult * price 确定保证金;如果automargin>0,如果automargin * price 确定保证金

  • name(默认: None)

    将佣金计划的适用范围限定为与名称匹配的工具,如果取值为None,则默认作用于所有数据集(也就是作用于所有assets)。

addcommissioninfo

通过继承CommInfoBase自定义交易费用子类,再通过addcommissioninfo方法实例

# 在继承 CommInfoBase 基础类的基础上自定义交易费用
class MyCommission(bt.CommInfoBase):# 对应 setcommission 中介绍的那些参数,也可以增添新的全局参数params = ((xxx, xxx),)# 自定义交易费用计算方式def _getcommission(self, size, price, pseudoexec):pass# 自定义佣金计算方式def get_margin(self,price):pass...# 实例化
mycomm = MyCommission(...)
cerebro = bt.Cerebro()
# 添加进 broker
cerebro.broker.addcommissioninfo(mycomm, name='xxx') # name 用于指定该交易费用函数适用的标的

BackBroker

在股票回测中,通过BackBroker全局设置交易佣金费用

# 设置 0.0002 = 0.02% 的手续费
cerebro.broker = bt.brokers.BackBroker(commission= 0.0002)

自定义税费函数

Backtrader 中默认配置了 2 种费用:“股票百分比费用”和“期货固定费用”。

通过继承CommInfoBase自定义交易费用子类,再定义相关税费参数,重写_getcommission方法,最后通过broker.addcommissioninfo方法。

  1. 继承CommInfoBase
  • 期货固定费用

    class CommInfo_Futures_Fixed(CommInfoBase):params = (('stocklike', False),('commtype', CommInfoBase.COMM_FIXED),)
  • 股票百分比费用

    class CommInfo_Stocks_PercAbs(CommInfoBase):params = (('stocklike', True),('commtype', CommInfoBase.COMM_PERC),('percabs', True), # pass perc as 0.xx)
    
  1. 重写_getcommission

    def _getcommission(self, size, price, pseudoexec):
    '''Calculates the commission of an operation at a given pricepseudoexec: if True the operation has not yet been executed
    '''
    
  2. 通过addcommissioninfo调用

    comminfo = CommInfo_Stocks_PercAbs(commission=0.005)  # 0.5%
    cerebro.broker.addcommissioninfo(comminfo)
    
import backtrader as bt# 自定义期货百分比费用
class CommInfo_Fut_Perc_Mult(bt.CommInfoBase):params = (('stocklike', False), # 指定为期货模式('commtype', bt.CommInfoBase.COMM_PERC), # 使用百分比费用('percabs', False), # commission 以 % 为单位)def _getcommission(self, size, price, pseudoexec):# 计算交易费用return (abs(size) * price) * (self.p.commission/100) * self.p.mult# pseudoexec 用于提示当前是否在真实统计交易费用# 如果只是试算费用,pseudoexec=False# 如果是真实的统计费用,pseudoexec=Truecomminfo = CommInfo_Fut_Perc_Mult(commission=0.1, # 0.1%mult=10,margin=2000) # 实例化cerebro.broker.addcommissioninfo(comminfo)# 上述自定义函数,也可以通过 setcommission 来实现
cerebro.broker.setcommission(commission=0.1, #0.1%mult=10,margin=2000,percabs=False,commtype=bt.CommInfoBase.COMM_PERC,stocklike=False)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

WordPress伪静态设置

为什么要设置WordPress伪静态&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;中&#xff0c;静态URL通常被认为更易于搜索引擎爬虫抓取和索引&#xff0c;有助于提高网站的搜索引擎排名。 WordPress伪静态设置方法主要依赖于服务器环境&#xff0c;以下是针对不同服务器…

sublime python出现中文乱码怎么办

一、乱码现象 利用sublime自带编译快捷方式ctrlB会出现中文乱码的情况。 print("没有循环数据!") print("完成循环!") 二、寻找原因 1、由于之前我已经安装了插件ConvertToUTF8&#xff0c;排除文本编码错误问题。 2、相同的代码在插件sublimerepl搭建的…

【ARM Linux 系统稳定性分析入门及渐进 1.2 -- Crash 工具依赖内容】

请阅读:【Linux 维测及Crash使用专栏】 文章目录 Prerequisites1. 内核对象文件2. 内存镜像3. 平台处理器类型4. Linux 内核版本 Prerequisites crash 工具需要依赖下面的内容&#xff1a; 1. 内核对象文件 vmlinux 文件&#xff1a;需要一个 vmlinux 内核对象文件&#xff…

电路设计过程就是波形整形过程

这种说法有一定的道理。在电路设计中&#xff0c;常常需要对输入的电信号波形进行处理和调整&#xff0c;以满足后续电路或系统的要求&#xff0c;这在某种程度上可以理解为波形整形的过程。 例如&#xff0c;在数字电路中&#xff0c;输入的信号可能存在噪声、干扰或者不符合…

计算机视觉-显著性检测实验报告

实验四 显著性检测实验 一、实验目的 掌握多种显著性检测算法的基本原理。学会使用计算机程序实现不同的显著性检测方法。通过对比不同的显著性检测算法&#xff0c;理解各算法的优缺点。分析显著性检测在实际图像处理应用中的效果和局限性。 二、实验内容和要求 1&#x…

05-Dubbo的应用及注册和SPI机制

05-Dubbo的应用及注册和SPI机制 Dubbo 的服务注册中应用级注册优化 Dubbo 的注册中心 Dubbo 支持很多种注册中心&#xff0c;支持的主流注册中心包括&#xff1a;ZooKeeper、Nacos、Redis Dubbo 需要引入注册中心依赖&#xff0c;并且配置注册中心地址&#xff0c;这里以 ZooKe…

【 AI 大模型:重塑软件开发的新势力】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

南宁周边乡村游微信小程序ssm+论文源码调试讲解

第二章 开发工具及关键技术介绍 2.1微信开发者工具 微信开发者工具现在已经被小程序开发团队开发运行&#xff0c;目前微信开发者工具任然在不断的完善中&#xff0c;在开发小程序时经常要不断的更新。可以使用微信扫码登陆开发者工具&#xff0c;开发者工具将使用这个微信帐号…

ssm校园二手交易管理系统+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 1 绪论 1 1.1 选题背景 1 1.2 选题意义 1 1.3 研究内容 2 2 系统开发技术 3 2.1 MySQL数…

DB-GPT系列(二):DB-GPT部署(镜像一键部署、源码部署)

一、简介 DB-GPT 是一个开源项目&#xff0c;其将大语言模型 LLM 与数据库紧密结合。该项目主要致力于探索如何让预训练的大规模语言模型&#xff08;例如 GPT&#xff09;能够直接与数据库进行交互&#xff0c;从而生成更为准确且信息丰富的回答。 DB-GPT部署后能否直接使用…

掌握 Jest 配置文件:优化单元测试的灵活性与可维护性

引言 在现代软件开发中&#xff0c;单元测试是确保代码质量和稳定性的关键步骤。Jest 是一个广泛使用的 JavaScript 测试框架&#xff0c;提供了丰富的配置选项来优化测试过程。通过配置文件&#xff0c;开发者可以更灵活地控制测试环境&#xff0c;确保测试的可靠性和可维护性…

网络:IP分片和组装

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言16位标识&#xff0c;3位标志&#xff0c;13位片偏移分片组装总结 前言 对于IP分片和组装的总结 当一个IP数据报的大小超过网络的MTU(最…

Node.js:Express 中间件 CORS 跨域资源共享

Node.js&#xff1a;Express 中间件 & CORS 中间件全局中间件局部中间件分类错误级中间件内置中间件 CORS原理预检请求 中间件 中间件是不直接接收请求&#xff0c;也不直接发送响应&#xff0c;而是在这之间处理一个中间过程的组件。 当一个请求到来&#xff0c;会经过多…

【VScode】中文版ChatGPT编程工具-CodeMoss!教程+示例+快捷键

文章目录 1. 多模型选择2. 编辑快捷键3. 历史记录收藏 CodeMoss使用教程1. 安装CodeMoss插件2. 配置AI模型3. 使用快捷键4. 进行代码优化与解释5. 收藏历史记录 总结与展望 在当今快速发展的编程世界中&#xff0c;开发者们面临着越来越多的挑战。如何提高编程效率&#xff0c;…

LabVIEW适合开发的软件

LabVIEW作为一种图形化编程环境&#xff0c;主要用于测试、测量和控制系统的开发。以下是LabVIEW在不同应用场景中的适用性和优势。 一、测试与测量系统 LabVIEW在测试与测量系统中的应用广泛&#xff0c;是工程测试领域的主流工具之一。利用其强大的数据采集与处理功能&…

命令模式(Command)

1 意图 将一个请求封装为一个对象&#xff0c;从而使得可以用不同的请求对客户进行参数化;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 2 结构 Command 声明执行操作的接口。ConcreteCommand 将一个接收者对象绑定于一个动作;调用接收者相应的操作&#xff0c…

Linux 线程概念

一. 线程的基本概念 线程是进程内的一个执行单元&#xff0c;它是调度和执行的基本单位。 1.1 Linux中的线程 在Linux系统中&#xff0c;在CPU眼中&#xff0c;看到的PCB都要比传统的进程更加轻量化。 1.2 线程的优点 创建一个新线程的代价要比创建一个新进程小得多。与进…

Qt聊天室项目

目录 项目要求 项目背景 技术分析 架构设计 服务器架构 模块划分 模块之间的交互 客户端架构 模块划分 模块之间交互 项目展示 项目实现 服务器 ui server.pro dialog.h dialog.cpp 客户端 ui cient.pro dialog.h dialog.cpp 打包步骤不做演示 视频演示 项目…

node.js模块化分析

什么是Node.js模块化 Node.js中的模块化‌是指将一个大文件拆分成独立且相互依赖的多个小模块。每个JS文件被视为一个独立的模块&#xff0c;模块之间是互相不可见的。如果一个模块需要使用另一个模块&#xff0c;则需要使用指定的语法来引入该模块&#xff0c;并且只能使用模块…

sql练习专场(一) (1-5)

这是总结的一些sql题目&#xff0c;共25道题&#xff0c;每个博客会写5道题 第一题 这道题需要找出连续活跃3天以上的用户&#xff0c;其中每个用户每天可以连续登录多次。 create table sql1_1(uid string,dt string );insert into sql1_1 values(A,2023-10-01),(A,2023…