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.mzph.cn/news/614360.shtml

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

相关文章

14. C++ malloccallocrecalloc

一、malloc函数 谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道。 1.1 关于malloc相关的几个函数 可以这样认为(window下)原型: extern void *malloc(unsigned int num_bytes);如果分配成…

怎么用 Excel 做出专业的 project 甘特图?10个步骤和60个模板

使用Excel来创建Project甘特图的步骤包括:1、基本设置和布局调整、2、数据输入和时间线配置、3、任务依赖性和进度跟踪、4、视觉效果优化、5、数据更新和维护、6、模板保存和共享。尤其突出基本设置和布局调整,它是构建一个清晰、有效的甘特图的基础。 甘…

基于龙格库塔算法的SIR病毒扩散预测matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于龙格库塔算法的SIR病毒扩散预测,通过龙格库塔算法求解传染病模型的微分方程。输出易受感染人群数量曲线,感染人群数量曲线,康复人群数…

nextjs + ahooks 报错 Cannot use import statement outside a module

在 nextjs 中使用 ahooks 时,报错 SyntaxError: Cannot use import statement outside a module,如下图所示: 解决方案 transpilePackages 官网介绍 Next.js can automatically transpile and bundle dependencies from local packages (lik…

【Flutter 开发实战】Dart 基础篇:常见的数据类型

Dart 支持许多数据类型,包括我们常见的 Numbers(数值类型)、Strings(字符串类型)、Booleans(布尔类型),也支持一些包括 Collections(集合类型)、Records&…

idea编译报错(Maven项目)

idea编译报错 找不到符号 第一步:开启注解处理器 第二步:清理MVN,package并重新编译 第三步:重新导入项目:

vue element-ui的table列表中展示缩略图片效果实例

这篇文章主要给大家介绍了关于vue element-ui的table列表中展示多张图片(可放大)效果的相关资料,文中通过代码示例介绍的非常详细,需要的朋友可以参考下 一、效果图 二、代码部分 1、原理 使用 <el-table-column> 和 <el-image> 组件来在表格中插入缩略图 2、te…

杨中科 .NETCORE NuGet

一 简介 Zack.EFCore.Batch 使用这个开发包Entity Framework Core用户可以使用LINQ语句删除或者更新多条数据库记录&#xff0c;操作只执行一条SQL语句并且不需要首先把实体对象加载到内存中。这个开发包支持Entity Framework Core 5.0以及更高版。 操作说明: 第一步 Install-…

腾讯NUS推出下一代多模态智能,支持2/3D视觉、听觉、触觉、脑电

多模态感知一直是通用人工智能发展的关键领域。理想中的智能体能像人类一样感知多种模态信息&#xff0c;如视觉、听觉、嗅觉、触觉等&#xff0c;并与用户进行自然交互。然而&#xff0c;现有的大型模型虽然在图像和文字上表现出色&#xff0c;但对其他模态&#xff08;如3D点…

Qt QSpinBox微调框控件

文章目录 1 属性和方法1.1 值1.2 步长1.3 循环1.4 加速1.5 前缀和后缀1.6 信号和槽 2 实例2.1 布局2.2 代码实现 微调框&#xff0c;允许用户按照一定的步长&#xff0c;来增加或减少其中显示的数值 修改微调框数值的方式包括&#xff1a; 单击右侧的向上/向下按钮按键盘的向上…

LINUX——动/静态库

加油加油~ 目录&#xff1a; 动/静态库是什么&#xff1f; .o文件是什么&#xff1f; 以gcc编译器为例&#xff0c;查看xxx.i xxx.s xxx.o文件 生成test.i文件(预处理) 生成test.s文件(编译) 生成test.o文件(汇编) 生成可执行程序(链接)&#xff1a; 小结&#xff1a…

Git 基础指令

Git 基础指令 本章涵盖了我们在使用 Git 完成各种操作时将会用到的各种基本命令。 在学习完本章之后&#xff0c;我们应该能够配置并初始化一个仓库&#xff08;repository&#xff09;、开始或停止跟踪&#xff08;track&#xff09;文件、暂存&#xff08;stage&#xff09;…

模拟数字转换器

本节主要介绍以下内容&#xff1a; ADC简介 ADC功能框图详解 参考资料:《零死角玩转STM32》“ADC—电压采集”章节 一、ADC简介 ADC &#xff1a;Analog to Digital&#xff0c;模拟数字转换器 三个独立的ADC 1 / 2 / 3分辨率为12位每个ADC具有18个通道&#xff0c;其中…

代码随想录刷题笔记(DAY 10)

今日总结&#xff1a;快要期末考试了&#xff0c;现在在疯狂速成&#xff0c;今天稍微缓和了一点&#xff0c;应该能保证继续每天刷题&#xff0c;欠下的那些寒假补上。 Day 10 01. 用栈实现队列&#xff08;No. 232&#xff09; 题目链接 代码随想录题解 1.1 题目 请你仅…

AcWing1210-连号区间

文章目录 题目输入格式输出格式数据范围样例输入样例1输出样例1输入样例2输出样例2样例解释 思路代码 题目 输入格式 输出格式 数据范围 样例 输入样例1 4 3 2 4 1 输出样例1 7 输入样例2 5 3 4 2 5 1 输出样例2 9 样例解释 思路 固定L&#xff0c;遍历R在[L,R]区域中找到最大…

参数小,性能强!开源多模态模型—TinyGPT-V

安徽工程大学、南洋理工大学和理海大学的研究人员开源了多模态大模型——TinyGPT-V。 TinyGPT-V以微软开源的Phi-2作为基础大语言模型&#xff0c;同时使用了视觉模型EVA实现多模态能力。尽管TinyGPT-V只有28亿参数&#xff0c;但其性能可以媲美上百亿参数的模型。 此外&…

仿蓝奏云网盘 /file/list SQL注入漏洞复现

0x01 产品简介 仿蓝奏网盘是一种类似于百度网盘的文件存储和共享解决方案。它为用户提供了一个便捷的平台,可以上传、存储和分享各种类型的文件,方便用户在不同设备之间进行文件传输和访问。 0x02 漏洞概述 仿蓝奏云网盘 /file/list接口处存在SQL注入漏洞,登录后台的攻击…

Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent

文章目录 Pre概述Code源码分析 Pre Spring Boot - Application Events 的发布顺序_ApplicationEnvironmentPreparedEvent 概述 Spring Boot 的广播机制是基于观察者模式实现的&#xff0c;它允许在 Spring 应用程序中发布和监听事件。这种机制的主要目的是为了实现解耦&#…

RabbitMQ入门到实战——高级篇

消息的可靠性 生产者的可靠性&#xff08;确保消息一定到达MQ&#xff09; 生产者重连 这⾥除了enabled是false外&#xff0c;其他 initial-interval 等默认都是⼀样的值。 生产者确认 生产者确认代码实现 application中增加配置&#xff1a;&#xff08;publisher-returns…

《MySQL系列-InnoDB引擎06》MySQL锁介绍

文章目录 第六章 锁1 什么是锁2 lock与latch3 InnoDB存储引擎中的锁3.1 锁的类型3.2 一致性非锁定读3.3 一致性锁定读3.4 自增长与锁3.5 外键和锁 4 锁的算法4.1 行锁的三种算法4.2 解决Phantom Problem 5 锁问题5.1 脏读5.2 不可重复读5.3 丢失更新 6 阻塞7 死锁 第六章 锁 开…