目录

一,什么是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相关推荐

  1. 量化回测框架Backtrader【2】-数据导入(附:Tushare介绍)

    目录 一,通用参数 二,通用CSV格式数据导入 三,panda数据导入 四,导入扩展数据类别 量化回测的第一步就是导入数据,Backtrader中称这个为data feeds,支持多种数据导入方式 通 ...

  2. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...

  3. 量化回测平台Backtrader实战-陆一潇-专题视频课程

    量化回测平台Backtrader实战-240人已学习 课程介绍         课程通过学习Backtrader这一功能丰富的开源回测平台来逐步实现多个量化cta策略的回测实现.Backtrader是 ...

  4. 【python量化】国内外基于python开发的量化回测框架

    文章目录 写在前面 Zipline PyAlgoTrade BackTrader Catalyst Vn.py 总结 写在前面 在进行量化策略开发时,必不可少的就是策略回测,虽然有很多量化回测平台如三 ...

  5. pyalgotrade量化回测框架简单试用

    持续行动1期 40/100,"AI技术应用于量化投资研资"之可转债投资. 今天要讲一个量化的传统"科目"--回测. 很多人一提及量化,第一个想到的就是回测系统, ...

  6. python量化回测框架_股票量化交易回测框架pyalgotrade源码阅读(一)

    PyAlgoTrade是什么呢? 一个股票量化交易的策略回测框架. 而作者的说明如下. To make it easy to backtest stock trading strategies. 简单 ...

  7. python量化策略源码_Python量化交易进阶讲堂-创建自定义量化回测框架

    欢迎大家订阅<Python实战-构建基于股票的量化交易系统>小册子,小册子会陆续推出与小册内容相关的专栏文章,对涉及到的知识点进行更全面的扩展介绍,并且会有选择地收录至小册中,更便于广大读 ...

  8. 金融平台(掘金量化)量化PYTHON(二)-量化回测框架介绍

    策略创建运行流程 1.创建运行策略 1.1创建策略 打开"掘金量化3.0"客户端,进入"我的策略"-"新建策略",如下所示: 平台本身提供了 ...

  9. 量化回测框架设计之交易篇(一)

    背景介绍 目前回测中报单模式可分为普通限价下单.拆单限价下单(TWAP及VWAP)及智能优化下单(只限定报单量,由算法自动根据当前市场状态优化报单价格),普通限价下单主要用于普通的策略回测,拆单限价下 ...

最新文章

  1. 《python数据分析实战》第七章手写
  2. Git命令比较两个分支commit 差异
  3. SQL Server 2005异地备份
  4. hive 函数 Cube
  5. 2016年成功的Java开发人员简介
  6. 关于抢红包的_关于抢红包的话题800字作文
  7. jlink怎么调试linux程序_纯Linux下的 ARM裸机调试环境搭建(GDB + JLink)
  8. Asp.net mvc中使用配置Unity
  9. WebDAV, IIS, 和SharePoint之间的关系
  10. *计算机应用基础* 说课稿,中职计算机应用基础《EXCEL中函数的使用》说课稿.doc...
  11. 谷歌浏览器如何更改语言
  12. ECS Windows系统使用自带监视器查看IIS并发连接数
  13. 伟大时刻:小米的命门
  14. VMware Workstation Server 服务器启动报1075错误
  15. Java代码实现24点计算
  16. TM1620 LED 驱动控制 程序
  17. 关于培训机构~程序员培训
  18. 结合读取opml ,把数据链接到treeview
  19. Enterprise Architect 类关系对应解析
  20. 2021年全国大学生计算机能力挑战赛(Java)决赛试题代码(外加部分试题)

热门文章

  1. NodeMCU(ESP-12E)+阿里云实现数据上传和控制继电器开锁
  2. Hadoop教程免费视频 小象《Hadoop 2.X大数据平台V3》
  3. Docker入门知识|基本命令|数据卷|dockerfile|发布镜像|基本概念
  4. Activiti工作流与业务整合实战
  5. java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security polic
  6. 使用SQL语句UPDATE更新表数据
  7. 【图形设计】流程图和泳道图案例分享,教你用图示梳理流程思路
  8. mx4 pro 刷 原生 android,魅族MX4 Pro怎么刷机?通用刷机和固件升级教程
  9. shell脚本----正则表达式
  10. Adobe CS5 通用注册机