Backtrader 文档学习-Strategy with Signals

Backtrader 文档学习-Strategy with Signals

backtrader可以不通过重写策略的方式触发交易,尽管重写策略是首选通用的方式。
下面介绍通过使用信号也是可以实现交易触发的。

1.定义signal

import backtrader as btdata = bt.feeds.OneOfTheFeeds(dataname='mydataname')
cerebro.adddata(data)cerebro.add_signal(bt.SIGNAL_LONGSHORT, MySignal)
cerebro.run()
  • 做多:收盘价高于简单移动平均线
  • 做空:收盘价低于简单移动平均线
class MySignal(bt.Indicator):lines = ('signal',)params = (('period', 30),)def __init__(self):self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period)

执行run时,Cerebro将实例化一个知道如何处理信号的特殊策略实例。

2. 初始化的问题

  • 买入/卖出操作数量是如何确定的?
    cerebro实例会自动向策略添加一个固定大小的sizer。用户可以使用cerebro.addsizer更改sizer来更改策略 。

  • 订单是如何执行的?
    执行类型为Market,有效期至取消 。

3.Signals 技术细节

  • 调用时返回另一个对象的可调用对象(仅一次),在大多数情况下是类的实例化
  • 支持__getitem__接口。唯一请求的键/索引将设置为0

从实操的角度说明上面的例子:
来自BT的生态系统的Line对象,主要是一个指标类。
如在示例中使用简单移动平均线。

4.Signals indications

当用signal[0]查询时,指示其含义是:

  • 大于0 ,做多指示
  • 小于0 ,做空指示
  • 等于0 ,不信号指示

信号的产生是

self.data - SMA

data在SMA上,做多
data在SMA下,做空
如果没有特殊制定,都是使用的close数值

5. Signal分类

有5种类型的信号,分为2组。

(1)主组:
  • LONGSHORT signal接受long 和 short 信号
  • LONG
    • long 做多
    • short 在做多的位置上平仓
      但是:
    • 如果是 LONGEXIT 退出做多
    • 如果是 SHORT 非 LONGEXIT , 在做空之前平仓。
  • SHORT
    • short 继续做空
    • long 做空过程中,平仓
      但是:
    • 如果是 SHORTEXIT 退出做空
    • 如果是 LONG 非 SHORTEXIT , 开多仓之前先平仓。
(2)退出组:

两个信号覆盖其他信号,并为多头/空头仓位的出场提供信号:

  • LONGEXIT: 做空信号退出做多位置
  • SHORTEXIT: 做多信号退出做空位置

6. Accumulation and Order Concurrency

样本信号会持续发出多头和空头指示,从close中减去SMA值,这个值总是大于0或者小于0 。
因此持续触发order ,将出现两个情况:

  • Accumulation: 即使已经在市场上挂单,signal也会产生新的订单,增加市场中的头寸 。

  • Concurrency: 无需等待其他订单的执行,即可生成新订单产生并发。
    在默认设置下,累积和并发是禁止的 。

  • 不允许累积

  • 不允许并发
    如果要启用累积和并发,通过cerebro设置相应参数即可:

  • cerebro.signal_accumulate(True) (or False to re-disable it)

  • cerebro.signal_concurrency(True) (or False to re-disable it)

7.示例

主信号:

class SMACloseSignal(bt.Indicator):lines = ('signal',)params = (('period', 30),)def __init__(self):self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period)

退出信号:

class SMAExitSignal(bt.Indicator):lines = ('signal',)params = (('p1', 5), ('p2', 30),)def __init__(self):sma1 = bt.indicators.SMA(period=self.p.p1)sma2 = bt.indicators.SMA(period=self.p.p2)self.lines.signal = sma1 - sma2
(1)long and short

./signals-strategy.py --plot --signal longshort

在这里插入图片描述

  • 策略真的是多空双向的,可以看到的,现金水平永远不会等于价值水平 。
  • 即使是一个愚蠢的想法……(而且没有佣金),这个策略也没有赔钱 。
(2)long only

./signals-strategy.py --plot --signal longonly

在这里插入图片描述

  • 每次卖出后,现金水平回到价值水平,意味着该策略退出了市场
  • 旁注:同样没有金钱损失…
(3)short only

./signals-strategy.py --plot --signal shortonly

在这里插入图片描述

  • 第一个操作是预期的销售,发生在上述两个示例中的第一个操作之后。直到收盘低于均线,简单的减法得到一个负号 - 每次买入后,现金水平回到价值水平,意味着该策略退出了市场
  • 旁注:最后,系统赔钱了
(4)long + longexit

./signals-strategy.py --plot --signal longonly --exitsignal longexit

在这里插入图片描述

  • 很多交易都是一样,但是有些交易会因为快速移动平均线穿过慢速移动平均线向下移动而中断
  • 系统显示了它的longonly属性,现金成为每笔交易结束时的价值
  • 旁注:再次赚钱…即使修改交易
(5)代码
from __future__ import (absolute_import, division, print_function,unicode_literals)import argparse
import collections
import datetimeimport backtrader as btMAINSIGNALS = collections.OrderedDict((('longshort', bt.SIGNAL_LONGSHORT),('longonly', bt.SIGNAL_LONG),('shortonly', bt.SIGNAL_SHORT),)
)EXITSIGNALS = {'longexit': bt.SIGNAL_LONGEXIT,'shortexit': bt.SIGNAL_LONGEXIT,
}class SMACloseSignal(bt.Indicator):lines = ('signal',)params = (('period', 30),)def __init__(self):self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period)class SMAExitSignal(bt.Indicator):lines = ('signal',)params = (('p1', 5), ('p2', 30),)def __init__(self):sma1 = bt.indicators.SMA(period=self.p.p1)sma2 = bt.indicators.SMA(period=self.p.p2)self.lines.signal = sma1 - sma2def runstrat(args=None):args = parse_args(args)cerebro = bt.Cerebro()cerebro.broker.set_cash(args.cash)dkwargs = dict()if args.fromdate is not None:fromdate = datetime.datetime.strptime(args.fromdate, '%Y-%m-%d')dkwargs['fromdate'] = fromdateif args.todate is not None:todate = datetime.datetime.strptime(args.todate, '%Y-%m-%d')dkwargs['todate'] = todate# if dataset is None, args.data has been givendata = bt.feeds.BacktraderCSVData(dataname=args.data, **dkwargs)cerebro.adddata(data)cerebro.add_signal(MAINSIGNALS[args.signal],SMACloseSignal, period=args.smaperiod)if args.exitsignal is not None:cerebro.add_signal(EXITSIGNALS[args.exitsignal],SMAExitSignal,p1=args.exitperiod,p2=args.smaperiod)cerebro.run()if args.plot:pkwargs = dict(style='bar')if args.plot is not True:  # evals to True but is not Truenpkwargs = eval('dict(' + args.plot + ')')  # args were passedpkwargs.update(npkwargs)cerebro.plot(**pkwargs)def parse_args(pargs=None):parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter,description='Sample for Signal concepts')parser.add_argument('--data', required=False,default='./datas/2005-2006-day-001.txt',help='Specific data to be read in')parser.add_argument('--fromdate', required=False, default=None,help='Starting date in YYYY-MM-DD format')parser.add_argument('--todate', required=False, default=None,help='Ending date in YYYY-MM-DD format')parser.add_argument('--cash', required=False, action='store',type=float, default=50000,help=('Cash to start with'))parser.add_argument('--smaperiod', required=False, action='store',type=int, default=30,help=('Period for the moving average'))parser.add_argument('--exitperiod', required=False, action='store',type=int, default=5,help=('Period for the exit control SMA'))parser.add_argument('--signal', required=False, action='store',default=MAINSIGNALS['longshort'], choices=MAINSIGNALS,help=('Signal type to use for the main signal'))parser.add_argument('--exitsignal', required=False, action='store',default=None, choices=EXITSIGNALS,help=('Signal type to use for the exit signal'))# Plot optionsparser.add_argument('--plot', '-p', nargs='?', required=False,metavar='kwargs', const=True,help=('Plot the read data applying any kwargs passed\n''\n''For example:\n''\n''  --plot style="candle" (to plot candles)\n'))if pargs is not None:return parser.parse_args(pargs)return parser.parse_args()if __name__ == '__main__':runstrat()

help参数说明:

python ./signals-strategy.py --help
usage: signals-strategy.py [-h] [--data DATA] [--fromdate FROMDATE][--todate TODATE] [--cash CASH][--smaperiod SMAPERIOD] [--exitperiod EXITPERIOD][--signal {longshort,longonly,shortonly}][--exitsignal {longexit,shortexit}][--plot [kwargs]]Sample for Signal conceptsoptional arguments:-h, --help            show this help message and exit--data DATA           Specific data to be read in (default:./datas/2005-2006-day-001.txt)--fromdate FROMDATE   Starting date in YYYY-MM-DD format (default: None)--todate TODATE       Ending date in YYYY-MM-DD format (default: None)--cash CASH           Cash to start with (default: 50000)--smaperiod SMAPERIODPeriod for the moving average (default: 30)--exitperiod EXITPERIODPeriod for the exit control SMA (default: 5)--signal {longshort,longonly,shortonly}Signal type to use for the main signal (default: 1)--exitsignal {longexit,shortexit}Signal type to use for the exit signal (default: None)--plot [kwargs], -p [kwargs]Plot the read data applying any kwargs passed Forexample: --plot style="candle" (to plot candles)(default: None)

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

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

相关文章

HarmonyOS应用开发学习笔记 UIAbility组件与UI的数据同步 EventHub、globalThis

1、 HarmoryOS Ability页面的生命周期 2、 Component自定义组件 3、HarmonyOS 应用开发学习笔记 ets组件生命周期 4、HarmonyOS 应用开发学习笔记 ets组件样式定义 Styles装饰器:定义组件重用样式 Extend装饰器:定义扩展组件样式 5、HarmonyOS 应用开发…

Netty-Netty组件了解

EventLoop 和 EventLoopGroup 回想一下我们在 NIO 中是如何处理我们关心的事件的?在一个 while 循环中 select 出事 件,然后依次处理每种事件。我们可以把它称为事件循环,这就是 EventLoop 。 interface io.netty.channel. EventLoo…

权值初始化

一、梯度消失与爆炸 在神经网络中,梯度消失和梯度爆炸是训练过程中常见的问题。 梯度消失指的是在反向传播过程中,梯度逐渐变小,导致较远处的层对参数的更新影响较小甚至无法更新。这通常发生在深层网络中,特别是使用某些激活函…

TDengine 签约西电电力

近年来,随着云计算和物联网技术的迅猛发展,传统电力行业正朝着数字化、信息化和智能化的大趋势迈进。在传统业务基础上,电力行业构建了信息网络、通信网络和能源网络,致力于实现发电、输电、变电、配电和用电的实时智能联动。在这…

用C#实现简单的线性回归

前言 最近注意到了NumSharp,想学习一下,最好的学习方式就是去实践,因此从github上找了一个用python实现的简单线性回归代码,然后基于NumSharp用C#进行了改写。 NumSharp简介 NumSharp(NumPy for C#)是一…

[redis] redis主从复制,哨兵模式和集群

一、redis的高可用 1.1 redis高可用的概念 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%、99.99%、99.999%等等)。 高可用的计算公式是1-(宕机时间)/(宕机时…

leetcode17 电话号码的字母组合

方法1 if-else方法 if-else方法的思路及其简单粗暴,如下图所示,以数字234为例,数字2所对应的字母是abc,数字3所对应的是def,数字4所对应的是ghi,最后所产生的结果就类似于我们中学所学过的树状图一样&…

opencv-4.8.0编译及使用

1 编译 opencv的编译总体来说比较简单,但必须记住一点:opencv的版本必须和opencv_contrib的版本保持一致。例如opencv使用4.8.0,opencv_contrib也必须使用4.8.0。 进入opencv和opencv_contrib的github页面后,默认看到的是git分支&…

浅析三种Anaconda虚拟环境创建方式和第三方包的安装

目录 引言 一、Anaconda虚拟环境创建方式 1. 使用conda命令创建虚拟环境 2. 使用conda-forge创建虚拟环境 3. 使用Miniconda创建虚拟环境 二、第三方包的安装和管理 1. 使用 pip 安装包: 2. 使用 conda 安装包: 三、结论与建议 引言 在当今的数…

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》

【现代密码学】笔记3.1-3.3 --规约证明、伪随机性《introduction to modern cryphtography》 写在最前面私钥加密与伪随机性 第一部分密码学的计算方法论计算安全加密的定义:对称加密算法 伪随机性伪随机生成器(PRG) 规约法规约证明 构造安全…

Nacos和Eureka比较、统一配置管理、Nacos热更新、多环境配置共享、Nacos集群搭建步骤

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Nacos和eureka的对比二、统一配置管理二、Nacos热更新方式一方式二 三、多环境配置共享四、Nacos集群搭建步骤(黑马springCloud的p29&#xff0…

深度学习笔记(五)——网络优化(1):学习率自调整、激活函数、损失函数、正则化

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 通过学习已经掌握了主要的基础函数之后具备了搭建一个网络并使其正常运行的能力,那下一步我们还…

JavaScript基础(26)_dom增删改练习

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><title>DOM增删改练习</title><link rel"stylesheet" href"../browser_default_style/reset.css"><style>table {borde…

vue路由及参数router

目录 vue项目版本1、创建一个vue项目步骤 &#xff08;windows环境下&#xff09;。创建vue项目前&#xff0c;检查系统是否具备创建项目的条件&#xff08;是否已经安装好了node.js、webpack、vue-cli&#xff09;。cmd打开终端。2、vue路由vue-router解说2.1 路由视图<rou…

【GDAL】Windows下VS+GDAL开发环境搭建

Step.0 环境说明&#xff08;vs版本&#xff0c;CMake版本&#xff09; 本地的IDE环境是vs2022&#xff0c;安装的CMake版本是3.25.1。 Step.1 下载GDAL和依赖的组件 编译gdal之前需要安装gdal依赖的组件&#xff0c;gdal所依赖的组件可以在官网文档找到&#xff0c;可以根据…

Kafka(七)可靠性

目录 1 可靠的数据传递1.1 Kafka的可靠性保证1.2 复制1.3 Broker配置1.3.1 复制系数1.3.2 broker的位置分布1.3.3 不彻底的首领选举1.3.4 最少同步副本1.3.5 保持副本同步1.3.6 持久化到磁盘flush.messages9223372036854775807flush.ms9223372036854775807 1.2 在可靠的系统中使…

Netty开篇——基础介绍与准备(一)

I/O篇 Netty的介绍 Netty 是由JBOSS提供的一个Java开源框架在Github上Netty 是一个异步的、基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能、高可靠性的网络IO程序。Netty 主要针对在TCP协议下面向客户端的高并发应用&#xff0c;或者Peer-to-Peer/P2P场景下的大量…

day17 平衡二叉树 二叉树的所有路径 左叶子之和

题目1&#xff1a;110 平衡二叉树 题目链接&#xff1a;110 平衡二叉树 题意 判断二叉树是否为平衡二叉树&#xff08;每个节点的左右两个子树的高度差绝对值不超过1&#xff09; 递归遍历 递归三部曲 1&#xff09;确定递归函数的参数和返回值 2&#xff09;确定终止条…

数据结构链表完整实现(负完整代码)

文章目录 前言引入1、链表定义及结构链表的分类3、单向不带头链表实现实现完整代码 4、带头双向循环链表实现实现完整代码 前言 引入 在上一篇文章中&#xff0c;我们认识了顺序表&#xff0c;但是在许多情况中&#xff0c;顺序表在处理一些事件时还存在许多问题&#xff0c;比…

鸿鹄电子招投标系统:企业战略布局下的采购寻源解决方案

在数字化采购领域&#xff0c;企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力&#xff0c;通过待办消息、招标公告、中标公告和信息发布等功能模块…