Backtrader 文档学习-Strategy with Signals

news2024/11/20 16:35:37

Backtrader 文档学习-Strategy with Signals

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

1.定义signal

import backtrader as bt

data = 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 datetime

import backtrader as bt

MAINSIGNALS = 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 - sma2


def 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'] = fromdate

    if 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 given
    data = 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 True
            npkwargs = eval('dict(' + args.plot + ')')  # args were passed
            pkwargs.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 options
    parser.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 concepts

optional 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 SMAPERIOD
                        Period for the moving average (default: 30)
  --exitperiod EXITPERIOD
                        Period 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 For
                        example: --plot style="candle" (to plot candles)
                        (default: None)

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

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

相关文章

微信公众号使用后端代码接入开发指南

1. 部署到服务器一套后端服务 要求:外界通过get请求可以访问到该服务,并且该地址只返回文本:hello, this is handle view,这就是下面这段代码的意思 这段代码的意思就是服务匹配到/wx的get请求,返回文本hello, this …

【UE Niagara学习笔记】07 - 火焰的热变形效果

目录 效果 步骤 一、创建热变形材质 二、添加新的发射器 2.1 设置粒子材质 2.2 设置粒子初始大小 2.3 设置粒子持续生成 三、修改材质 四、设置粒子效果 在上一篇博客(【UE Niagara学习笔记】06 - 制作火焰喷射过程中飞舞的火星)的基础上继续…

机器学习之特征工程

一、背景 什么是特征?在机器学习中,特征是一个现象的个别可测量的属性或特征。让我们观察一束阳光,直接看的话,它是白光,但是我们使用三菱镜,它就是七种颜色的光。所以,选取的事物的特征不同,我…

能赚钱的GPT Store正式上线!如何将自己的 GPT 放到商店中?

等了两个月,OpenAI 的 GPT Store 今日凌晨终于上线!上线 GPT Store 的同时,OpenAI 同步了最新的 GPTs 数据:截止到1月11日,用户已创建300万的GPTs! GPTs 开发者可以通过 GPTs 来获利。OpenAI 将在今年第一季…

PLECS如何下载第三方库并导入MOSFET 的xml文件,xml库路径添加方法及相关问题

1. 首先xml库的下载,PLECS提供了一个跳转的链接。 https://www.plexim.com/download/thermal_models 2. 下载一个库(以最后一个Wolfspeed为例,属于CREE的SiC MOSFET) 下载这个就行,都包含了。不信自己可以试试再下载…

java物品检验管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web 物品检验管理系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysq…

C++里main函数int main(int argc, char **argv)

C里main函数int main(int argc, char **argv), 这两个参数argc和argv分别是什么

免费申请eu.org域名,开启个人网站之旅

介绍 eu.org的免费域名注册服务是由OpenTLD B.V.提供的。相比于其他免费域名注册服务,eu.org的域名后缀更加独特。同时,eu.org的域名注册也比较简单,只需要填写一些基本信息,就可以获得自己的免费域名。 注册账号 点击进入登…

C#中的Abp项目发布后,将exe设置为开机自动启动

一.跳过登陆界面 1.win R,输入“regedit”进入注册表,点开“HKEY_LOCAL_MACHINE” 2.SOFTWARE–>Policies–>Microsoft–>Windows–>新建–>项–>Personalization,新建–>DWORD(32位),名字定位“NoLockScreen”,值设为…

【JaveWeb教程】(20) MySQL数据库开发之 基本查询、条件查询、聚合函数、分组查询、排序查询、分页查询 详细代码示例讲解

目录 1. 数据库操作-DQL1.1 介绍1.2 语法1.3 基本查询1.4 条件查询1.5 聚合函数1.6 分组查询1.7 排序查询1.8 分页查询1.9 案例1.9.1 案例一1.9.2 案例二 在上次学习的内容中,我们讲解了: 使用DDL语句来操作数据库以及表结构(数据库设计&…

java通过HttpClient方式实现https请求的工具类(绕过证书验证)

目录 一、引入依赖包二、HttpClient方式实现的https请求工具类三、测试类 一、引入依赖包 引入相关依赖包 <!--lombok用于简化实体类开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><option…

生骨肉冻干推荐测评|希喂、VE、百利、PR等多款热门生骨肉冻干测评

随着养猫的观念逐渐科学化&#xff0c;越来越多的铲屎官开始关注猫咪主食的健康和营养问题。 冻干因其模拟猫咪原始捕猎猎物模型配比、低温加工的特点&#xff0c;被认为是最符合猫咪饮食天性的选择。 相比传统的膨化猫粮&#xff0c;生骨肉冻干中的淀粉和碳水化合物添加较少…

Electron中调用dll

截止目前Electron的官方稳定版本已经更新到了28.1.1。我在创建Electron项目时用的28.0.0版本&#xff0c;后面在项目中有用到调用dll方法的需求&#xff0c;大致的实现就是将后端给的dll文件引入到项目中&#xff0c;安装ffi-napi依赖&#xff0c;然后进行使用。但是在Electron…

行为型模式 | 观察者模式

一、观察者模式 1、原理 观察者模式又叫做发布-订阅&#xff08;Publish/Subscribe&#xff09;模式&#xff0c;定义了一种一对多的依赖关系。让多个观察者对象同时监听某一个主题对象&#xff0c;这个主题对象在状态上发生变化时&#xff0c;会通知所有观察者对象&#xff0…

idea 设置文件头

idea 设置创建文件时自动添加文档注释信息 /** * Description * Author jimaomao * DATE ${DATE} ${TIME} */

【【ZYNQ基础模块串口的意义】】

ZYNQ基础模块串口的意义 ZYNQ的配置介绍 如此纯粹的引脚显示 DDR 用来接DDR FIXED_IO 主要用来调试 现在一步一步配置出PS与PL端想沟通的zynq核 第一步给PL端添加一个时钟 因为 PS 与 PL端的时钟晶振不一样 我们可以通过一个PLL 来帮助我们生成想要实现的PL端时钟 第二步…

ROS2——Parameters

节点可以使用参数来配置各项操作&#xff0c;这些参数可以说布尔值、整数、字符串等类型。节点在启动时会读取参数。我们将参数单独列出来&#xff0c;而不是写在源文件中&#xff0c;这样做可以方便我们调试&#xff0c;因为在不同的机器人、环境中&#xff0c;我们需要的参数…

应用案例 | 基于三维机器视觉的焊接件上料解决方案

在制造业中&#xff0c;还有许多传统的焊接自动化设备主要是通过人工来进行上料。 传统的上料过程中&#xff0c;主要是通过人工来进行的。上料过程中会收到人为因素的影响&#xff0c;如操作人员的技能水平、工作态度等&#xff0c;导致上料不准确&#xff0c;不稳定&#xff…

面试宝典之JVM优化

J01、类加载的几个过程&#xff1f; 加载、验证、准备、解析、初始化。然后是使用和卸载了 J02、Minor GC 与 Full GC 分别在什么时候发生&#xff1f; 新生代内存不够用时候发生 MGC 也叫 YGC&#xff0c;JVM 内存不够的时候发生 FGC J03、java 中垃圾收集的方法有哪些? …

计算机速成课Crash Course - 18. 操作系统

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 17. 集成电路&摩尔定律 18. 操作系统 1940,1950 年代的电脑&#…