時不時地,帶有 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
在這種情況下,它沒有太大的區別,但如果計算更大,更複雜,它肯定會為您節省很多麻煩。
祝您反向交易愉快!