运算符

运算符 #

Backtrader 中,运算符不仅用于常规的数学运算,还能构建复杂的策略逻辑。Backtrader 的自定义运算符让策略的数学和逻辑运算更自然和简洁。

如何使用运算符 #

backtrader 支持基于运算符创建新的对象,如在 __init__ 中通过运算符计算多个指标,得到一个新的操作对象。

class MyStrategy(bt.Strategy):
   def __init__(self):
       sma = btind.SimpleMovingAverage(self.data, period=20)

       # 使用运算符创建新的逻辑对象
       close_over_sma = self.data.close > sma
       sma_dist_to_high = self.data.high - sma
       sma_dist_small = sma_dist_to_high < 3.5

       # 创建卖出信号
       self.sell_sig = bt.And(close_over_sma, sma_dist_small)

我们在 Line 对象上使用了常规的运算符,如加减乘除、大小比较等。这简化了策略代码,增强了策略逻辑的可读性和可维护性。

注:backtrader 的指标计算是自有的体系,不是基于 numpypandas,所以要单独实现这些运算符。


一些未覆盖的运算符/函数 #

某些 Python 中的运算符没有被覆盖,backtrader 提供了专门的函数来模拟逻辑运算,如 bt.Andbt.Or 来实现逻辑 “与” 和 “或”。

下面把这些单独实现的运算符列出来看看吧。

逻辑运算符 #

Python 中的 andor 运算符无法在 Backtrader 中覆盖,backtradr 提供了 bt.Andbt.Or 来模拟这两个逻辑操作。

self.buy_sig = bt.And(self.data.close > self.sma, self.data.high < 50.0)
self.sell_sig = bt.Or(self.data.close < self.sma, self.data.low > 30.0)

数学函数 #

Backtrader 也提供了替代 Python 标准库函数的方式,如 maxmin 被替代为 bt.Maxbt.Min。这些函数可用于处理 Line 对象:

highest = bt.Max(self.data.high, period=20)  # 获取过去20个周期的最高价
lowest = bt.Min(self.data.low, period=20)    # 获取过去20个周期的最低价

使用 bt.If 模拟条件分支 #

如果要按条件选择值,Backtrader 提供了 bt.If 来模拟条件分支。bt.If 的功能类似于 Python 中的三元运算符 x if condition else y,或者说是 numpywhere 函数。

class MyStrategy(bt.Strategy):
   def __init__(self):
       sma1 = btind.SMA(self.data.close, period=15)
       
       # 使用 bt.If 来根据条件选择价格
       high_or_low = bt.If(sma1 > self.data.close, self.data.low, self.data.high)
       sma2 = btind.SMA(high_or_low, period=15)  # 使用选中的值计算新的简单移动平均线

其他函数 #

类似的,any 被替换为 bt.Anyall 被替换为 bt.Allsum 被替换为 bt.Sumcmp 被替换为 bt.Cmp,还有 reduce 被替换为 bt.Reduce

这些函数都可用于处理可迭代对象,与 Line 对象兼容。

sum_values = bt.Sum(self.data.close, period=10)  # 计算过去10个周期的收盘价总和