即使是次要版本,也有一些有趣的事情可能會為他們提供專門的博客文章。
linealias
Pull-Request #320包括指標RelativeMomentumIndex
(或RMI
),根據文獻,它是RSI
的演變,其中:
- 考慮回溯大於
1
的上升和下降週期
因此,與其讓指標重複RSI
的大部分功能,不如做兩件事:
擴展
RSI
(以及UpDay
和DownDay
等子指標,以支持大於 1 的回溯期RMI
然後可以實現為具有一些不同默認值的子類。RMI
指標線的邏輯名稱是rmi
,但RSI
已經決定名稱為rsi
。這可以通過添加一個名為linealias
的新功能來解決
RMI
實現如下所示:
class RelativeMomentumIndex(RSI): alias = ('RMI', ) linealias = (('rsi', 'rmi',),) # add an alias for this class rmi -> rsi plotlines = dict(rsi=dict(_name='rmi')) # change line plotting name
添加了來自基類的行rsi
的別名,名稱為rmi
。如果有人想創建一個子類並使用名稱rmi
現在是可能的。
此外, rsi
線的繪圖名稱也更改為rmi
。另一種實現是可能的:
class RelativeMomentumIndex(RSI): alias = ('RMI', ) linesoverrride = True # allow redefinition of the lines hierarcy lines = ('rmi',) # define the line linealias = (('rmi', 'rsi',),) # add an alias for base class rsi -> rmi
這裡不再考慮來自RSI
的現有層次結構,並且使用lines
來定義唯一名為rmi
的行。不需要定義繪圖名稱,因為現在唯一的行具有預期的名稱。
但是基類將無法填充這些值,因為它期望名稱為rsi
的行就位。因此添加了一個反向別名來讓它找到line 。
盈透證券優化
沒有預見到使用與 Interactive Brokers 的實時連接作為優化的數據源。然而,一位用戶嘗試了它並開始遇到起搏違規行為。原因是盈透證券數據饋送將自己標記為live
饋送,從而允許系統繞過某些事情,例如數據預加載。
在沒有預加載的情況下,每個優化實例都會重新嘗試從盈透證券重新下載相同的歷史數據。考慮到這一點,很明顯,Feed 可以查看用戶是否僅請求歷史下載,在這種情況下不報告自己為live
,從而允許平台預加載數據並在優化實例之間共享它。
請參閱社區線程。使用 IBStore 進行優化會導致冗餘連接/下載
Heikin-Ashi 燭台
另一個社區線程正在尋求開發 Heikin-Ashi 燭台作為指標:開發 Heikinashi 指標,面臨遞歸定義的一些問題,因為需要種子值,這可以在指標的prenext
階段完成。
作為傳統燭台的一種有趣的顯示替代品,它已作為過濾器實現,它允許修改數據源以真正提供 Heikin-Ashi 燭台。像這樣:
data0 = MyDataFeed(dataname='xxx', timeframe=bt.TimeFrame.Days, compression=1) data0.addfilter(bt.filters.HeikinAshi) cerebro.adddata(data0)
任何人都可以使用以下代碼快速比較蠟燭:
data0 = MyDataFeed(dataname='xxx', timeframe=bt.TimeFrame.Days, compression=1) cerebro.adddata(data0) data1 = data0.clone() data1.addfilter(bt.filters.HeikinAshi) cerebro.adddata(data1)
要繪製蠟燭圖,請記住:
cerebro.plot(style='candle')
使用來源中 2005 年和 2006 年的每日樣本數據。
並放大一點以更好地了解差異
允許次要角色重新縮放 y 軸
數據源的軸一直使用主數據源作為比例所有者,因為數據始終是視圖中最重要的部分。例如,如果我們考慮BollingerBands
,則頂部波段可能遠離數據的最大值,並且允許該波段重新縮放圖表,將減少圖表中數據佔用的大小,這將不希望。
現在可以使用plotylimited
控制行為,如下所示:
... data0 = MyDataFeed(dataname='xxx', timeframe=bt.TimeFrame.Days, compression=1) data0.plotinfo.plotlog = False # allow other actors to resize the axis ...
在下圖中,底部的數據饋送用plotylimited= False
繪製。布林帶並沒有脫離圖表,因為它們有助於縮放並且一切都適合圖表。
社區中也對此進行了評論。如何設置最大 - 最小繪圖邊界?
半對數圖(又名對數)
現在可以使用半對數刻度(y 刻度)繪製單個軸。例如:
... data0 = MyDataFeed(dataname='xxx', timeframe=bt.TimeFrame.Days, compression=1) data0.plotinfo.plotlog = True data0.plotinfo.plotylimited = True cerebro.adddata(data0) ...
這意味著由該數據饋送控制的用於繪圖的軸將使用對數刻度,但其他軸不會,因此
繪製在數據上的移動平均線也將使用該比例繪製
隨機指標(位於不同的軸並具有不同的比例)仍將線性繪製
筆記
請注意,使用了plotylimited= True
。這是為了讓matplotlib
正確計算對數圖表的限制(因為刻度是 10 的冪)以將事物放入圖表中。
一個簡單地比較雅虎長期數據的樣本。
允許 plotmaster 指向自己
在同一軸上繪製多個數據饋送已經是可能的,但是一個小麻煩不允許乾淨的循環來設置plotinfo.plotmaster
值。之前必須完成以下工作:
mydatas = [] data = MyDataFeed(dataname=mytickers[0], timeframe=..., compression=...) mydatafeeds.append(data) for ticker in mytickers[1:] data = MyDataFeed(dataname=ticker, timeframe=..., compression=...) mydatafeeds.append(data) data.plotinfo.plotmaster = mydatas[0]
現在可以使用這個更清潔的循環:
mydatas = [] for ticker in mytickers: data = MyDataFeed(dataname=ticker, timeframe=..., compression=...) mydatafeeds.append(data) data.plotinfo.plotmaster = mydatas[0]
並且dnames
被記錄在案
按名稱引用數據饋送已經可用,但它已跳過將其寫入文檔,因此它是一個隱藏的寶石。策略中的dnames
屬性支持點表示法和 [] 表示法(它實際上是一個dict
子類)。如果我們首先添加一些數據提要:
mytickers = ['YHOO', 'IBM', 'AAPL'] for t in mytickers: d = bt.feeds.YahooFinanceData(dataname=t, fromdate=..., name=t.lower())
稍後在策略中可以執行以下操作:
def __init__(self): yhoosma = bt.ind.SMA(self.dnames.yhoo, period=20) aaplsma = bt.ind.SMA(self.dnames['aapl'], period=30) # or even go over the keys/items/values like in a regular dict # for example with a dictionary comprehension stocs = {name: bt.ind.Stochastic(data) for name, data in self.dnames.items()}
結論
一個帶有小改動的小版本,增加了一些漂亮的功能。