backtrader的最初目標之一是:
- 能夠快速製作指標原型以測試新想法
它不一定是一個完美的指標,但能夠快速輕鬆地開發它們確實會有所幫助。為了確認設計是正確的,反向交易者標準庫中的第一個指標是指數移動平均線(又名 EMA),其定義為:遞歸。
筆記
瑣事:正如您想像的那樣,第一個指標是 SimpleMovingAverage
由於如何開發遞歸指標的問題已發佈在反向交易者社區中,讓我們開發一個快速的ExponentialMovingAverage指標。
遞歸指標,如
- 它使用先前的值來計算當前值
例如,您可以在Wikipedia - Exponential Moving Average中查看數學
如果您有足夠的勇氣閱讀所有內容,您就會發現該週期是用來計算指數平滑的。我們會使用它。
為了解決計算第一個值的難題,行業決定使用前一period值的簡單平均值。
作為槓桿,我們將使用bt.indicators.PeriodN :
已經定義了一個
period參數通知框架最終用戶使用的實際
period
參見其定義: Docs - Indicator Reference
然後讓我們開發我們的EMA
import backtrader as bt
class EMA(bt.indicators.PeriodN):
params = {'period': 30} # even if defined, we can redefine the default value
lines = ('ema',) # our output line
def __init__(self):
self.alpha = 2.0 / (1.0 + self.p.period) # period -> exp smoothing factor
def nextstart(self): # calculate here the seed value
self.lines.ema[0] = sum(self.data.get(size=self.p.period)) / self.p.period
def next(self):
ema1 = self.lines.ema[-1] # previous EMA value
self.lines.ema[0] = ema1 * (1.0 - self.alpha) + self.data[0] * self.alpha
做起來幾乎比說的容易。關鍵是在nextstart中提供種子值,其中
當達到指標的最短預熱期時,將調用一次。
與
next不同,它將為傳遞到系統中的每個新數據值調用
nextstart的默認實現只是將任務委託給next ,對於大多數指標(例如簡單移動平均線)來說,這是正確的做法。但在這種情況下,覆蓋和提供種子值是關鍵。
沿著數據繪製
作為移動平均線,如果指標繪製在與其計算平均值的數據相同的軸上,那就太好了。因為我們繼承自PeriodN ,所以繪圖的默認值是(參見文檔):
subplot=True
這當然意味著將為我們的指標創建一個subplot (圖表上的另一個軸)。這很容易被覆蓋。
import backtrader as bt
class EMA(bt.indicators.PeriodN):
plot = dict(subplot=False)
並做了。如果您想控制更多繪圖選項,請查看Docs - Plotting
祝你好運!