随机改进关于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
在这种情况下它并没有太大的区别,但是如果计算更大更复杂,它肯定可以为您省去很多麻烦。
评论被关闭。