随机改进关于Python的实例代码 – 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
策略的方法中,以下是买卖的逻辑决策。
... # 还没有......如果......我们可能会购买 if (self.ma1[0]-self.ma1[-1])/self.ma1[-1]>(self.ma2[0]-self.ma2[-1])/self.ma2[-1]: ...
和
... # 已经在市场上......我们可能会出售 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): ... # 还没有......如果......我们可能会购买 if self.buy_sig: ... ... # 已经在市场上......我们可能会出售 if self.sell_sig: ...
请注意,我们甚至不必使用self.buy_sig[0]
,因为布尔测试 makeif self.buy_sig
已经被backtrader 机器翻译为检查[0]
恕我直言,一种更简洁的方法,其中__init__
使用标准算术和逻辑运算(并使用行延迟符号 (-x)
)定义逻辑使代码更好。
在任何情况下,对于结束语,也可以尝试使用内置 PercentChange
指示器(又名PctChange
)
顾名思义,它确实已经计算了给定时间段内的百分比变化。中的代码__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
在这种情况下它并没有太大的区别,但是如果计算更大更复杂,它肯定可以为您省去很多麻烦。
评论被关闭。