当前位置:首页 热点资讯 正文

backtrader多只股票(backtrader多只股票收益回测)

laughing168 2022年01月14日 101 0

  

本文继续介绍backtrader多周期回溯测试的第二种方法,使用重采样加载多周期数据。

简历

如果需要多周期策略回溯测试,但只有单周期数据可用,那么可以使用重采样来解决多周期数据生成的问题。

这里的重采样其实是指上采样,利用小周期的数据合成大周期的数据。例如,将周数据与日数据合成。这里提到的上采样与信号处理的上采样效果相反。在信号处理中,上采样会得到比源数据更多的数据,而这里的上采样是得到周期大的数据,数据量比源数据少。

反向交易者重采样

Backtrader有一个内置的重采样方法:

cerebro.resampledata(数据,**kwargs)

数据是源数据(小周期数据),重新采样的目标数据(大周期数据)已经通过这个方法调用添加到了大脑中。

这种方法主要有两个参数来控制重采样的具体实现:

时间框架(默认:bt。时间框架(天)

此参数为目标数据的周期类型,目标数据周期应大于等于源数据,即如果源数据为日数据,则目标数据可以为日、周、月或更大的周期数据。

压缩(默认:1)

该参数为压缩比,取值为1到N,进一步将目标数据的N行压缩为一行。

使用重采样时,还存在注释38中提到的情况,即使用大周期数据会使策略的最小周期变大。

支点

Pivot本身就是一个多周期的技术指标,这个例子会用到Pivot Point指标,所以这里简单介绍一下。

枢轴点指数考虑的是过去一段时间内较大时期的k线值。比如判断日线时,会用前一个月的月线数据进行指标计算。当然,日线也可以根据需要与其他大周期k线结合使用。

该指标的计算公式为:

枢轴=(高+低+关闭)/ 3支撑1 = 2.0 *枢轴-高支撑2 =枢轴-(高-低)电阻1 = 2.0 *枢轴-低电阻2 =枢轴+(高-低)

以日线和月线的组合为例,其中高、低、收盘分别对应上月月线的最高价、最低价和收盘价。

在backtrader中,这五个指标的名称是P、s1、s2、r1和r2。p为轴点,s1和s2对应第一级和第二级支架,r1和r2对应第一级和第二级电阻。

有关枢轴点的更多信息,请参考:

https://school.stockcharts.com/doku.php? id =技术指标:轴心点

例子

为了演示重采样回溯测试,本文使用了以下方案:

该策略将首先读取每日数据,然后通过重采样生成并加载每月数据。回测股票为000001平安银行,回测期间为2018年1月1日至2019年12月31日。#加载数据 defload _ data (STK _ code,fromdate,todate): 数据路径= & # 39;。/STK _ data/d/& # 39;+STK _ code+& # 39;。csv & # 39 返回Bt . feeds . genericcsvdata( data name = data path, fromdate = fromdate, todate = todate+datetime . time delta(days = 1), nullvalue = 0.0, dtformat =(& # 39;% Y-% m-% d & # 39;), datetime = 0, open = 1, high = 2, low = 3, close = 4, volume = 5, open interest =-1 ) STK _ list =[& # 39;sz.000001 & # 39/h/时间框架。月,压缩= 1)

首先加载日数据,然后通过重采样获取并加载月数据。

买入条件:价格回踩2级支撑或突破1级阻力;卖出条件:价格比最高收盘价低5%。

在策略类的init方法中,定义所需的技术指标:

Def __init__(self): #存储不同数据的技术指标 self.inds = dict() #存储特定股票的订单,关键是股票代码 self。orders = dict() Inenumerate(self。数据): self。orders[D . name]= none #为每个数据定义一个字典,并存储技术指标 self.inds[d] = dict() #确定D是否为日线。最低& # 39;] = Bt ind。最低(d,期间= self.p .最低期间) #判断d是否为月度数据 else: #定义枢纽点指标 self . inds[d][& # 39;pp & # 39] = btind。数据透视点(d)

定义字典自身,存储不同数据的技术指标。

定义self.orders存储特定股票的订单,关键是股票代码。

然后遍历所有数据,先将数据顺序设置为空白,并为每个数据创建一个字典来存储技术指标。因为系统先加日数据再加月数据,当i% 2等于0时,D为日数据,然后计算最小指数。当i% 2不等于0时,d是月度数据,然后计算透视点指数。

在策略类的下一个方法中,定义买卖条件:

Def next (self): 对于I,d in enumerate (self.data): #如果处理月度数据,跳过买卖条件。如果不是len (POS): 如果1 = = I% 2: 继续 POS = self,可以买 。Getposition (d) #因为已经在日常数据中进行了判断和处理。pp & # 39] if(self . inds[d][& # 39;最低& # 39;]& lt;= month_pp.s2和d.close >。month_pp.s2)或( self . inds[d][& # 39;最低& # 39;]& lt;= month_pp.r1和d.close & gtMonth_pp.r1) : #买家数量 股份= int (self。broker.cash/len(STK _ list)//(d . close[0]* 100))* 100 #买买买[Size = stake] elif not self。保护点订单 下的订单[d _ name]: #自。订单[d _ name]=自我。close (data = d,exec type = bt.order.stop trail, trail mount = self . p . trail mount, trail percent = self . p . trail percent)

这里,仍然只有i% 2等于0的数据(同一天线数据)被有条件地判断,然后是self。inds[自我。数据[I+1]][& # 39;pp & # 39参观月线的技术指标。

当满足购买条件时,订单将在第二天以开盘价关闭。在计算买入头寸的规模时,确保资金得到最大限度的使用。

在订单平仓当天,下StopTrail卖出订单,当股价从最高收盘价回落5%时卖出(详见附注20和附注32)。这里,使用关闭方法而不是卖出方法。如果用卖出法,股票一次卖出一股,如果用平仓法,股票全部卖出。

输出结果是:

  2018-08-27 BUY sz.000001 EXECUTED, Price: 10.02 2018-09-10 SELL sz.000001 EXECUTED, Price: 9.91 2018-10-08 BUY sz.000001 EXECUTED, Price: 10.70 2018-10-11 SELL sz.000001 EXECUTED, Price: 10.03 2019-01-21 BUY sz.000001 EXECUTED, Price: 10.34 2019-03-08 SELL sz.000001 EXECUTED, Price: 12.43 2019-04-09 BUY sz.000001 EXECUTED, Price: 13.87 2019-04-23 SELL sz.000001 EXECUTED, Price: 13.99 2019-06-21 BUY sz.000001 EXECUTED, Price: 13.76 2019-07-08 SELL sz.000001 EXECUTED, Price: 13.47 2019-08-13 BUY sz.000001 EXECUTED, Price: 15.00 2019-08-22 SELL sz.000001 EXECUTED, Price: 14.24 2019-08-26 BUY sz.000001 EXECUTED, Price: 14.42 2019-10-22 SELL sz.000001 EXECUTED, Price: 16.36 Final Portfolio Value: 1184108.052018-08-27 BUY sz.000001 EXECUTED,价格:10.02/h/2018-09-10 SELL SZ . 000001 EXECUTED,价格:9.91/h/2018-10-08 BUY SZ . 000001 EXECUTED,价格:10.70/h/2018-10-11 SELL SZ . 0000001 EXECUTED,价格:10.70

两年共成交7笔,收益率18.4%。

摘要backtrader可以通过resample来实现基于单周期数据的多周期数据生成与加载。使用源数据进行resample时,目标数据周期应大于等于源数据周期在策略实现时,通过数据索引的取余运算来区分源数据、目标数据。

多周期策略回溯测试程序v2代码:

#多周期 #买入条件:价格回踩二级支撑或突破一级阻力 #卖出条件:价格从最高收盘价回撤5%,卖出 来自_ _ future _ _ import(absolute _ import,division,print _ function, unicode _常值) import back trader as Bt import back trader . feeds as btfeeds import back trader .指标为btind import datetime[/asz.000001 & # 39] 类PivotMultiTF(bt)。策略): params =( (& # 39;最低期限& # 39;,5), (& # 39;旅行& # 39;,0.0), (& # 39;trailpercent & # 39,0.05), ) def _ _ init _ _ _ _(self): #存储不同数据的技术指标 self.inds = dict() #特定股票的订单,关键是股票代码 self.orders = dict() #遍历枚举(self.data)中I,d的所有数据 : self . Orders[d . name]= none #。存储技术指标 self.inds[d] = dict() #确定d是否为日数据 IF 0 = = I% 2: self。inds[d][& # 39;最低& # 39;] = Bt ind。最低(d,期间= self.p .最低期间) #判断d是否为月度数据 else: #定义枢纽点指标 self . inds[d][& # 39;pp & # 39] = Bt ind。枢轴点(d) 定义下一个(自我): 用于枚举(自我)中的I、d。数据): #如果处理月度数据,则跳过买卖条件。如果不是len (POS): 如果1 = = I% 2: 继续 POS = self,可以买 。Getposition (d) #因为已经在日常数据中进行了判断和处理。pp & # 39] if(self . inds[d][& # 39;最低& # 39;]& lt;= month_pp.s2和d.close >。month_pp.s2)或( self . inds[d][& # 39;最低& # 39;]& lt;= month_pp.r1和d.close & gtMonth_pp.r1) : #买家数量 股份= int (self。broker.cash/len(STK _ list)//(d . close[0]* 100))* 100 #买买买[Size = stake] elif not self。保护点订单 下的订单[d _ name]: #自。订单[d _ name]=自我。close (data = d,exec type = bt.order.stop trail, trail mount = self . p . trail mount, trail percent = self . p . trail percent) def notify _ order(self,order): if order . status in[order]。已完成]: if order . is buy(): print(& # 39;{} BUY {} EXECUTED,价格:{:. 2f } & # 39;。格式(self.datetime.date()、order.data._name、order . executed . price)) else:# Sell orders[orders . data . _ name]= None print(& # 39;{}销售{}已执行,价格:{:. 2f } & # 39;。格式(self.datetime.date()、order.data._ name、order.executed.price)) #加载数据 defload _ data (STK _ code、fromdate、todate): 数据路径=&#。/STK _ data/d/& # 39;+STK _ code+& # 39;。csv & # 39 返回Bt . feeds . genericcsvdata( data name = data path, fromdate = fromdate, todate = todate+datetime . time delta(days = 1), nullvalue = 0.0, dtformat =(& # 39;% Y-% m-% d & # 39;), datetime = 0, open = 1, high = 2, low = 3, close = 4, volume = 5, open interest =-1 ) def run strat(): 脑波= bt。cereo() cereo . broker . set cash(1000000 . 0) cereo . addstrategy(pivottomytif) fromdate = datetime . datetime(2018,1,1) todate = datetime . datetime(2019,12,31) 对于stk_list中的STK _ code: data = load _ data(STK _ code,from date,todate)[/h/时间框架。月,压缩= 1) 大脑地址写入器。WriterFile,out = & # 39log.csv & # 39,CSV = True) cereo . run() print(& # 39;最终投资组合价值:% .2f & # 39%脑波. broker.getvalue ()] #绘制结果绘制结果 脑波. plot (start = datetime.date (2018,1,1),end = datetime.date (2019,12,31),[/candle & # 39;, barup = & # 39;红色& # 39;,巴登= & # 39;绿色& # 39;) if _ _ name _ _ = = = & # 39;_ _ main _ _ & # 39: runstrat()

感兴趣的读者也可以关注我的CSDN博客——代号农夫A V

欢迎大家关注、喜欢、转发和留言,感谢大家的支持!

本文地址: http://www.fadun365.com/jinrong/102662.html

文章来源:laughing168

版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

置顶
置底