热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

指标研究与多周期

哪些地方会用到指标?回顾一下Backtrader的主要功能模块和回测流程(见:Backtrader来了!)可

哪些地方会用到指标 ?

回顾一下 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_ = self.month()
self.signal = self.data0.close


推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了利用ARMA模型对平稳非白噪声序列进行建模的步骤及代码实现。首先对观察值序列进行样本自相关系数和样本偏自相关系数的计算,然后根据这些系数的性质选择适当的ARMA模型进行拟合,并估计模型中的位置参数。接着进行模型的有效性检验,如果不通过则重新选择模型再拟合,如果通过则进行模型优化。最后利用拟合模型预测序列的未来走势。文章还介绍了绘制时序图、平稳性检验、白噪声检验、确定ARMA阶数和预测未来走势的代码实现。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • Introduction(简介)Forbeingapowerfulobject-orientedprogramminglanguage,Cisuseda ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
author-avatar
超级-郁闷中
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有