backtrader量化回测----基础使用1,附完整代码

今天我们体测完1000米感觉人都要废了,目前在学习天勤量化,但是我还是打算仔细将这个量化框架介绍完,我们开始下面介绍来自官网,因为有时候官网打不开,我将仔细介绍,我们开始。

需要程序关注微信公众号,数据分析与运用,回复backtrader量化回测基础使用1就可以

因为文章比较长,我们自己看效果,我结合了金融数据库akshare,所以可以回测A股全部的股票,我们只需要输入股票代码,开始时间,开始资金就可以了。

下面为全部买卖点输出,收益率还是不错的

下面为绘制分析图,非常的好

下面我们介绍重要的概念线,可以同时开9条线,0代表目前的数据,-1代表昨天数据,-2代表前天数据。让我们来看看一系列的例子(从几乎空的到一个成熟的策略),但在粗略解释使用反向交易者时的2个基本概念之前,并非没有

线数据馈送、指标和策略都有线条。线是连接在一起形成此线的一系列点。在谈论市场时,数据馈送通常每天有以下几组点:打开”系列沿时间是一条线。因此,数据馈送通常有6行。如果我们还考虑“DateTime”(这是单个点的实际参考),我们可以数出7行。开盘, 高, 低, 收盘, 成交量, OpenInterest索引 0 方法访问行中的值时,将使用 index: 0 访问当前值并且使用-1访问“最后一个”输出值。这符合Python对可迭代的约定(一行可以被迭代,因此是可迭代的),其中索引-1用于访问迭代/数组的“最后一个”项。在我们的例子中,是最后一个被访问的输出值。因此,在 -1 之后是索引 0,它用于按行访问当前时刻。下面为一个简单的程序,获取账户值。

import backtrader as btif __name__ == '__main__':    cerebro = bt.Cerebro()    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())    cerebro.run()    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

执行后输出的结果​​​​​​​

Starting Portfolio Value: 10000.00Final Portfolio Value: 10000.00

在此示例中:反向交易者被导入,Cerebro 引擎已实例化,生成的 cerebro 实例被告知运行(循环数据),结果被打印出来,虽然看起来不多,但让我们指出一些明确显示的内容:,Cerebro 引擎已在后台创建了一个代理实例,该实例已开始有一些现金,这种幕后经纪人实例化是平台中简化用户生活的一个不变特征。如果用户未设置任何代理,那么将放置一个缺省代理。10K货币单位是一些经纪人的常用值。

下面为生长现金代码,cerebro.set_cash(1000000)​​​​​​​

import backtrader as btif __name__ == '__main__':    cerebro = bt.Cerebro()    cerebro.broker.setcash(100000.0)    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())    cerebro.run()    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

下面为数据输入,官网的代码,也可以参考我的程序,数据怎么样输入以后会介绍,因为塔提供数据输入方式很多,代码如下​​​​​​​

import datetime  # For datetime objectsimport os.path  # To manage pathsimport sys  # To find out the script name (in argv[0])# Import the backtrader platformimport backtrader as btif __name__ == '__main__':    # Create a cerebro entity    cerebro = bt.Cerebro()    # Datas are in a subfolder of the samples. Need to find where the script is    # because it could have been called from anywhere    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))    datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')    # Create a Data Feed    data = bt.feeds.YahooFinanceCSVData(        dataname=datapath,        # Do not pass values before this date        fromdate=datetime.datetime(2000, 1, 1),        # Do not pass values after this date        todate=datetime.datetime(2000, 12, 31),        reverse=False)    # Add the Data Feed to Cerebro    cerebro.adddata(data)    # Set our desired cash start    cerebro.broker.setcash(100000.0)    # Print out the starting conditions    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())    # Run over everything    cerebro.run()    # Print out the final result    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

我们已经有数据输入了,但是没有数据输出,我们定义数据输出函数,self.log(),我们选择输出收盘价。代码​​​​​​​

import datetime  # For datetime objectsimport os.path  # To manage pathsimport sys  # To find out the script name (in argv[0])# Import the backtrader platformimport backtrader as bt# Create a Strateyclass TestStrategy(bt.Strategy):    def log(self, txt, dt=None):        ''' Logging function for this strategy'''        dt = dt or self.datas[0].datetime.date(0)        print('%s, %s' % (dt.isoformat(), txt))    def __init__(self):        # Keep a reference to the "close" line in the data[0] dataseries        self.dataclose = self.datas[0].close    def next(self):        # Simply log the closing price of the series from the reference        self.log('Close, %.2f' % self.dataclose[0])if __name__ == '__main__':    # Create a cerebro entity    cerebro = bt.Cerebro()    # Add a strategy    cerebro.addstrategy(TestStrategy)    # Datas are in a subfolder of the samples. Need to find where the script is    # because it could have been called from anywhere    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))    datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')    # Create a Data Feed    data = bt.feeds.YahooFinanceCSVData(        dataname=datapath,        # Do not pass values before this date        fromdate=datetime.datetime(2000, 1, 1),        # Do not pass values before this date        todate=datetime.datetime(2000, 12, 31),        # Do not pass values after this date        reverse=False)    # Add the Data Feed to Cerebro    cerebro.adddata(data)    # Set our desired cash start    cerebro.broker.setcash(100000.0)    # Print out the starting conditions    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())    # Run over everything    cerebro.run()    # Print out the final result    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

我们已经有数据的输入了,但是我们没有交易策略运行数据下面我们看交易策略编写,我们在函数next下面写交易策略,我们的交易策略为上涨3天卖出,连续下跌3天买入。下面为官网的代码,也可以参考我的代码​​​​​​​

import datetime  # For datetime objectsimport os.path  # To manage pathsimport sys  # To find out the script name (in argv[0])# Import the backtrader platformimport backtrader as bt# Create a Strateyclass TestStrategy(bt.Strategy):    def log(self, txt, dt=None):        ''' Logging function fot this strategy'''        dt = dt or self.datas[0].datetime.date(0)        print('%s, %s' % (dt.isoformat(), txt))    def __init__(self):        # Keep a reference to the "close" line in the data[0] dataseries        self.dataclose = self.datas[0].close    def next(self):        # Simply log the closing price of the series from the reference        self.log('Close, %.2f' % self.dataclose[0])        if self.dataclose[0] < self.dataclose[-1]:            # current close less than previous close            if self.dataclose[-1] < self.dataclose[-2]:                # previous close less than the previous close                # BUY, BUY, BUY!!! (with all possible default parameters)                self.log('BUY CREATE, %.2f' % self.dataclose[0])                self.buy()if __name__ == '__main__':    # Create a cerebro entity    cerebro = bt.Cerebro()    # Add a strategy    cerebro.addstrategy(TestStrategy)    # Datas are in a subfolder of the samples. Need to find where the script is    # because it could have been called from anywhere    modpath = os.path.dirname(os.path.abspath(sys.argv[0]))    datapath = os.path.join(modpath, '../../datas/orcl-1995-2014.txt')    # Create a Data Feed    data = bt.feeds.YahooFinanceCSVData(        dataname=datapath,        # Do not pass values before this date        fromdate=datetime.datetime(2000, 1, 1),        # Do not pass values before this date        todate=datetime.datetime(2000, 12, 31),        # Do not pass values after this date        reverse=False)    # Add the Data Feed to Cerebro    cerebro.adddata(data)    # Set our desired cash start    cerebro.broker.setcash(100000.0)    # Print out the starting conditions    print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())    # Run over everything    cerebro.run()    # Print out the final result    print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())

下面为输出的结果​​​​​​​

Starting Portfolio Value: 100000.002000-01-03, Close, 27.852000-01-04, Close, 25.392000-01-05, Close, 24.052000-01-05, BUY CREATE, 24.052000-01-06, Close, 22.632000-01-06, BUY CREATE, 22.632000-01-07, Close, 24.37......2000-12-20, BUY CREATE, 26.882000-12-21, Close, 27.822000-12-22, Close, 30.062000-12-26, Close, 29.172000-12-27, Close, 28.942000-12-27, BUY CREATE, 28.942000-12-28, Close, 29.292000-12-29, Close, 27.41Final Portfolio Value: 99725.08

我们知道交易策略,但是我们不知道买卖点,什么时候买的所以我们需要定义交易状态检测函数如下​​​​​​​

def notify_order(self, order):        if order.status in [order.Submitted, order.Accepted]:            # Buy/Sell order submitted/accepted to/by broker - Nothing to do            return        # Check if an order has been completed        # Attention: broker could reject order if not enough cash        if order.status in [order.Completed]:            if order.isbuy():                self.log('BUY EXECUTED, %.2f' % order.executed.price)            elif order.issell():                self.log('SELL EXECUTED, %.2f' % order.executed.price)            self.bar_executed = len(self)        elif order.status in [order.Canceled, order.Margin, order.Rejected]:            self.log('Order Canceled/Margin/Rejected')        # Write down: no pending order        self.order = None

下面为我写的基础使用完整的代码,供参考学习​​​​​​​

#交易策略为连续下跌3天买入,连续上涨3天卖出import pandas as pdimport matplotlib.pyplot as pltimport backtrader as btimport backtrader.feeds as btfeedimport backtrader.indicators as btindfrom backtrader import analyzersimport pyalgotradeimport  PySimpleGUI as sgimport akshare as akimport pandas as pdimport datetimestock=sg.popup_get_file('输入股票代码比如sz002466')start_date=sg.popup_get_file('输入数据开始时间比如20200101')start_cash=sg.popup_get_file('输入开始资金比如1000000')#定义测试类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 notify_order(self,order):        #如果交易提交/接受        if order.status in [order.Submitted,order.Accepted]:            print('交易提交,交易接受')        #如果交易完成        if order.status in [order.Completed]:            #如果交易类型是买            if order.isbuy():                self.log('买的价格, %.2f' % order.executed.price)            #如果交易类型是卖            elif order.issell():                self.log('卖的价格, %.2f' % order.executed.price)            self.bar_executed=len(self)        #如果交易交易取消,保证金不足,交易拒绝        elif order.status in [order.Canceled,order.Margin,order.Rejected]:          self.log('交易取消/保证金不足/交易拒绝')          self.order=None    #主交易函数    def next(self):        self.log('收盘价,%.2f' % self.dataclose[0])        #写交易函数,连续下跌3天买入,连续上涨3天卖出        #如果今天的价格小于昨天的价格        if self.dataclose[0]<self.dataclose[-1]:            #如果昨天的价格小于前天的价格            if self.dataclose[-1]<self.dataclose[-2]:                #记录买卖的价格                self.log('买的价格 %.2f' % self.dataclose[0])                self.buy(size=200)#单位为股,代表1手        elif self.dataclose[0]>self.dataclose[-1]:            if self.dataclose[-1]>self.dataclose[-2]:                self.log('卖出的价格 %.2f' %self.dataclose[0])                self.sell(size=100)#简单例子if __name__ == "__main__":    #将大脑实例化    cerebro=bt.Cerebro()    cerebro.addstrategy(testStrategy)    #加入数据    df=ak.stock_zh_a_daily(symbol=stock,start_date=start_date)    df.index=pd.to_datetime(df['date'])    data=btfeed.PandasData(dataname=df)    cerebro.adddata(data=data)    #设置开始资金    cerebro.broker.set_cash(int(start_cash))    #设置交易费用    cerebro.broker.setcommission(0.003)    print('开始值{}'.format(cerebro.broker.getvalue()))    cerebro.run()    print('最终值{}'.format(cerebro.broker.getvalue()))    cerebro.plot(style='candle')    plt.show()

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

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

相关文章

神经网络量化之 Ristretto、增量量化INQ、IAO代码实战分析

神经网络量化之 Ristretto、增量量化INQ、IAO代码实战分析 博文末尾支持二维码赞赏哦 _ 1. Ristretto 固定点浮点数量化 详细介绍 量化逼近方案 Ristretto允许以三种不同的量化策略来逼近卷积神经网络&#xff1a; 1、动态固定点&#xff1a;修改的定点格式&#xff0c; D…

自己做量化交易软件(42)小白量化实战15--自编股票软件公式历史与聚宽量化平台仿大智慧指标回测设计

自己做量化交易软件(42)小白量化实战15–自编股票软件公式历史与聚宽量化平台仿大智慧指标回测设计 在1997年以前&#xff0c;市面上已经出现了很多股票分析软件。大多数软件都集成好了一些常用指标&#xff0c;例如钱龙股票分析系统&#xff0c;海融股票分 析系统&#xff0c…

量化交易 第六课 策略评估指标计算

第六课 策略评估指标计算 概述获取取票数据回测收益率回测年华收益率最大回撤夏普比率 概述 我们在创建策略的过程中, 需要通过不同的评估指标来验证策略的有效性. 这些指标可以帮助我们调整策略, 得到更好的结果. 常见的策略评估指标有: 回测收益率回测年化收益率最大回撤夏…

自己做量化交易软件(3)通通量化分析框架构成1

自己做量化交易软件(3)通通量化分析框架构成1 通通股票量化分析框架采用模块化设计&#xff0c;每个模块存放在不同的py文件中。 通通股票量化分析框架下载&#xff1a; https://download.csdn.net/download/hepu8/10668509 运行python环境,可以在我的网盘下载绿色python软…

股票量化分析工具V2.0版-视频更新完毕!代码已上传!

视频课程《理性投资&#xff01;2天入门量化思维炒股&#xff01;定制自己的股票分析工具》Day1录播内容已全部上线。 已经购买的读者们速去学习&#xff01;&#xff01;&#xff01; ----点击【阅读原文】跳转 升级的V2.0回测工具的代码已经上传课件&#xff0c;同时也上传了…

python版期货量化交易(AlgoPlus)案例(多进程处理子任务)

python版期货量化交易&#xff08;AlgoPlus&#xff09;案例&#xff08;多进程处理子任务&#xff09; python因为简单、易上手&#xff0c;所以深受大家的喜爱&#xff0c;并且随着人工智能的不断发展与进步&#xff0c;python也一跃成为了最受欢迎的编程语言之一&#xff0…

程序员如何学习量化交易,一文总结

最近有位金融行业的朋友想把一个盈利能力很强的策略做成量化程序遇到问题&#xff0c;问题是这样的 线程A在while(true)的循环里做条件判断&#xff0c;循环耗时1分钟。循环结束判断条件满足的时候调用交易接口下单建仓。想实现条件成立马上建仓&#xff0c;而不需要等待1分钟的…

屏蔽 app 开屏广告,舒畅了

之前吐槽过开屏广告 吐槽一下 &#xff0c;今天分享下iOS手机屏蔽 app 开屏广告的方法&#xff1a; 1.打开手机设置 2.打开 屏幕使用时间 3.打开 内容和隐私访问限制 4.找到 广告 设置为不允许 设置完后大部分app的开屏广告没了&#xff0c;当然可能有漏网之鱼&#xff0c;可…

【K8S系列】快速初始化⼀个最⼩集群

序言 走得最慢的人&#xff0c;只要不丧失目标&#xff0c;也比漫无目的地徘徊的人走得快。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级重要蓝色&#xff1a;用来标记二级重要 希望这篇文章能让你不仅有…

吴恩达教你写提示词 ChatGPT prompt engineering

文章目录 吴恩达教你写提示词 ChatGPT prompt engineering1. 关键提示&#xff08;prompt&#xff09;原则1. 基础2. 编写明确和具体的提示词3. 给模型时间“思考”4. 模型的限制5. 迭代式提示&#xff08;prompt&#xff09;开发过程 2. 提示&#xff08;prompt&#xff09;一…

【AI提示】ChatGPT提示工程课程(吴恩达OpenAI)迭代提示词笔记(中文chatgpt版)...

Iterative Prompt Develelopment 迭代提示词开发 在本课中&#xff0c;您将反复分析和优化您的提示&#xff0c;以从产品说明书生成营销文案。 设置 import openai import osfrom dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv()) # read local .env fil…

Unity Shader人物发光特效

Unity Shader人物发光特效 写在前面效果实现方法项目地址写在后面 写在前面 当人物被击中或则有任务引导提升时&#xff0c;人物身上将会有发光特效&#xff0c;这里我自己实现一下。 效果 实现方法 核心思想就是将贴图试图向量(朝摄像机方向)与法线向量单位化后做点乘从而得…

【Unity】awake和start

生命周期流程如下 本篇主要讲的是在比较靠前的awake和start阶段&#xff0c;因为这两个阶段效果类似&#xff0c;都只会执行一次&#xff0c;但是具有触发条件. awake、enable、start依照次顺序执行&#xff0c;awake会在一开始的时候就会执行&#xff0c;但start则是在被激活…

Unity Shader - 类似七龙珠的人物气焰效果

文章目录 环境效果思路passespass - 气焰优化后的 shader Project关于效果落地 环境 Unity : 2018.3.11f1 Pipeline : BRP 效果 覆盖身前 覆盖身前 叠加混合 风格化 版本&#xff0c;更适合 NPR&#xff1a; 再优化一版本 该效果是自己摸索的&#xff08;也是自己再国…

虚幻引擎中GPU Lightmass全局光照的使用步骤

GPU Lightmass (GPULM) 是一种光烘焙方法&#xff0c;它预先计算来自具有 Stationary 或 Static 移动性的灯光的复杂光交互&#xff0c;并将该数据存储在创建的应用于场景几何体的光照贴图纹理中。GPU Lightmass 显着减少了为复杂场景计算、构建和生成光照数据所需的时间&#…

UE4 Shader 常用函数 学习笔记

Add&#xff1a;快捷键a 将两数相加&#xff0c;也可以将两纹理相加&#xff0c;如下图&#xff1a; append&#xff08;追加&#xff09;&#xff1a; Subtract&#xff08;减&#xff09;&#xff1a; 和加相反&#xff0c;特例&#xff0c;如下&#xff1a; Abs&#xff0…

Ubuntu搭建原神3.7版本服务器

本文涉及知识点 linux基础命令|mongoDB服务端搭建及指令|Java环境搭建 原神私服可以用来抽卡满足自己用&#xff0c;他的许多任务都得登录控制台自己发&#xff0c;不建议拿私服玩&#xff0c;想要体验完美原神请到官服&#xff0c;本文只做LINUX MongoDB java教学例子 写在前…

原神角色渲染详解

整体效果展示&#xff1a;主要方案是对下面几张图做不同的处理 身体 基础颜色光照&#xff1a;主要贴图卡通贴图ramp图法线图光照图 金属度与高光&#xff0c;头发部分高光&#xff1a;光照图&#xff0c;头发部分用高光black图 深度边缘光&#xff1a;用额外pass DepthNor…

打脸了兄弟们,Go1.20 arena 来了!

大家好&#xff0c;我是煎鱼。 大概半年前&#xff0c;我写过一篇文章《Go 要违背初心吗&#xff1f;新提案&#xff1a;手动管理内存》。有兴趣了深入解的同学&#xff0c;可以再回顾一下。 当时我们还想着 Go 团队应该不会接纳&#xff0c;至少不会那么快&#xff1a; 没想到…

对正在打野发育的红队同学的一次反制

文章目录 故事开始其他反制思路隐蔽C2CS重定向器实验 故事开始 真的是对同学的反制哈&#xff0c;我们最近都在学习内网&钓鱼就互相”攻击“&#xff0c;就有那么一天我就在想我偷懒把CS登录密码设置的很简单&#xff0c;会不会其它人也偷懒&#xff0c;于是就抱着尝试的心…