量化交易学习(十一)backtrader基本概念5

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

官方文档链接: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)的延迟索引

[]操作符用于在next回调中获取数据值。线(Lines)对象还支持在init阶段通过延迟索引的线对象来获取数据。

现在想象这样一个策略逻辑,我们想把前一天的收盘价与均线的实际值作比较。我们不用每次在next函数中手工计算,直接生成一个预先准备好的线对象就可以了:

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

def __init__(self):

self.movav = btind.SimpleMovingAverage(self.data, period=self.p.period)
self.cmpval = self.data.close(-1) > self.sma

def next(self):
if self.cmpval[0]:
print('Previous close is higher than the moving average')

在__init__函数中,线(Lines)对象使用(delay)的写法生成延迟索引的线对象副本:

  • self.data.close(-1)创建了一个close线延迟一天的副本
  • 在比较self.data.close(-1) > self.sma时又生成了另一个返回布尔值的线对象

线的耦合

()操作符可以像上面那样通过delay值生成一个延迟版本的线对象。如果在使用()操作符时不提供delay值,将返回一个LinesCoupler线对象。这用于建立起与操作不同时间范围数据指标的耦合关系。

不同时间范围的数据源有着不同的长度,对它们操作的指标会复制数据的长度。例如:

  • 日k线数据源一年有250根
  • 周k线数据源一年有52根

假如要比较两条以上面两个数据源为基础均线,直接进行比较就会失败,因为不知道如何将日线与周线数据进行匹配。

对于用户来说,可以通过想象进行日期比较以找出日与周的对应关系,但是:

  • 指标(Indicators)仅仅是数学公式,它不包含日期信息
  • 指标在计算时并不关心环境信息,只要有足够的数据就会进行计算

()操作符可以解决这个问题:

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

def __init__(self):

# data0是日线数据源
sma0 = btind.SMA(self.data0, period=15) # 15 days sma
# data1是周线数据源
sma1 = btind.SMA(self.data1, period=5) # 5 weeks sma

self.buysig = sma0 > sma1()

def next(self):
if self.buysig[0]:
print('daily sma is greater than weekly sma1')

这里较大的时间范围指标 sma1 通过 sma1() 与日线耦合。 这将复制 sma1 生成的值并返回一个与 sma0 兼容的对象,有效地将 52 个周线柱分散到 250 个日柱线中

江达小记