Backtrader 文档学习-Strategy with Signals

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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

非常好用的个人工作学习记事本Obsidian

现在记事本有两大流派:Obsidian 和Notion,同时据说logseq也很不错 由于在FreeBSD下后两种都没有相关ports,所以优先尝试使用Obsidian Obsidian简介 Obsidian是基于Markdown文件的本地知识管理软件,并且开发者承诺Obsidian对于个…

手机直连卫星及NTN简介

一、手机直连卫星的发展现状 近日,华为推出了支持北斗卫星短报文的Mate 50旗舰机、P60系列,苹果也跟Globalstar(全球星)合作推出了支持卫星求救的iPhone14,最亮眼的还是华为的。这几款产品揭开了卫星通信探索消费领域…

Aigtek高压放大器的工作原理和指标应用介绍

高压放大器是一种用于放大高压信号的电子设备,具有高压输出,低噪声,高精度,高稳定性,高可靠性,低功耗,低成本等的优点,所以才被广泛应用在磁场探测、电磁脉冲放大、电磁波放大、电磁…

omics简介

omics简介 公众号pythonic生物人写的系列文章介绍了组学的相关内容,本文仅做了一个简单的知识框架,供后面遇到对应问题,快速查阅。欢迎大家去关注原作者。 这篇文章也非常值得阅读:肿瘤NGS行业新人如何构建自己的知识体系-思考问题…

Win系统搭建Elasticsearch实现公网远程访问本地服务

文章目录 系统环境1. Windows 安装Elasticsearch2. 本地访问Elasticsearch3. Windows 安装 Cpolar4. 创建Elasticsearch公网访问地址5. 远程访问Elasticsearch6. 设置固定二级子域名 Elasticsearch是一个基于Lucene库的分布式搜索和分析引擎,它提供了一个分布式、多…

攒机需要考虑的问题

昨天需要为单位进行一些计算机的升级,既可以搭配出新电脑,也为原来的计算机进行一些升级,就是攒机一些配置。 记得2000年左右经常看这方面的文章,了解一些内容,后面单位应用基本上都是整机,也不需要攒机&am…

华为云优惠券怎么领取(华为云优惠券领取入口)

华为云作为全球领先的云计算服务提供商,为了更好地服务广大用户,经常推出各种优惠活动,其中最受用户欢迎的就是华为云优惠券。本文将详细介绍如何领取华为云优惠券,以及优惠券的使用规则,帮助大家更好地利用华为云的云…

Java高级工程师20道面试题、答案及案例

文章目录 Java高级工程师面试题、答案及案例: 问题: 在Java中,如何实现线程安全的单例模式?请写出双重检查锁定(Double-Checked Locking)的实现方式。 答案与案例: public class Singleton {pri…

k8s部署mongodb-sharded7.X集群(多副本集)

#mongodb-sharded 7.X版本CHART NAME: mongodb-sharded CHART VERSION: 7.0.5 APP VERSION: 7.0.2helm repo add bitnami https://charts.bitnami.com/bitnami helm pull bitnami/bitnami/mongodb-sharded --untar默认副本数较多。我修改为33 搜索关键字replicaCount 修改 最后…

安装PLSQL图文详细步骤

双击安装软件 更改默认安装路径 等待安装 双击登录程序 先登录sys 登录完成后,在弹窗中输入激活信息 点击【register】

干货抢先看:SOLIDWORKS阵列操作的技巧与要点

SOLIDWORKS软件中的阵列功能十分常用且强大。本文将介绍一些关于SOLIDWORKS阵列的技巧,以帮助您更加高效地应用该功能。 1.线性阵列方向识别度增强 想使用线性阵列打孔的时候,模型上没有可以选中的参考线作为阵列方向怎么办?使用圆柱面也可…

apt-mirror 制作kylin 内网源

一、修改apt软件安装源 1、修改source.list安装源 vi /etc/apt/sources.list 添加: deb http://archive.kylinos.cn/kylin/KYLIN-ALL 10.1 main universe multiverse restricted 2、更新软件源信息 sudo apt update 二、安装同步源工具“apt-mirror” apt-mirrot…

奇异值分解在图形压缩中的应用

奇异值分解在图形压缩中的应用 在研究奇异值分解的工程应用之前,我们得明白什么是奇异值?什么是奇异向量? 奇异值与奇异向量 概念:奇异值描述了矩阵在一组特定向量上的行为,奇异向量描述了其最大的作用方向。 奇异值…

【Redis】Redis分布式锁

引入 首先看下面这段代码: 这是一段抢券代码,看着没什么问题,但是当是多线程情况下,那么就可能出现并发问题,出现超卖。为了解决这个问题,我们可能会加锁,那么接下来看加锁后的代码&#xff…

推荐5款大佬都在用的开源项目!PDF处理、AI换脸、声音克隆等!

GitHub圈选 项目推荐: Stirling-PDF(PDF处理工具) Rope(AI换脸工具) clone-voice(声音克隆工具) N_m3u8DL-RE(流媒体下载器) toBeBetterJavaer(Java学习指…

自动化测试框架—数据驱动

什么是数据驱动? 数据驱动是主流的自动化测试设计模式,测试数据和测试代码分离,测试数据存储在外部文件中,如 excel、json、yaml等文件,也可以存在数据库中。同一个测试方法,可以多个自动化测试 case。 数…

【PDF密码】PDF文件为什么无法修改?为什么PDF文档不支持编辑?

pdf文件大家应该都经常接触,但是不知道大家会遇到这种情况:有些PDF文件打开之后无法编辑?是什么原因呢?今天我们来分析一下都是那些原因导致的。 首先我们可以考虑一下,PDF文件中的内容是否是图片,如果确认…

螺纹钢负公差轧制中的测径仪应用

1、负公差轧制意义 为了满足生产使用要求,并根据轧制水平,在产品标准冲规定钢材尺寸的波动范围,允许钢材的实际尺寸与公称尺之间有一定的偏差,这个偏差一般称公差,公差分正、负公差,钢材按负公差轧制时&…

untiy使用http下载资源

文章目录 提醒下载一个资源并保存到本地下载一张图片 提醒 部分API需要将Unity的 Edit/PrejectSetting/Player/OtherSetttings/AConfiguration/ApiCompatibilityLevel 设为.NetFramework 才可以使用 下载一个资源并保存到本地 private IEnumerator DownloadFormServer_IE(st…

python爬虫实战(7)--获取it某家热榜

1. 需要的类库 import requests from bs4 import BeautifulSoup import pandas as pd2. 请求榜单 def fetch_ranking_data():url "https://m.xxx.com/rankm/" #某家response requests.get(url)if response.status_code 200:return response.contentelse:print(f…