时不时地,带有 backtrader 代码的示例会在互联网上弹出。在我看来,有几个是中国人。最新的一个在这里:
标题是: backtrader-学习笔记2,这显然(感谢谷歌)翻译成 backtrader- 学习笔记2。如果这些是学习笔记,让我们尝试改进那里的代码,在那里它真的可以改进,在我个人看来, backtrader 最闪耀的地方。
在__init__
研究笔记中的策略方法中,我们发现以下内容
def __init__(self): ... self.ma1 = bt.indicators.SMA(self.datas[0], period=self.p.period ) self.ma2 = bt.indicators.SMA(self.datas[1], period=self.p.period )
这里没什么可争论的(风格是非常个人化的东西,我不会碰那个)
而在next
策略的方法中,以下是买卖的逻辑决策。
... # Not yet ... we MIGHT BUY if ... if (self.ma1[0]-self.ma1[-1])/self.ma1[-1]>(self.ma2[0]-self.ma2[-1])/self.ma2[-1]: ...
和
... # Already in the market ... we might sell if (self.ma1[0]-self.ma1[-1])/self.ma1[-1]<=(self.ma2[0]-self.ma2[-1])/self.ma2[-1]: ...
这两个逻辑块实际上是可以做得更好的,这也将增加可读性,可维护性和调整(如果需要的话)
与其将移动平均线(当前点0
和上一点 -1
)进行比较,然后再进行一些划分,不如让我们看看如何为我们预先计算它。
让我们调整一下__init__
def __init__(self): ... # Let's create the moving averages as before ma1 = bt.ind.SMA(self.data0, period=self.p.period) ma2 = bt.ind.SMA(self.data1, period=self.p.period) # Use line delay notation (-x) to get a ref to the -1 point ma1_pct = ma1 / ma1(-1) - 1.0 # The ma1 percentage part ma2_pct = ma2 / ma2(-1) - 1.0 # The ma2 percentage part self.buy_sig = ma1_pct > ma2_pct # buy signal self.sell_sig = ma1_pct <= ma2_pct # sell signal
现在,我们可以将其带到该方法中next
,并运行以下操作:
def next(self): ... # Not yet ... we MIGHT BUY if ... if self.buy_sig: ... ... # Already in the market ... we might sell if self.sell_sig: ...
请注意,我们甚至不必使用self.buy_sig[0]
,因为布尔测试 make with if self.buy_sig
已经被 backtrader 机制转换为检查 [0]
恕我直言,这是一种更简洁的方法,其中使用标准算术和逻辑运算(并使用line延迟表示法(-x)
)定义__init__
逻辑,使代码变得更好。
无论如何,为了结束语,人们也可以尝试使用内置PercentChange
指针(又名 PctChange
)
请参见:backtrader文档 - 指针参考
顾名思义,它确实已经计算了给定柱线周期内的百分比变化。中的__init__
代码现在看起来像这样
def __init__(self): ... # Let's create the moving averages as before ma1 = bt.ind.SMA(self.data0, period=self.p.period) ma2 = bt.ind.SMA(self.data1, period=self.p.period) ma1_pct = bt.ind.PctChange(ma1, period=1) # The ma1 percentage part ma2_pct = bt.ind.PctChange(ma2, period=1) # The ma2 percentage part self.buy_sig = ma1_pct > ma2_pct # buy signal self.sell_sig = ma1_pct <= ma2_pct # sell signal
在这种情况下,它没有太大的区别,但如果计算更大,更复杂,它肯定会为您节省很多麻烦。
祝您反向交易愉快!