Backtrader發布 1.9.51.121

  |  

即使是次要版本,也有一些有趣的事情可能會為他們提供專門的博客文章。

linealias

Pull-Request #320包括指標RelativeMomentumIndex (或RMI ),根據文獻,它是RSI的演變,其中:

  • 考慮回溯大於1的上升和下降週期

因此,與其讓指標重複RSI的大部分功能,不如做兩件事:

  1. 擴展RSI (以及UpDayDownDay等子指標,以支持大於 1 的回溯期RMI然後可以實現為具有一些不同默認值的子類。

  2. 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()}

結論

一個帶有小改動的小版本,增加了一些漂亮的功能。

推薦閱讀

相關文章

Backtrader向 OHLC 提供買入價/賣出價數據

最近,backtrader通過實現line覆蓋來執行從 ohlc-land 逃逸,這允許重新定義整個層次結構,例如,具有僅具有 bid,ask 和 datetime lines的data feeds。

Backtrader 教程:訂單 - OCO

版本1.9.34.116將OCO (又名 One Cancel Others)添加到回測庫中。筆記這僅在回測中實現,還沒有針對實時經紀人的實現筆記更新為1.9.36.116版本。盈透證券支持StopTrail 、 StopTrailLimit和OCO 。

BacktraderOCO訂單

Release1.9.34.116 將 OCO (又名One Cancel Others)添加到回溯測試武器庫中。 注意 這僅在回溯測試中實現,並且還沒有針對即時代理的實現 注意 隨版本1.9.36.116更新。盈透證券支援 StopTrail和 StopTrailLimit OCO。

Backtrader股票篩選

在尋找其他一些東西時,我在StackOverlow家族網站之一上遇到了一個問題:Quantitative Finance aka Quant StackExchange。問題: 它被標記為Python,因此值得一看的是 backtrader 是否能夠勝任這項任務。 分析儀本身 該問題似乎適合用於簡單的分析器。

Backtrader回溯

在一些關於改進的ShapeRatio的提示之後, backtrader 已將此分析儀添加到其武器庫中。 文獻位於: 從對數回報的好處開始,並遵循在SharpeRatio方程的分母中具有標準偏差的副作用,本文檔開發了該分析儀的公式和期望。

Backtrader Python隐藏的细节

只有當遇到 backtrader 的真實使用者時,人們才能意識到平臺中使用的抽象和Python功能是否有意義。 在不撇開python的座右銘的情況下, backtrader 試圖為使用者提供盡可能多的控制權,同時通過將Python提供的隱藏功能付諸行動來簡化使用。 第一個示例是系列文章的第一篇。

Backtrader 教程:數據饋送 - 開發 - CSV

backtrader已經提供了通用 CSV數據提要和一些特定的 CSV數據提要。

Backtrader 教程:指標 - 時間框架混合

版本 1.3.0.92提供了混合來自不同時間範圍的數據(來自數據饋送和/或指標)的可能性。背景:指標是智能的啞對象。他們很聰明,因為他們可以進行複雜的計算。他們是愚蠢的,因為他們在不知道哪些來源為計算提供數據的情況下進行操作像這樣:如果提供值的數據源在Cerebro引擎內具有不同的時間範圍、不同的長度,則指標將中斷。

Backtrader現實咬合

上一篇文章設法複製了該BTFD 策略,發現真正的收益 16x 而不是 31x。 但正如複製期間所指出的: 不收取傭金 使用2x 槓桿不收取利息 這就提出了一個顯而易見的問題: 當收取傭金和利息時,這16x中有多少會存在? 幸運的是,前面的示例足夠靈活,可以對其進行試驗。

Backtrader 教程:訂單 - 目標訂單

在1.8.10.96版本之前,可以使用反向交易者通過策略方法進行智能質押: buy和sell 。這一切都是為了在負責賭注大小的等式中添加一個Sizer 。 Sizer不能做的是決定操作是買入還是賣出。這意味著需要一個新概念,在其中添加一個小的智能層來做出這樣的決定。