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.hqwc.cn/news/341008.html

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

相关文章

关于报错 curl: (56) Recv failure: Connection reset by peer

curl ip没问题 curl localhost 则报错 curl: (56) Recv failure: Connection reset by peer 出现这个报错有很多原因, 其中之一就是terminal代理 而关闭代理应用之后, 其实由于配置的终端都是 export指定的代理 所以导致还是一直报错. 通过 curl -v 可以发现 指向了代理ip和…

【HarmonyOS4.0】第八篇-ArkUI系统组件(三)

【HarmonyOS4.0】第七篇-ArkUI系统组件(三) 七、二维码组件 二维码的使用场景,比如扫码添加好友,扫码骑车,扫码支付等等,ArkUI开发框架提供了 RQCode 组件生成一个二维码。 接口: QRCode(value: string)参数: 参数…

一起来了解综合能源服务认证

首先,综合能源服务认证是有国家政策支持的, 《能源生产和消费革命战略(2016-2030)》中指出:1、能源生产端要以绿色低碳为方向,推动能源集中式和分布式开发并举,大幅提高新能源和可再生能源比重&#xff1b…

【昕宝爸爸小模块】ConcurrentHashMap为什么不允许null值

ConcurrentHashMap为什么不允许null值 一、✅典型解析二、✅要实现一个HashMap怎么做2.1 ✅需要考虑以下几个方面2.2 ✅基于数组和链表的HashMap实现Demo2.3 ✅扩容后如何解决链表长度过长的问题 三、✅拓展知识仓3.1 ✅在多线程环境下如何保证数据的正确性和性能3.2 ✅那如何在…

第3章:python的判断语句

学一门语言,无外乎多敲,多用,记得回顾昨天写过的代码呀 布尔类型和比较运算符 布尔类型的定义 使用比较运算符进行比较运算得到布尔类型的结果 比较运算符 """ 演示布尔类型的定义 以及比较运算符的应用 ​ """…

功能消费迈向精智生活,绿联如何撬动3C数码新增量?

根据行业生命周期理论,当前国产移动数码周边市场俨然已迈入成熟期,相关企业也完成一轮腾飞,正在为新的发展蓄能。 其中,绿联的发展历程可以说是行业进化升级的缩影。产品层面,已完成从“数据线厂商”到专业数码科技公…

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…

Python的安装与卸载【Windows系统】

在 Windows 上安装与卸载 Python Python的安装 下载Python 安装Python 下载完后打开安装包 注意最底下的"Add Python 3.8 to Path"(将Python加入环境变量)一定要勾选!!!这样就可以免去之后环境配置的烦恼…

用win系统搭建Minecraft世界服务器,MC开服教程,小白开服教程

雨云VPS用Windows系统搭建我的世界世界服务器,Minecraft开服教程,小白开服教程,MC 1.19.4版本服务器搭建教程。 此教程使用 Mohist 1.19.4 服务端,此服务端支持Forge模组和Bukkit/Spigot/Paper插件,如果需要开其他服务…

有经常要寄快递的友友吗?那到底有没有更便利的寄快递的方法?

有经常要寄快递的友友吗?那到底有没有更便利的寄快递的方法? 我们大家都知道快递行业的发展是非常迅猛的,这是人们的需求所促生出来的一个行业。现在的快递公司也非常的多,每个快递公司都是有很多的快递员的,在我们需要寄快递的…

北斗卫星助力智慧公园实现智能化管理

北斗卫星助力智慧公园实现智能化管理 智慧公园是以信息技术为核心,以人工智能为驱动,运用物联网技术对公园进行智能化管理和服务的创新模式。而北斗卫星系统的应用,为智慧公园提供了更强大的支持和保障。下面我们来详细了解一下北斗卫星在智…

HTML--基本结构构成

基本结构&#xff1a; 文档声明: <!DOCTYPE html> htm标签对 :<html> </html> head标签对&#xff1a; <head> </head> body标签对&#xff1a;<body> </body> 如下结构&#xff1a; <html> <head> <title>这是一…