指标研究与多周期

哪些地方会用到指标 ?

回顾一下 Backtrader 的主要功能模块和回测流程(见:Backtrader 来了!)可以发现,只有在编写策略Strategy 时才会涉及到指标的计算和使用,而且是 Strategy 中的 __init__() 和 next() 方法涉及的最多。

建议在 __init__() 中提前计算指标

Strategy 中的 __init__() 函数在回测过程中只会在最开始的时候调用一次,
而 next() 会每个交易日依次循环调用多次,所以为了提高回测效率,建议先在 __init__() 中一次性计算好指标(甚至是交易信号),
然后在 next() 中调用已经算好的指标,这样能有效避免指标的重复计算,提高回测运行速度。建议遵循“__init__() 负责指标计算,next() 负责指标调用”的原则。

import backtrader.indicators as btind # 导入策略分析模块class MyStrategy(bt.Strategy):# 先在 __init__ 中提前算好指标def __init__(self):sma1 = btind.SimpleMovingAverage(self.data)ema1 = btind.ExponentialMovingAverage()close_over_sma = self.data.close > sma1close_over_ema = self.data.close > ema1sma_ema_diff = sma1 - ema1# 生成交易信号buy_sig = bt.And(close_over_sma, close_over_ema, sma_ema_diff > 0)# 在 next 中直接调用计算好的指标def next(self):if buy_sig:self.buy()

计算指标时的各种简写形式

class TestStrategy(bt.Strategy):def __init__(self):# 最简方式:直接省略指向的数据集self.sma1 = btind.SimpleMovingAverage(period=5)# 只指定第一个数据表格self.sma2 = btind.SMA(self.data, period=5)# 指定第一个数据表格的close 线self.sma3 = btind.SMA(self.data.close, period=5)# 完整写法self.sma4 = btind.SMA(self.datas[0].lines[0], period=5)# 指标函数也支持简写 SimpleMovingAverage → SMAdef next(self):# 提取当前时间点print('datetime', self.datas[0].datetime.date(0))# 打印当日、昨日、前日的均线print('sma1',self.sma1.get(ago=0, size=3))print('sma2',self.sma2.get(ago=0, size=3))print('sma3',self.sma3.get(ago=0, size=3))print('sma4',self.sma4.get(ago=0, size=3))cerebro = bt.Cerebro()
st_date = datetime.datetime(2019,1,2)
end_date = datetime.datetime(2021,1,28)
datafeed1 = bt.feeds.PandasData(dataname=data1, fromdate=st_date, todate=end_date)
cerebro.adddata(datafeed1, name='600466.SH') 
datafeed2 = bt.feeds.PandasData(dataname=data2, fromdate=st_date, todate=end_date)
cerebro.adddata(datafeed2, name='603228.SH') 
cerebro.addstrategy(TestStrategy)
rasult = cerebro.run()

调用指标时的各种简写形式
调用指标时会涉及 line 的索引和切片操作,为了使操作更加简便,
在 next() 中调用当前时刻指标值时,可以省略索引 [0] :即在 next() 中,self.sma5[0] ↔ self.sma5、self.data.close[0] ↔ self.data.close 等都是等价的,
省略了 [0] 的简写形式 self.sma5 、 self.data.close 等都默认指向当前值,自动索引当前值
 

class TestStrategy(bt.Strategy):def __init__(self):self.sma5 = btind.SimpleMovingAverage(period=5) # 5日均线self.sma10 = btind.SimpleMovingAverage(period=10) # 10日均线self.buy_sig = self.sma5 > self.sma10 # 5日均线上穿10日均线def next(self):# 提取当前时间点print('datetime', self.datas[0].datetime.date(0))# 打印当前值print('close', self.data.close[0], self.data.close)print('sma5', self.sma5[0], self.sma5)print('sma10', self.sma10[0], self.sma10)print('buy_sig', self.buy_sig[0], self.buy_sig)# 比较收盘价与均线的大小if self.data.close > self.sma5:print('------收盘价上穿5日均线------')if self.data.close[0] > self.sma10:print('------收盘价上穿10日均线------')if self.buy_sig:print('------ buy ------')cerebro = bt.Cerebro()
st_date = datetime.datetime(2019,1,2)
end_date = datetime.datetime(2021,1,28)
datafeed1 = bt.feeds.PandasData(dataname=data1, fromdate=st_date, todate=end_date)
cerebro.adddata(datafeed1, name='600466.SH') 
cerebro.addstrategy(TestStrategy)
rasult = cerebro.run()
class TestStrategy(bt.Strategy):def __init__(self):self.sma5 = btind.SimpleMovingAverage(period=5) # 5日均线self.sma10 = btind.SimpleMovingAverage(period=10) # 10日均线# bt.And 中所有条件都满足时返回 1;有一个条件不满足就返回 0self.And = bt.And(self.data>self.sma5, self.data>self.sma10, self.sma5>self.sma10)# bt.Or 中有一个条件满足时就返回 1;所有条件都不满足时返回 0self.Or = bt.Or(self.data>self.sma5, self.data>self.sma10, self.sma5>self.sma10)# bt.If(a, b, c) 如果满足条件 a,就返回 b,否则返回 cself.If = bt.If(self.data>self.sma5,1000, 5000)# bt.All,同 bt.Andself.All = bt.All(self.data>self.sma5, self.data>self.sma10, self.sma5>self.sma10)# bt.Any,同 bt.Orself.Any = bt.Any(self.data>self.sma5, self.data>self.sma10, self.sma5>self.sma10)# bt.Max,返回同一时刻所有指标中的最大值self.Max = bt.Max(self.data, self.sma10, self.sma5)# bt.Min,返回同一时刻所有指标中的最小值self.Min = bt.Min(self.data, self.sma10, self.sma5)# bt.Sum,对同一时刻所有指标进行求和self.Sum = bt.Sum(self.data, self.sma10, self.sma5)# bt.Cmp(a,b), 如果 a>b ,返回 1;否则返回 -1self.Cmp = bt.Cmp(self.data, self.sma5)def next(self):print('---------- datetime',self.data.datetime.date(0), '------------------')print('close:', self.data[0], 'ma5:', self.sma5[0], 'ma10:', self.sma10[0])print('close>ma5',self.data>self.sma5, 'close>ma10',self.data>self.sma10, 'ma5>ma10', self.sma5>self.sma10)print('self.And', self.And[0], self.data>self.sma5 and self.data>self.sma10 and self.sma5>self.sma10)print('self.Or', self.Or[0], self.data>self.sma5 or self.data>self.sma10 or self.sma5>self.sma10)print('self.If', self.If[0], 1000 if self.data>self.sma5 else 5000)print('self.All',self.All[0], self.data>self.sma5 and self.data>self.sma10 and self.sma5>self.sma10)print('self.Any', self.Any[0], self.data>self.sma5 or self.data>self.sma10 or self.sma5>self.sma10)print('self.Max',self.Max[0], max([self.data[0], self.sma10[0], self.sma5[0]]))print('self.Min', self.Min[0], min([self.data[0], self.sma10[0], self.sma5[0]]))print('self.Sum', self.Sum[0], sum([self.data[0], self.sma10[0], self.sma5[0]]))print('self.Cmp', self.Cmp[0], 1 if self.data>self.sma5 else -1)cerebro = bt.Cerebro()
st_date = datetime.datetime(2019,1,2)
ed_date = datetime.datetime(2021,1,28)
datafeed1 = bt.feeds.PandasData(dataname=data1, fromdate=st_date, todate=ed_date)
cerebro.adddata(datafeed1, name='600466.SH')
cerebro.addstrategy(TestStrategy)
rasult = cerebro.run()

如何对齐不同周期的指标

通常情况下,操作的都是相同周期的数据,比如日度行情数据计算返回各类日度指标、周度行情数据计算返回各类周度指标、......,行情数据和指标的周期是一致的,时间也是对齐的。
但有时候也会遇到操作不同周期数据的情况,比如拿日度行情与月度指标作比较,日度行情每天都有数据,而月度指标每个月只有一个,2 条数据在时间上是没有对齐的,如下所示:

可以使用“ ( ) ”语法操作来对齐不同周期的数据,对齐的方向是“大周期向小周期对齐”,
可以选择指标对象中的某条 line 进行对齐,也可以对整个指标对象进行对齐。
在使用该语法时,要将 cerebro.run() 中的 runonce 设置为 False,才能实现对齐操作:

# self.data0 是日度行情、self.data1 是月度行情
self.month = btind.xxx(self.data1) # 计算返回的 self.month 指标也是月度的
# 选择指标对象中的第一条 line 进行对齐
self.sellsignal = self.data0.close < self.month.lines[0]()
# 对齐整个指标对象
self.month_ = self.month() 
self.signal = self.data0.close < self.month_.lines[0] cerebro.run(runonce=False)

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

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

相关文章

区块链BAAS平台:公共或私人区块链编程以用于各种用途

2019独角兽企业重金招聘Python工程师标准>>> 人们可以为公共或私人区块链编程以用于各种用途。理论上&#xff0c;我认为牺牲权力下放的方面可以解决区块链技术背后的许多当前问题。区块链仍然可以包容&#xff0c;而不是分散。这如何解决当前的一些问题&#xff1f…

CURL 是什么

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 cURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;1997年首次发行。 它支持文件上传和下载&#xff0c;所以是综合传输工…

易用性问题回复

针对淘宝网为例&#xff0c;以一次完整的购物流程为背景&#xff0c;我们分析了在淘宝网中的一些易用性的体现&#xff0c;主要场景如下图所示: 在本场景中&#xff0c;新用户下载淘宝app时&#xff0c;第一次打开应用&#xff0c;淘宝app会出现新手指引&#xff0c;教会用户如…

易盛极星期货量化教学

我目前量化实盘做期货交易用的是这个软件。主要就是因为它可以做套利合约&#xff0c;还有就是国企的外包&#xff0c;安全&#xff08;vnpy的狗咬狗害怕&#xff09;。 策略模板&#xff1a; 设置全局参数变量&#xff1a; #导入包 import talib #选择合约代码 code1 #设…

eBay是如何进行大数据集元数据发现的

很多大数据系统每天都会收集数PB的数据。这类系统通常主要用于查询给定时间范围内的原始数据记录&#xff0c;并使用了多个数据过滤器。但是&#xff0c;要发现或识别存在于这些大型数据集中的唯一属性可能很困难。 在大型数据集上执行运行时聚合&#xff08;例如应用程序在特定…

职业发展 先“立功”还是先“安内”?

导读&#xff1a;职业生涯更上一层楼&#xff0c;章良踌躇满志&#xff0c;想在短期内建功立业&#xff0c;奠定江湖地位。但他清楚&#xff0c;自己运筹中的分公司服务升级计划&#xff0c;对公司整体和自己的职业生涯都非常有利&#xff0c;却将不可避免地转移老将掌握的部分…

网关 Kong 折腾笔记 - 相关技术清单

背景 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 公司准备更好的实现微服务架构&#xff0c;我前期的任务主要是 API 开发相关的技术学习&#xff0c;微服务会随着业务的增加不断增加…

Quantaxis更新数据到最新

登录QQ群&#xff1a;563280067 安装方法&#xff1a; 1.进入命令界面&#xff0c; 2.pip install pytdx-1.72r2-py3-none-any.whl 3. pip install quantaxis-1.10.19r1-py3-none-any.whl 之后输入save save all 即可看到所有的数据全部安装到位

Java各进制之间的转换

十进制转成十六进制&#xff1a; Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinaryString(int i) 十六进制转成十进制 Integer.valueOf("FFFF",16).toString() 八进制转成十进制 Integer.valueOf("…

mingW与cygwin 异同

首先MingW和cygwin都可以用来跨平台开发。 MinGW是Minimalistic GNU for Windows的缩写&#xff0c;也就是Win版的GCC。 Cygwin则是全面模拟了Linux的接口&#xff0c;提供给运行在它上面的的程序使用&#xff0c;并提供了大量现成的软件&#xff0c;更像是一个平台。 相…

shell字符串的用法

shell字符串的用法 注意&#xff1a;shell4.2和shell4.1会有差别&#xff0c;较低版本的shell可能不支持某些功能 获取字符串长度&#xff1a;${#string}获取子串&#xff1a; 注&#xff1a;&#xff08;左边的第一个字符是用 0 表示&#xff0c;右边的第一个字符用 0-1 表示&…

backtrader期权回测框架

使用backtrader数据进行回测&#xff0c;数据源来自于交易所爬取。 效果还行&#xff0c;我相信各位通过这个的框架学习&#xff0c;会对backtrader的应用有更深的领悟。包括数据的连接&#xff0c;新指标的加入。 导入框架&#xff1a; __future__ import (absolute_import…

kong入门实战

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 安装kong-database docker run -d --name kong-database \-p 5432:5432 \-e "POSTGRES_USERkong" \-e "POSTGRES_DBkong&…

PAT A1048

示例思想中提到了二分以及two point概念&#xff0c;这个需要后面进行总结&#xff1b;这个示例也给出了一个新的思路。对于两个数字和m&#xff0c;查找两个加数&#xff0c;可以进行i和m-i的枚举&#xff0c;通过遍历数组查看两个加数是否存在&#xff0c;来进行遍历&#xf…

linux 32位平台,文件大小受限于2G的解决方法

公司的asterisk系统已经发生了两次crash&#xff0c;检查日志&#xff0c;都是在日志文件写满到2G后自动执行转储时&#xff0c;日志还在写继续写入而导致的。google以后&#xff0c;发现了下面这边文章&#xff0c;赞&#xff01;解决了文件大小限于2G的问题&#xff0c;转帖到…

【noip模拟赛4】Matrix67的派对 暴力dfs

【noip模拟赛4】Matrix67的派对描述 Matrix67发现身高接近的人似乎更合得来。Matrix67举办的派对共有N(1<N<10)个人参加&#xff0c;Matrix67需要把他们安排在圆桌上。Matrix67的安排原则是&#xff0c;圆桌上任意两个相邻人的身高之差不能超过K。请告诉Matrix67他共有多…

Backtrader多周期回测

获取数据 result pd.read_csv(11.csv) df pd.DataFrame(dataresult) df df.set_index([datetime]) df 策略 class MultiTFStrategy(bt.Strategy):params ((period, 20),)# states definationEmpty, M15Hold, H1Hold, D1Hold range(4)States [Empty, M15Hold, H1Hold, D…

CentOS 7 防火墙操作

导语 今天说下防火墙的操作。CentOS 6 的防火墙是 iptables&#xff0c;CentOS 7 默认的是 firewall&#xff0c;以前的操作不再适用。 查看、开启 服务器刚刚重启完毕&#xff0c;先来看下防火墙的状态&#xff0c;输入 systemctl status firewalld 进行查看 这里是关闭的&…

Centos安装nmon软件 ( 测试 )

安装 mkdir /usr/local/nmon cd /usr/local/nmon wget http://sourceforge.net/projects/nmon/files/nmon_linux_14i.tar.gz tar zxvf nmon_linux_14i.tar.gz chmod 777 nmon_x86_64_sles11 12345 启动 ./nmon_x86_64_sles11 1 说明&#xff1a; 按C显示CPU信息&#xff0c;再按…

阿里云安装Quantaxis

参考博客&#xff1a;https://github.com/QUANTAXIS/QUANTAXIS/issues/1395 之后进入阿里云中的Ubuntu界面 输入&#xff1a; sudo yum install apt-transport-https ca-certificates curl software-properties-common Sudo yum install curl service network restartcd qua…