量化交易学习(五)backtrader基本概念2

今天这篇是backtrader文档的学习笔记。主要介绍了线(Lines)的概念。

官方文档链接:https://www.backtrader.com/docu/concepts

文中例子中的代码都需要导入以下库:

1
2
3
4
5
6
# 导入backtrader
import backtrader as bt
# 导入指标库
import backtrader.indicators as btind
# 导入数据源库
import backtrader.feeds as btfeeds

线(Lines)

基本上backtrader里所有的对象都支持线(Lines)。在用户的视角来看,这意味着:线可以保存一个或多个线序列,一个线序列数组中的值如果放在一张图表中,它们就会形成一条线。

线(或线系列)的一个很好的例子是由股票收盘价形成的线。

在策略中我们一般中关注对线的访问:

1
2
3
4
5
6
7
8
9
10
class MyStrategy(bt.Strategy):
params = dict(period=20)

def __init__(self):

self.movav = btind.SimpleMovingAverage(self.data, period=self.p.period)

def next(self):
if self.movav.lines.sma[0] > self.data.lines.close[0]:
print('均线比收盘价大')

例子中有两个对象包含了线:

  • 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
2
3
class SimpleMovingAverage(Indicator):
lines = ('sma',)
...

注意:在元组声明中,如果你只传入一个字符串,最后的逗号是必须的,不然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。

在数据源中,不会发生计算,因为它仅仅是用来提供数据。

这一篇就到这里啦。欢迎大家点赞、转发、私信。

江达小记