量化回测框架Backtrader【3】-核心概念Lines
目录
一,什么是Lines
二,Lines的声明
三,Lines的访问
四,Lines的长度
五,Lines和参数的继承机制
题外话
这讲介绍BackTrader的一个贯穿框架始终的核心概念-lines。
一,什么是Lines
我们知道股票,期货这些金融概念都跟一个属性息息相关,那就是时间。而BackTrader的基本功能回测其实说白了就是将一个算法(策略)运行在一个一时间为基本维度的数据(股票,期货等)上进行迭代。时间这种顺序性极强的概念跟现实世界中的直线的概念是很相似的,于是BackTrader将框架中绝大部分的与时间概念相关的类中都包含了lines这个成员。
上节讲的数据导入中,导入的每一个数据类别都会生成一条lines,包括时间数据,还是拿之前的代码作为示例:
from datetime import datetime
import backtrader as bt
import backtrader.feeds as btfeedsclass SmaCross(bt.SignalStrategy):def __init__(self):sma1, sma2 = bt.ind.SMA(period=10), bt.ind.SMA(period=30)crossover = bt.ind.CrossOver(sma1, sma2)self.signal_add(bt.SIGNAL_LONG, crossover)cerebro = bt.Cerebro()
cerebro.addstrategy(SmaCross)data = btfeeds.GenericCSVData(dataname='stock_data.csv',fromdate=datetime(2011, 1, 1),todate=datetime(2012, 12, 31),nullvalue=0.0,dtformat=('%Y%m%d'),datetime=1,open=2,high=3,low=4, close=5,volume=9,openinterest=-1
)cerebro.adddata(data)cerebro.run()
cerebro.plot(iplot=False)
在数据导入(代码中的GenericCSVData)时,生成了‘datetime’,‘open’,‘high’,‘low’,‘close’,‘volume’,这六条lines,另外在类SmaCross里面也生成了‘sma1’,‘sma2’以及‘crossover’三条lines。‘sma1’,‘sma2’,‘crossover’是策略用的指标,指标会在之后的章节详细讲解,这边只要了解就好。
二,Lines的声明
当你需要开发一个新的指标或者导入新的数据类别(上一讲最后部分)的时候,则必须在该指标中声明一条line来保存产生的指标值或数据类别。
就像添加参数一样,以元组作为类属性进行声明。 不支持字典,因为它们不按照插入顺序存储内容。摘抄上讲最后的例子说明:
class GenericCSV_extend(GenericCSVData):# 添加change数据lines = ('change',)
注意:如果您将一个字符串当成元组的一个成员,则在字符串后面需要添加逗号,否则,字符串中的每个字母都将被解释为元组的成员。这是Python本身的语法特性
三,Lines的访问
在策略或指标模块中需要访问lines来获取需要处理的数据,尽管两者的目的有些不同,策略是使用数据来做出开仓,平仓等操作决策,而指标则是使用数据来生成新的数据供策略使用。
对lines的访问有几种形式:
- 数组下标的方式lines[X]
- line后面跟X,比如lineX
- line跟X中间用一个下划线连接,比如line_X
X代表一个数字,以上三种方式都能访问到同一条line,另外还有一种line后面什么都没有就相当于line0
示例如下:
class TestStrategy(bt.SignalStrategy):def __init__(self):print(self.data.line)print(self.data.line0)print(self.data.line_0)print(self.data.lines[0])def next(self):passcerebro = bt.Cerebro()
cerebro.addstrategy(TestStrategy)data = btfeeds.GenericCSVData(dataname='stock_data.csv',fromdate=datetime(2011, 1, 1),todate=datetime(2012, 12, 31),nullvalue=0.0,dtformat=('%Y%m%d'),datetime=1,open=2,high=3,low=4, close=5,volume=9,openinterest=-1
)cerebro.adddata(data)
cerebro.run()
运行之后的输出如下:
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC57FAC8>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC57FAC8>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC57FAC8>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC57FAC8>
可见四种访问方式都指向同一个LineBuffer对象
还有一种简便的省略可以line访问方式,
self.dataX_Y
相当于
self.datas[X].lines[Y]
在上面的例子中,我们都是用数字序号的方式来访问对应的line,这有一个弊端就是不好阅读,data在导入的时候都是带名字,‘close’,‘open’等,那么我们也可以用名字的方式来访问,这样代码阅读起来更好懂一点
class TestStrategy(bt.SignalStrategy):def __init__(self):print(self.data.line)print(self.data.close)print(self.data.lines.close)print(self.data.line1)print(self.data.low)print(self.data.lines.low)def next(self):pass
将上例中的class TestStrategy(bt.SignalStrategy)替换为这个,运行的输出是这样
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC6502B0>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC6502B0>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC6502B0>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC650320>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC650320>
<backtrader.linebuffer.LineBuffer object at 0x000002A5EC650320>
前面三个和后面三个分别指向同一个对象,可见line0就是close,而line1是low。虽然他们的作用一样,一般情况下能用名字尽量用名字,可读性的重要性不言而喻。但有一个例外就是在指标函数的内部,由于指标函数会生成新的line输出,为了避免可能跟新的line同名,可以使用数字索引。
四,Lines的长度
就像我开头说的,运行回测相对于将策略从头到尾遍历一遍数据。当回测正在运行时,会有两个长度的概念,一个是过去数据的长度(已经运行过的数据),另一个是总的数据长度。做个比喻就像是爬台阶,每一个台阶就是一个数据,过去的数据就是已经爬完的台阶,脚下的台阶就是当前正在处理的数据,数据总长度就是全部的台阶数。已处理数据长度(爬过的台阶)是动态增长的,而数据总长(总台阶数)是固定的。
这两种长度在运行的过程中都可以获取,
- python的len方法可以获取运行时的已处理数据长度
- buflen可以获取数据总长度
示例如下:
class TestStrategy(bt.SignalStrategy):def __init__(self):passdef next(self):print("已经处理了%d个数据, 总共有%d个数据" % (len(self),self.data.buflen()))cerebro = bt.Cerebro()
cerebro.addstrategy(TestStrategy)data = btfeeds.GenericCSVData(dataname='stock_data.csv',fromdate=datetime(2011, 1, 1),todate=datetime(2012, 12, 31),nullvalue=0.0,dtformat=('%Y%m%d'),datetime=1,open=2,high=3,low=4, close=5,volume=9,openinterest=-1
)cerebro.adddata(data)
cerebro.run()
只复制了前7行输出:
已经处理了1个数据, 总共有468个数据
已经处理了2个数据, 总共有468个数据
已经处理了3个数据, 总共有468个数据
已经处理了4个数据, 总共有468个数据
已经处理了5个数据, 总共有468个数据
已经处理了6个数据, 总共有468个数据
已经处理了7个数据, 总共有468个数据
五,Lines和参数的继承机制
BackTrader提供了一种元语言来支持参数和lines的声明并且已努力使其与标准Python继承规则兼容。
参数的继承
- 支持多重继承
- 基类的参数被继承
- 如果多个基类定义相同的参数,则使用继承列表中最后一个类的默认值
- 如果在子类中重新定义了相同的参数,则新的默认值将取代基类的默认值
lines的继承
- 支持多重继承
- 所有基类的lines均被继承。 line被命名的情况下,如果在基类中被多次命名同一名称,则该line只会有一个版本
题外话
看过官方文档的小伙伴应该发现了,我的文章有的跟官方文档一致,有的又不一样。这算是我自己的风格吧,这个系列文章我是一边学习一边写的,是我学习的记录,所以我会把自己当时的理解写出来,包括例子也可能会用自己做的例子。官方文档里比较直白,好理解的,我可能会直接翻译引用一下。顺序和内容覆盖范围跟官方文档也不会一样,毕竟不是原文翻译,这样的方式可以比较自由轻松一点,但缺点就是可能错误也会多一些,所以欢迎大家就没看明白或有错误的地方跟我探讨!
量化回测框架Backtrader【3】-核心概念Lines相关推荐
- 量化回测框架Backtrader【2】-数据导入(附:Tushare介绍)
目录 一,通用参数 二,通用CSV格式数据导入 三,panda数据导入 四,导入扩展数据类别 量化回测的第一步就是导入数据,Backtrader中称这个为data feeds,支持多种数据导入方式 通 ...
- 手把手教你用Python搭建自己的量化回测框架【均值回归策略】
1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...
- 量化回测平台Backtrader实战-陆一潇-专题视频课程
量化回测平台Backtrader实战-240人已学习 课程介绍 课程通过学习Backtrader这一功能丰富的开源回测平台来逐步实现多个量化cta策略的回测实现.Backtrader是 ...
- 【python量化】国内外基于python开发的量化回测框架
文章目录 写在前面 Zipline PyAlgoTrade BackTrader Catalyst Vn.py 总结 写在前面 在进行量化策略开发时,必不可少的就是策略回测,虽然有很多量化回测平台如三 ...
- pyalgotrade量化回测框架简单试用
持续行动1期 40/100,"AI技术应用于量化投资研资"之可转债投资. 今天要讲一个量化的传统"科目"--回测. 很多人一提及量化,第一个想到的就是回测系统, ...
- python量化回测框架_股票量化交易回测框架pyalgotrade源码阅读(一)
PyAlgoTrade是什么呢? 一个股票量化交易的策略回测框架. 而作者的说明如下. To make it easy to backtest stock trading strategies. 简单 ...
- python量化策略源码_Python量化交易进阶讲堂-创建自定义量化回测框架
欢迎大家订阅<Python实战-构建基于股票的量化交易系统>小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,并且会有选择地收录至小册中,更便于广大读 ...
- 金融平台(掘金量化)量化PYTHON(二)-量化回测框架介绍
策略创建运行流程 1.创建运行策略 1.1创建策略 打开"掘金量化3.0"客户端,进入"我的策略"-"新建策略",如下所示: 平台本身提供了 ...
- 量化回测框架设计之交易篇(一)
背景介绍 目前回测中报单模式可分为普通限价下单.拆单限价下单(TWAP及VWAP)及智能优化下单(只限定报单量,由算法自动根据当前市场状态优化报单价格),普通限价下单主要用于普通的策略回测,拆单限价下 ...
最新文章
- 《python数据分析实战》第七章手写
- Git命令比较两个分支commit 差异
- SQL Server 2005异地备份
- hive 函数 Cube
- 2016年成功的Java开发人员简介
- 关于抢红包的_关于抢红包的话题800字作文
- jlink怎么调试linux程序_纯Linux下的 ARM裸机调试环境搭建(GDB + JLink)
- Asp.net mvc中使用配置Unity
- WebDAV, IIS, 和SharePoint之间的关系
- *计算机应用基础* 说课稿,中职计算机应用基础《EXCEL中函数的使用》说课稿.doc...
- 谷歌浏览器如何更改语言
- ECS Windows系统使用自带监视器查看IIS并发连接数
- 伟大时刻:小米的命门
- VMware Workstation Server 服务器启动报1075错误
- Java代码实现24点计算
- TM1620 LED 驱动控制 程序
- 关于培训机构~程序员培训
- 结合读取opml ,把数据链接到treeview
- Enterprise Architect 类关系对应解析
- 2021年全国大学生计算机能力挑战赛(Java)决赛试题代码(外加部分试题)
热门文章
- NodeMCU(ESP-12E)+阿里云实现数据上传和控制继电器开锁
- Hadoop教程免费视频 小象《Hadoop 2.X大数据平台V3》
- Docker入门知识|基本命令|数据卷|dockerfile|发布镜像|基本概念
- Activiti工作流与业务整合实战
- java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security polic
- 使用SQL语句UPDATE更新表数据
- 【图形设计】流程图和泳道图案例分享,教你用图示梳理流程思路
- mx4 pro 刷 原生 android,魅族MX4 Pro怎么刷机?通用刷机和固件升级教程
- shell脚本----正则表达式
- Adobe CS5 通用注册机