Backtrader 文档学习-Cheat-On-Open

Backtrader 文档学习-Cheat-On-Open

1.概述

V1.9.44.116增加了Cheat On Open的支持。对于全押的人来说,这似乎是一个必需的功能,用bar的收盘价后进行计算,希望与开盘价相匹配。
当开盘价差距(上涨或下跌,取决于买入或卖出是否有效)以及现金不足,进行全仓操作时,这种情况下就会失败。迫使broker 退回操作。
尽管人们可以尝试用积极正向的指数方法来预测未来,需要预先加载数据,而数据并不总是可用的。

使用模式:

cerebro = bt.Cerebro(cheat_on_open=True)

  • 在系统中激活一个额外的循环,该循环调用策略中的方法next_open、nextstart_open和prenext_open。
    需要增加一组新的定价方法,明确区分常规定价方法和cheat定价方法,常规定价方法是在被检查价格不再可用且未来不可知的情况下运作的。
    这也避免了对常规next方法进行2次调用。
    当在xxx_open方法内部时,以下内容是正确的:
  • 指标尚未重新计算,并保留了在等效的xxx常规方法中上次循环中得到的值。
  • broker尚未评估新循环的挂单,可以引入新订单,如果可能将对其进行评估。
    请注意:
  • Cerebro还有一个broker_coo(默认值:True)参数,告诉cerebro如果激活了作弊模式,则在可能的情况下也应尝试在broker中激活它。
    模拟broker有一个名为:coo的参数和一个名为set_coo的方法。

2.尝试开盘作弊

(1)核心代码
    # 买入卖出点操作
    def operate(self, fromopen):
        # 如有挂起的订单,返回,无操作
        if self.order is not None:
            return
        
        # 如有仓位
        if self.position:
            # 信号点小于0 ,平仓
            if self.signal < 0:
                self.order = self.close()
        
        # 信号点大于0
        elif self.signal > 0:
            print('{} Send Buy, fromopen {}, close {}'.format(
                self.data.datetime.date(),
                fromopen, self.data.close[0])
            )
            # 买入
            self.order = self.buy()

    # 正常交易 cheat-on-open = False
    def next(self):
        print('{} next, open {} close {}'.format(
            self.data.datetime.date(),
            self.data.open[0], self.data.close[0])
        )

        if self.cheating:
            return
        self.operate(fromopen=False)

    # 作弊交易 cheat-on-open = True
    def next_open(self):
        if not self.cheating:
            return
        self.operate(fromopen=True)

(2)cheat_on_open=False

常规执行:

python ./cheat-on-open.py --cerebro cheat_on_open=False
2005-02-14 next, open 3079.93 close 3075.76
2005-02-15 next, open 3075.2 close 3086.95
2005-02-16 next, open 3087.3 close 3068.55
2005-02-17 next, open 3068.79 close 3067.34
2005-02-18 next, open 3067.26 close 3072.04
2005-02-21 next, open 3072.31 close 3063.64
2005-02-22 next, open 3062.99 close 3045.24
2005-02-23 next, open 3042.65 close 3028.08
2005-02-24 next, open 3030.17 close 3024.8
2005-02-25 next, open 3029.07 close 3062.72
2005-02-28 next, open 3063.85 close 3058.35
2005-03-01 next, open 3056.45 close 3078.44
2005-03-02 next, open 3078.89 close 3082.71
2005-03-03 next, open 3080.71 close 3078.11
2005-03-04 next, open 3079.93 close 3106.86
2005-03-07 next, open 3106.98 close 3114.54
2005-03-08 next, open 3113.82 close 3097.34
2005-03-09 next, open 3098.91 close 3081.99
2005-03-10 next, open 3079.01 close 3053.62
2005-03-11 next, open 3058.37 close 3060.36
2005-03-14 next, open 3060.06 close 3060.72
2005-03-15 next, open 3062.77 close 3083.73
2005-03-16 next, open 3083.33 close 3032.13
2005-03-17 next, open 3032.84 close 3039.8
2005-03-18 next, open 3040.38 close 3053.54
2005-03-21 next, open 3052.39 close 3038.14
2005-03-22 next, open 3040.55 close 3050.44
2005-03-23 next, open 3040.66 close 3036.85
2005-03-24 next, open 3039.55 close 3060.67
2005-03-29 next, open 3060.02 close 3068.49
2005-03-30 next, open 3067.3 close 3056.21
2005-03-31 next, open 3059.1 close 3055.73
2005-04-01 next, open 3055.18 close 3061.11
2005-04-04 next, open 3060.0 close 3042.17
2005-04-05 next, open 3046.56 close 3064.07
2005-04-06 next, open 3066.05 close 3076.23
2005-04-07 next, open 3073.4 close 3090.72
2005-04-08 next, open 3092.07 close 3088.92
2005-04-08 Send Buy, fromopen False, close 3088.92
2005-04-11 Buy Executed at price 3088.47
2005-04-11 next, open 3088.47 close 3080.6

订单:

  • 在2005-04-08收盘后,以3088.92收盘价发布订单
  • 在2005-04-11以3088.47的开盘价执行订单
    看一下当时数据:

2005-04-07,3073.40,3092.99,3070.02,3090.72,0,0
2005-04-08,3092.07,3100.72,3083.87,3088.92,0,0
2005-04-11,3088.47,3088.47,3073.75,3080.60,0,0

图示:
在这里插入图片描述

(3)cheat_on_open=True

作弊执行:

python ./cheat-on-open.py --cerebro cheat_on_open=True
2005-02-14 next, open 3079.93 close 3075.76
2005-02-15 next, open 3075.2 close 3086.95
2005-02-16 next, open 3087.3 close 3068.55
2005-02-17 next, open 3068.79 close 3067.34
2005-02-18 next, open 3067.26 close 3072.04
2005-02-21 next, open 3072.31 close 3063.64
2005-02-22 next, open 3062.99 close 3045.24
2005-02-23 next, open 3042.65 close 3028.08
2005-02-24 next, open 3030.17 close 3024.8
2005-02-25 next, open 3029.07 close 3062.72
2005-02-28 next, open 3063.85 close 3058.35
2005-03-01 next, open 3056.45 close 3078.44
2005-03-02 next, open 3078.89 close 3082.71
2005-03-03 next, open 3080.71 close 3078.11
2005-03-04 next, open 3079.93 close 3106.86
2005-03-07 next, open 3106.98 close 3114.54
2005-03-08 next, open 3113.82 close 3097.34
2005-03-09 next, open 3098.91 close 3081.99
2005-03-10 next, open 3079.01 close 3053.62
2005-03-11 next, open 3058.37 close 3060.36
2005-03-14 next, open 3060.06 close 3060.72
2005-03-15 next, open 3062.77 close 3083.73
2005-03-16 next, open 3083.33 close 3032.13
2005-03-17 next, open 3032.84 close 3039.8
2005-03-18 next, open 3040.38 close 3053.54
2005-03-21 next, open 3052.39 close 3038.14
2005-03-22 next, open 3040.55 close 3050.44
2005-03-23 next, open 3040.66 close 3036.85
2005-03-24 next, open 3039.55 close 3060.67
2005-03-29 next, open 3060.02 close 3068.49
2005-03-30 next, open 3067.3 close 3056.21
2005-03-31 next, open 3059.1 close 3055.73
2005-04-01 next, open 3055.18 close 3061.11
2005-04-04 next, open 3060.0 close 3042.17
2005-04-05 next, open 3046.56 close 3064.07
2005-04-06 next, open 3066.05 close 3076.23
2005-04-07 next, open 3073.4 close 3090.72
2005-04-08 next, open 3092.07 close 3088.92
2005-04-11 Send Buy, fromopen True, close 3080.6
2005-04-11 Buy Executed at price 3088.47
2005-04-11 next, open 3088.47 close 3080.6

对比当时数据:

2005-04-07,3073.40,3092.99,3070.02,3090.72,0,0
2005-04-08,3092.07,3100.72,3083.87,3088.92,0,0
2005-04-11,3088.47,3088.47,3073.75,3080.60,0,0

  • 在2005-04-11开盘前发布
  • 在2005-04-11以3088.47的开盘价执行

注意区别:

  • 4月8日未触发订单
  • 4月11日触发订单,当天成交订单。
  • 对于交易结果是一样的。

图示:
在这里插入图片描述
结论:
开盘欺骗允许在开盘前发布订单,允许对全仓场景的所有投注进行精确计算。

4. 源码

#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-
###############################################################################
#
# Copyright (C) 2015-2023 Daniel Rodriguez
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import argparse
import datetime

import backtrader as bt


class St(bt.Strategy):
    params = dict(
        periods=[10, 30],
        matype=bt.ind.SMA,
    )

    def __init__(self):
        self.cheating = self.cerebro.p.cheat_on_open
        mas = [self.p.matype(period=x) for x in self.p.periods]
        self.signal = bt.ind.CrossOver(*mas)
        self.order = None

    def notify_order(self, order):
        if order.status != order.Completed:
            return

        self.order = None
        print('{} {} Executed at price {}'.format(
            bt.num2date(order.executed.dt).date(),
            'Buy' * order.isbuy() or 'Sell', order.executed.price)
        )

    def operate(self, fromopen):
        if self.order is not None:
            return
        if self.position:
            if self.signal < 0:
                self.order = self.close()
        elif self.signal > 0:
            print('{} Send Buy, fromopen {}, close {}'.format(
                self.data.datetime.date(),
                fromopen, self.data.close[0])
            )
            self.order = self.buy()

    def next(self):
        print('{} next, open {} close {}'.format(
            self.data.datetime.date(),
            self.data.open[0], self.data.close[0])
        )

        if self.cheating:
            return
        self.operate(fromopen=False)

    def next_open(self):
        if not self.cheating:
            return
        self.operate(fromopen=True)


def runstrat(args=None):
    args = parse_args(args)

    cerebro = bt.Cerebro()

    # Data feed kwargs
    kwargs = dict()

    # Parse from/to-date
    dtfmt, tmfmt = '%Y-%m-%d', 'T%H:%M:%S'
    for a, d in ((getattr(args, x), x) for x in ['fromdate', 'todate']):
        if a:
            strpfmt = dtfmt + tmfmt * ('T' in a)
            kwargs[d] = datetime.datetime.strptime(a, strpfmt)

    # Data feed
    data0 = bt.feeds.BacktraderCSVData(dataname=args.data0, **kwargs)
    cerebro.adddata(data0)

    # Broker
    cerebro.broker = bt.brokers.BackBroker(**eval('dict(' + args.broker + ')'))

    # Sizer
    cerebro.addsizer(bt.sizers.FixedSize, **eval('dict(' + args.sizer + ')'))

    # Strategy
    cerebro.addstrategy(St, **eval('dict(' + args.strat + ')'))

    # Execute
    cerebro.run(**eval('dict(' + args.cerebro + ')'))

    if args.plot:  # Plot if requested to
        cerebro.plot(**eval('dict(' + args.plot + ')'))


def parse_args(pargs=None):
    parser = argparse.ArgumentParser(
        formatter_class=argparse.ArgumentDefaultsHelpFormatter,
        description=(
            'Cheat-On-Open Sample'
        )
    )

    parser.add_argument('--data0', default='./datas/2005-2006-day-001.txt',
                        required=False, help='Data to read in')

    # Defaults for dates
    parser.add_argument('--fromdate', required=False, default='',
                        help='Date[time] in YYYY-MM-DD[THH:MM:SS] format')

    parser.add_argument('--todate', required=False, default='',
                        help='Date[time] in YYYY-MM-DD[THH:MM:SS] format')

    parser.add_argument('--cerebro', required=False, default='',
                        metavar='kwargs', help='kwargs in key=value format')

    parser.add_argument('--broker', required=False, default='',
                        metavar='kwargs', help='kwargs in key=value format')

    parser.add_argument('--sizer', required=False, default='',
                        metavar='kwargs', help='kwargs in key=value format')

    parser.add_argument('--strat', required=False, default='',
                        metavar='kwargs', help='kwargs in key=value format')

    parser.add_argument('--plot', required=False, default='',
                        nargs='?', const='{}',
                        metavar='kwargs', help='kwargs in key=value format')

    return parser.parse_args(pargs)


if __name__ == '__main__':
    runstrat()

5.Help

python ./cheat-on-open.py --help
usage: cheat-on-open.py [-h] [--data0 DATA0] [--fromdate FROMDATE]
                        [--todate TODATE] [--cerebro kwargs] [--broker kwargs]
                        [--sizer kwargs] [--strat kwargs] [--plot [kwargs]]

Cheat-On-Open Sample

optional arguments:
  -h, --help           show this help message and exit
  --data0 DATA0        Data to read in (default:
                       ./datas/2005-2006-day-001.txt)
  --fromdate FROMDATE  Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: )
  --todate TODATE      Date[time] in YYYY-MM-DD[THH:MM:SS] format (default: )
  --cerebro kwargs     kwargs in key=value format (default: )
  --broker kwargs      kwargs in key=value format (default: )
  --sizer kwargs       kwargs in key=value format (default: )
  --strat kwargs       kwargs in key=value format (default: )
  --plot [kwargs]      kwargs in key=value format (default: )

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

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

相关文章

SpringClound项目相关

nacos本机模式非虚拟机启动也可正常连接 nacos中的配置中心相当于在application.yml中的相关配置&#xff0c;转移位置&#xff0c;内容同application.yml完全一样均可。 黑马项目导入后&#xff0c;依赖缺失&#xff1a; 首先尝试maven重新加载&#xff0c;控制台提示传递依…

聊一聊GPT、文心、通义、混元

我使用同一个Prompt提示词“请以记叙文的文体来写”&#xff0c;分别发送给GPT-3.5&#xff08;调用API&#xff09;、文心、通义、混元&#xff0c;下面是它们各自生成的文本内容&#xff0c;大家一看便知了。 GPT-3.5&#xff1a; 在我个人使用GPT模型的过程中&#xff0c;我…

ESP32-C3 vscode USB-Serial-JTAG 调试

硬件 接线 查看驱动 vs code配置 debugging via builtin USB-JTAG 配置调试UART 配置下载类型 创建调试配置 调试 参考 esp32c3内置USB-Serial-JTAG的使用 链接: link 看了之后&#xff0c;还是不会ESP32-C3的调试及下载&#xff0c;你过来打我&#xff01;&#xff01;&…

KAFKA高可用架构涉及常用功能整理

KAFKA高可用架构涉及常用功能整理 1. kafka的高可用系统架构和相关组件2. kafka的核心参数2.1 常规配置2.2 特殊优化配置 3. kafka常用命令3.1 常用基础命令3.1.1 创建topic3.1.2 获取集群的topic列表3.1.3 获取集群的topic详情3.1.4 删除集群的topic3.1.5 获取集群的消费组列表…

微信小程序之下拉刷新事件、上拉触底事件和案例

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

【方法】RAR分卷压缩文件如何打开?

当RAR压缩文件比较大&#xff0c;不利于传输时&#xff0c;我们可以把文件压缩成分卷文件&#xff0c;那压缩后的分卷文件如何打开呢&#xff1f;今天就来说说RAR分卷压缩文件的两种打开方法。 方法一&#xff1a; 和普通压缩包一样&#xff0c;打开分卷压缩包也需要用到解压…

Web3与个人隐私:打破数据壁垒的新时代

随着科技的不断发展&#xff0c;Web3技术的兴起为我们带来了一个全新的数字时代&#xff0c;重新定义了个人隐私的概念与实践。在这个时代&#xff0c;我们不再被动地成为数据经济的被动参与者&#xff0c;而是迎来了一个更加安全、透明和个人主导的网络生态。 1. 去中心化的数…

比FTP更好用的企业远程传输大文件工具居然是这个!

在数字化浪潮的推动下&#xff0c;企业对于数据传输的速度和安全性有了更高的要求。传统的FTP协议&#xff0c;尽管历史悠久&#xff0c;但在当前的企业应用场景中&#xff0c;其局限性逐渐暴露。企业现在寻求的是能够提供快速、安全、便捷且经济高效的文件传输解决方案。本文旨…

springboot整合mqtt实现消息订阅和推送

前言 mica-mqtt-client-spring-boot-starter是一个基于Spring Boot的MQTT客户端启动器&#xff0c;它集成了mica-mqtt客户端&#xff0c;提供了在Spring Boot应用程序中使用MQTT协议进行消息通信的能力。以下是关于mica-mqtt-client-spring-boot-starter的简介&#xff1a; 特…

【Prometheus】Prometheus的PromQL语句

Prometheus promQL的语法&#xff1a; #时间序列 node_cpu_guest_seconds_total{cpu"0"} 监控&#xff08;指标数据&#xff09; {标签} node使用CPU的描述的统计&#xff0c;符合标签CPU0的时间序列的查询结果 指标标签生成时间序列 标签&#xff1a; __address…

DeepSORT算法实现车辆和行人跟踪计数和是否道路违规检测(代码+教程)

DeepSORT算法是一种用于目标跟踪的算法&#xff0c;它可以对车辆和行人进行跟踪计数&#xff0c;并且可以检测是否存在道路违规行为。该算法采用深度学习技术来提取特征&#xff0c;并使用卡尔曼滤波器来估计物体的速度和位置。 DeepSORT算法通过首先使用目标检测算法来识别出…

基于Kubernetes的微服务架构,你学废了吗?

至于服务网关&#xff0c;虽然保留了 Zuul&#xff0c;但没有采用 Kubernetes 的 Ingress 来替代。这里有两个主要考虑因素&#xff1a;首先&#xff0c;Ingress Controller 并非 Kubernetes 的内置组件&#xff0c;有多种可选方案&#xff08;例如 KONG、Nginx、Haproxy 等&am…

目标检测算法训练数据准备——Penn-Fudan数据集预处理实例说明(附代码)

目录 0. 前言 1. Penn-Fudan数据集介绍 2. Penn-Fudan数据集预处理过程 3. 结果展示 4. 完整代码 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但是内容可能存在不准确的地方。如…

Springboot项目启动后浏览器不能直接访问接口,而postman可以访问?

在云服务器上部署springboot后端时&#xff0c;项目启动后浏览器不能直接访问接口,而postman可以访问。这是当时困扰了我大半天的小问题&#xff0c;在我打开防火墙和阿里云安全组之后还是没解决。然后在网上搜了很多很多资料&#xff0c;以为是浏览器访问权限或者是https什么证…

微信公众号数量达到上限怎么办

一般可以申请多少个公众号&#xff1f;许多用户在申请公众号时可能会遇到“公众号显示主体已达上限”的问题。这是因为在2018年11月16日对公众号申请数量进行了调整&#xff0c;具体调整如下&#xff1a;1、个人主体申请公众号数量上限从2个调整为1个。2、企业主体申请公众号数…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”&#xff0c;这就是ABC输入法&#xff0c;点击上面的Delete按钮&#xff0c;删除整项ABC内容&#xff0c…

【计算机毕业设计】128电脑配件销售系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

public class和class的区别

不用public修饰的类 一个Java源文件中可以定义多个不用public修饰的class&#xff0c;且类名不用和java源文件名一致。public修饰的类可以没有。编译之后&#xff0c;一个class就会对应生成一个class字节码文件 对于用public修饰的类 如果一个类用了public修饰&#xff0c;那…

搞懂Nginx的.conf文件路径配置

详解server中各部分作用及如何配置 如下图所示&#xff0c;这是我配置好的一个server代码块&#xff0c;我这里配置了https&#xff0c;所以会比默认的多一部分内容&#xff0c;如果你只需要配置http&#xff0c;则只需关注红色方框的部分即可&#xff0c;下面会按顺序讲解。 ①…