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
祝你好運!