量化交易学习(五)backtrader基本概念2
今天这篇是backtrader文档的学习笔记。主要介绍了线(Lines)的概念。
官方文档链接:https://www.backtrader.com/docu/concepts
文中例子中的代码都需要导入以下库:
1 | # 导入backtrader |
线(Lines)
基本上backtrader里所有的对象都支持线(Lines)。在用户的视角来看,这意味着:线可以保存一个或多个线序列,一个线序列数组中的值如果放在一张图表中,它们就会形成一条线。
线(或线系列)的一个很好的例子是由股票收盘价形成的线。
在策略中我们一般中关注对线的访问:
1 | class MyStrategy(bt.Strategy): |
例子中有两个对象包含了线:
- self.data有一个含有close属性的lines属性
- self.movav是一个SimpleMovingAverage指标,它有一个含有sma属性的lines属性
从这里可以看出,lines是有名字的,它们也可以按定义的顺序被访问,但这只能在指标的开发中这样用。
名为close和sma的这两条线,都可以被查询获取数据点(以0为索引)来比较值。
可以用简化写法来访问线:
-
xxx.lines可以被简化为xxx.l
-
xxx.lines.name可以被简化为xxxx.lines_name
-
像策略或指标这样的复杂对象支持快速访问线:
- self.data_name支持直接访问self.data.lines.name
- 带序号的data变量也支持这样:self.data1_name -> self.data1.lines.name
此外线名也可以被直接访问:
-
self.data.close及self.movav.sma
但如果线已经被访问了,这样的写法不如前面那种清晰
注意:后两种写法不支持对线进行设置和赋值
线的声明
在开发指标时,指标所用的线必被声明。
就像参数那样作为类的属性,不过对于线只能用元组来声明。不支持字典,因为字典是无序的。
对于SMA指标,像这样写:
1 | class SimpleMovingAverage(Indicator): |
注意:在元组声明中,如果你只传入一个字符串,最后的逗号是必须的,不然python不会识别为元组
例子中,在指标类里定义了一个sma线,它能被策略的逻辑使用(或被其他指标使用来构建更复杂的指标)
在开发指标时,有时以序号方式访问更方便:
- self.lines[0]指向self.lines.sma
如果定义了更多的线,可以通过索引1,2等来访问
当然,也支持简化的写法:
- self.line指向self.lines[0]
- self.lineX指向self.lines[X]
- self.line_X指向self.lines[X]
数据源中的线也支持简写:
- self.dataY 指向 self.data.lines[Y]
- self.dataX_Y 指向 self.dataX.lines[Y]
访问数据源中的线
访问数据源中的lines时,也可忽略lines。这在使用时更自然。
data = btfeeds.BacktraderCSVData(dataname='mydata.csv')
...
class MyStrategy(bt.Strategy):
...
def next(self):
if self.data.close[0] > 30.0:
...
if self.data.close[0] > 30.0: 的写法比 if self.data.lines.close[0] > 30.0: 更自然。不过在指标中这能这样写:
- 指标中有一个属性也叫close,用于保存中间计算结果,随后会把结果交付给名为close的lines。
在数据源中,不会发生计算,因为它仅仅是用来提供数据。
这一篇就到这里啦。欢迎大家点赞、转发、私信。