量化交易学习(十七)backtrader基本概念6
今天这篇是backtrader文档的学习笔记。主要介绍了backtrader中的运算符重载。
官方文档链接:https://www.backtrader.com/docu/concepts
例子中的代码都需要导入以下库:
1 | # 导入backtrader |
自然地使用运算符
为了实现“易用性”的目标,backtrader支持在python的语法限制范围内使用运算符。运算符可以在两个阶段中使用。
阶段1——使用运算符创建对象
在指标和策略等对象的初始化阶段(__init__
方法),运算符能够创建可以被操作、被赋值或保留作为参考的以供以后在策略逻辑的评估阶段使用的对象。
下面以一个简单移动平均线的代码实现,来说明怎么在指标构建时使用运算符:
指标的 __init__
函数如下:
1 | def __init__(self): |
下面是一个更完整的策略初始化时的例子:
1 | class MyStrategy(bt.Strategy): |
在上述运算完成后,sell_sig 会变成一个 Lines 对象,随后可以在策略的逻辑中使用,以作为是否满足卖出条件的信号线。
阶段2 - Operators true to nature
在策略类中有一个next方法,系统在处理每个k线柱时都会调用该方法。这就是运算符处于第二阶段模式的地方。基于前面的示例:
1 | class MyStrategy(bt.Strategy): |
这不是一个非常实用的策略,仅作为一个例子。在第二阶段,操作符会返回预期的值(比较真假时返回布尔值,与浮点数比较时返回浮点数),算术运算也一样。
注意:
在比较时没有使用 [] 操作符。这是为了进一步简化操作。
if self.sma > 30.0: 将self.sma[0]与30.0进行比较(第一条线的当前值)。
if self.sma > self.data.close:将self.sma[0]与self.data.close[0]进行比较。
一些不可重载的运算符/函数
Python不支持重载所有的东西,因此backtrader提供了一些函数来处理无法重载的情况
注意
仅适用于第一阶段,用于创建稍后提供值的对象。
运算符:
- and -> And
- or -> Or
逻辑控制:
- if -> If
函数:
- any -> Any
- all -> All
- cmp -> Cmp
- max -> Max
- min -> Min
- sum -> Sum
- Sum 实际上在底层使用 math.fsum ,因为平台使用浮点数,使用常规的sum 可能会对精度产生影响。
- reduce -> Reduce
这些运算符/函数可以对可迭代对象进行操作。可迭代对象中的元素可以是常规的 Python 数字类型(整数、浮点数……),也可以是Lines 对象。
一个生成非常愚蠢的买入信号的示例:
1 | class MyStrategy(bt.Strategy): |
很明显,如果sma1比最高价高,那么它一定比收盘价高。这里仅仅用来解释bt.And的使用
下面是一个使用bt.If的例子:
1 | class MyStrategy(bt.Strategy): |
详细解释下上面的代码:
- 首先生成一条周期为15的均线sma1
- 之后使用bt.If判断如果sma1的值比close高则返回low否则返回high
- 注意,在调用bt.If时不会返回实际值,它返回一个线对象,就像SimpleMovingAverage那样
- 在之后策略运行时才计算实际值
- 最后,通过bt.If生成的线对象被作为btind.SMA的输入,计算出另一条均线sma2
除线对象外,这些函数也能用于数值。对上面的例子稍加修改:
1 | class MyStrategy(bt.Strategy): |
现在,第二条移动平均线使用30.0或high的价格来执行计算,具体取决于sma与close比较结果。
注意
值30在内部会被转换成一条永远返回30的假的可迭代对象。