bcaktrader策略编写1

1 Backtrader策略类编写说明

在上一篇,我大体记录了整个backtrader整体最简流程,策略类中没有实现任何买卖逻辑,只是单纯的打印了每日的收盘价。今天,我将详细介绍策略编写类的构建过程,并构建一个简单的均线策略。
策略逻辑如下:

  • 收盘价高于平均价的时候,以市价买入
  • 持有仓位的时候,如果收盘价低于平均价,卖出
  • 只有一个待执行的订单

以下是上一篇文章的代码,我们在此基础上增加新的内容。

# 1. 创建策略继承bt.Strategy 
class TestStrategy(bt.Strategy): 

    def log(self, txt, dt=None): 
        # 记录策略的执行日志  
        dt = dt or self.datas[0].datetime.date(0) 
        print('%s, %s' % (dt.isoformat(), txt)) 

    def __init__(self): 
        # 保存收盘价的引用  
        self.dataclose = self.datas[0].close 

    def next(self): 
        # 记录收盘价  
        self.log('Close, %.2f' % self.dataclose[0]) 

策略类函数解释:

  1. log函数:用于在策略类中打印日志,日志直接带日期
  2. __init__函数:该函数用于初始化一些我们需要的全局变量
  3. next:这个函数是策略类最核心的函数,所有的策略逻辑都将在这个函数中实现。

在next中增加买入卖出逻辑

  • 买入逻辑:股价三连跌
  • 卖出逻辑:股价三连涨
def next(self):
        # 记录收盘价  
        self.log('Close, %.2f' % self.dataclose[0]) 

        # 今天的收盘价 < 昨天收盘价  
        if self.dataclose[0] < self.dataclose[-1]: 
            # 昨天收盘价 < 前天的收盘价  
            if self.dataclose[-1] < self.dataclose[-2]:
                # 买入  
                self.log('买入, %.2f' % self.dataclose[0])
                self.buy()
                
        # 今天的收盘价 > 昨天收盘价  
        if self.dataclose[0] > self.dataclose[-1]: 
            # 昨天收盘价 < 前天的收盘价  
            if self.dataclose[-1] > self.dataclose[-2]:
                # 买入  
                self.log('卖出, %.2f' % self.dataclose[0])
                self.sell() 

将该next函数替换为上一个教程中的next即可。

为了可以看到策略运行结束后的交易情况,我们可以在最后增加一行代码,实现绘图。

cerebro.plot(style='bar')

完整的程序如下

import datetime
import os.path
import sys
# 0. 导入backtrader框架  
import backtrader as bt 

class TestStrategy(bt.Strategy): 
    def log(self, txt, dt=None): 
        # 记录策略的执行日志  
        dt = dt or self.datas[0].datetime.date(0) 
        print('%s, %s' % (dt.isoformat(), txt))

    def __init__(self): 
        # 保存收盘价的引用  
        self.dataclose = self.datas[0].close

    def next(self):
        # 记录收盘价  
        self.log('Close, %.2f' % self.dataclose[0]) 

        # 今天的收盘价 < 昨天收盘价  
        if self.dataclose[0] < self.dataclose[-1]: 
            # 昨天收盘价 < 前天的收盘价  
            if self.dataclose[-1] < self.dataclose[-2]:
                # 买入  
                self.log('买入, %.2f' % self.dataclose[0])
                self.buy()
                
        # 今天的收盘价 > 昨天收盘价  
        if self.dataclose[0] > self.dataclose[-1]: 
            # 昨天收盘价 < 前天的收盘价  
            if self.dataclose[-1] > self.dataclose[-2]:
                # 买入  
                self.log('卖出, %.2f' % self.dataclose[0])
                self.sell()
        
# 2. 创建Cerebro引擎  
cerebro = bt.Cerebro()  # Cerebro引擎在后台创建broker(经纪人),系统默认资金量为10000 

# 3. 为Cerebro引擎添加策略  
cerebro.addstrategy(TestStrategy) 

# 4. 创建交易数据集  
data = bt.feeds.GenericCSVData(
    dataname='159605.SZ.csv',
    dtformat='%Y%m%d',  # 日期时间格式
    datetime=0,      # 日期时间所在列,假设为第一列
    open=2,          # 开盘价所在列,假设为第三列
    high=3,          # 最高价所在列,假设为第四列
    low=4,           # 最低价所在列,假设为第五列
    close=5,         # 收盘价所在列,假设为第六列
    volume=6,        # 成交量所在列,假设为第七列
    openinterest=-1,  # 无未平仓量列
    fromdate=datetime.datetime(2022, 1, 19),  # 起始日期
    todate=datetime.datetime(2024, 4, 19)     # 结束日期
)

# 5. 为Cerebro引擎添加数据
cerebro.adddata(data)  

# 运行cerebro引擎  
print('组合期初资金: %.2f' % cerebro.broker.getvalue()) 
cerebro.run() 
# 引擎运行后打期末资金  
print('组合期末资金: %.2f' % cerebro.broker.getvalue())

cerebro.plot(style='bar')

该策略执行后的结果


期初期末资金基本上不赚不赔,说明这个简单的策略没啥用。不过在backtrader中编写策略的方式了解了一些,后续可以慢慢修改。

结语

这次虽然在策略类的next中简单编写了一个买卖逻辑,但是next中还有很多其他函数,对于实现一些基础的逻辑至关重要,我们后续再讨论。

除此之外

除此之外,以下百度云链接是我整理的backtrader学习资料,对于入门backtrader非常有效。包含了扫地僧backtrader系列一的完整pdf和课程视频,有兴趣的可以看下,其包含了完整的backtrade学习内容,需要一杯咖啡钱。
在这里插入图片描述

请使用支付宝扫码
在这里插入图片描述

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

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

相关文章

林业调查具体是做些什么?

林业调查是对森林资源进行系统的信息收集和处理的过程。 林业调查涵盖了对林木、林地以及林区内生长的动植物及其环境条件的全面评估&#xff0c;旨在及时掌握森林资源的数量、质量和生长消亡的动态规律。这种调查不仅关注森林本身&#xff0c;还包括与之相关的自然环境和经济…

分销与传销的界限

分销与传销&#xff0c;作为商业活动中的两种销售模式&#xff0c;确实在核心特征和法律地位上存在显著的区别。以下是关于两者的详细分析&#xff0c;以及为什么选择微信分销小程序时&#xff0c;通常建议找外包公司的理由。 一、分销与传销的区别 商业模式&#xff1a; 分销…

【String 类 常用方法详解和归类】全网最细总结

目录 一、 String 介绍二、String 类中查找字符串的方法2.1 常用查找在这里插入图片描述2.2、其他查找 三、转换功能3.1 常用转换方法3.2、其他转换方法 四、判断、比较相关方法4.1、常用判断、比较方法4.2、其他判断、比较方法 五、拆分,截取,替换方法5.1、常用拆分,截取,替换…

linux---生产者和消费者模型

生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯&#xff0c;而通过阻塞队列来进行通讯&#xff0c;所以生产者生产完数据之后不用等待消费者处理&#xff0c;直接扔给阻塞队列&#xff0c;消费者不找生产者要数据&#…

[数据集][目标检测]吉他检测数据集VOC+YOLO格式66张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;66 标注数量(xml文件个数)&#xff1a;66 标注数量(txt文件个数)&#xff1a;66 标注类别数…

面试二十七、 CAS和Atomic

CAS锁机制&#xff08;无锁、自旋锁、乐观锁、轻量级锁&#xff09;-CSDN博客 1. ABA问题 在C中&#xff0c;可以使用std::atomic和版本号来解决ABA问题。C标准库没有直接提供类似Java的AtomicStampedReference&#xff0c;但可以通过将版本号和指针组合在一起实现类似的效果。…

win系统游戏提示找不到d3dx9_37.dll丢失的解决方法-最简单的解决方法

d3dx9_37.dll 是一个动态链接库文件&#xff0c;属于 Microsoft DirectX 9 的一部分。DirectX 9 是一个用于多媒体应用&#xff0c;特别是游戏和视频的 API&#xff0c;它提供了一套丰富的功能&#xff0c;用于处理图形、声音和输入设备等。d3dx9_37.dll 文件包含了 Direct3D 9…

巨细巨细的白痴级vulntarget-a靶场wp再不会你打死我

ad一&#xff0c;靶场搭建 下载靶场&#xff1a;GitHub - crow821/vulntarget: vulntarget靶场系列 官方拓补图 ps&#xff1a;此处 攻击机ip192.168.87.134&#xff0c;win7ip1为192.168.87.144 下载完毕后直接装入虚拟机不要进去&#xff0c;不要进去&#xff0c;不要进去…

使用LLaMA-Factory微调大模型

使用LLaMA-Factory微调大模型 github 地址 https://github.com/hiyouga/LLaMA-Factory 搭建环境 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory在 LLaMA-Factory 路径下 创建虚拟环境 conda create -p ./venv python3.10激活环境 c…

RabbiMQ怎么保证可靠性

RabbiMQ怎么保证可靠性 前言生产端问题解决方案代码验证 RabbitMQ问题消费端问题解决方案代码验证 总结 前言 RabbitMQ相信大家都非常熟悉了&#xff0c;今天咱们来聊聊怎么保证RabbitMQ的可靠性。 那什么时候会出现问题呢&#xff1f; 第一种是生产端出现的问题。我们向队列…

CTFHUB-信息泄露-目录遍历和PHPINFO

目录 目录遍历 PHPINFO 目录遍历 很简单&#xff0c;挨着把每个目录都点开看一下 发现2目录下有个 flag.txt 文件&#xff0c;点开发现了本关的flag PHPINFO 这关也很简单&#xff0c;进来之后是一个phpinfo页面&#xff0c;按 CTRL F键打开查询&#xff0c;输入flag&#…

成功解决“ypeError: An Integer Is Required”错误的全面指南

成功解决“ypeError: An Integer Is Required”错误的全面指南 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x…

【科研基础】证明积累

1-Bayesian Estimation (P317) Suppose that x = θ + ν w h e r e ν i s a n N ( 0 , σ ) random variable and θ is the value of a n N ( θ 0 , σ 0 ) random variable θ (Fig. 8-7). Find the bayesian estimate θ o f θ . \begin{align…

神经网络与深度学习——第6章 循环神经网络

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第6章 循环神经网络 给网络增加记忆能力 延时神经网络 有外部输入的非线性自回归模型 循环神经网络 简单循环网络 循环神经网络的计算能力 循环神经网络的通用近似定理 图灵完备 应用到机器学习 序列到类…

用贪心算法计算十进制数转二进制数(小数部分)

在上一篇博文用贪心算法计算十进制数转二进制数&#xff08;整数部分&#xff09;-CSDN博客中&#xff0c;小编介绍了用贪心算法进行十进制整数转化为二进制数的操作步骤&#xff0c;那么有朋友问我&#xff0c;那十进制小数转二进制&#xff0c;可以用贪心算法来计算吗&#x…

支付系统对接商户

target&#xff1a;离开柬埔寨倒计时-214day 还是美女作为开篇 前言 昨天没有写文章&#xff0c;因为部门团建&#xff0c;我得去给他们画饼&#xff0c;说起来也真的是唏嘘&#xff0c;我一个已经都在计划着离开柬埔寨的人&#xff0c;昨天聚餐还一个个给他们描述未来的前景&a…

5G无线标准演进综述及新技术引入

摘 要 随着经济和社会的发展&#xff0c;5G业务越来越丰富多彩&#xff0c;1080P高清视频、裸眼3D、网联汽车、云手机等新业务、新终端对网络的要求也越来越高&#xff1b;另一方面&#xff0c;5G标准持续演进&#xff0c;在MIMO、载波聚合、移动性管理、uRLLC、切片、定位等方…

海思SD3403,SS928/926,hi3519dv500,hi3516dv500移植yolov7,yolov8(19)-Yolov10探索

YOLOv10 开源有几天了,看性能是比较强的,但是试过的一些人说没有YOLOv8好,实际效果以测试结果为准,这里创新点算是去掉了之前YOLO的NMS步骤,论文题目也说了NMS-Free,以此来提高小目标检测率,减少计算冗余,也没有NMS的计算时间提高实时性。 这个倒是让我看到了以后可以…

以sqlilabs靶场为例,讲解SQL注入攻击原理【18-24关】

【less-18】 打开时&#xff0c;获取了自己的IP地址。&#xff0c;通过分析源码知道&#xff0c;会将用户的user-agent作为参数记录到数据库中。 提交的是信息有user-Agent、IP、uname信息。 此时可以借助Burp Suite 工具&#xff0c;修改user_agent&#xff0c;实现sql注入。…

STM32之USART(串口)通信学习

1.通信接口 在开始通信之前&#xff0c;我们要了解什么是通信&#xff0c;通信就是将一个设备的数据传送到另一个设备。 同时按照双方规定的协议即通信协议&#xff0c;指定通信规则通信双方按照规则进行数据的收发。 应用场景&#xff1a;单片机的串口可以使单片机与单片机…