Backtrader Python隐藏的细节

  |  

只有當遇到 backtrader 的真實使用者時,人們才能意識到平臺中使用的抽象和Python功能是否有意義。

在不撇開python的座右銘的情況下, backtrader 試圖為使用者提供盡可能多的控制權,同時通過將Python提供的隱藏功能付諸行動來簡化使用。

第一個示例是系列文章的第一篇。

它是一個陣列還是它是什麼?

一個非常簡單的例子:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):

        self.hi_lo_avg = (self.data.high + self.data.low) / 2.0

    def next(self):
        if self.hi_lo_avg[0] > another_value:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

其中一個非常迅速彈出的問題是:

  • 不能也使用期間[]__init__?。

提出問題是因為用戶已經嘗試過,Python已停止運行,但出現異常。

答案是:

  • 不。在 [] 初始化期間不使用。

接下來的問題是:

  • 那麼,如果它不是陣列,那麼在期間__init__實際存儲self.hi_lo_avg了什麼呢?

對於程式師來說,答案並不令人費解,但對於使用Python的演算法交易者來說,答案可能很令人困惑。

  • 它是一個懶惰評估的物件,它將在階段(cerebro.run即:在策略的方法中next)通過[]運算元計算和傳遞值。

綜述:在該方法中next ,陣列索引運算子 [] 將允許您訪問過去和當前時間時刻的計算值。

秘訣就在醬汁中

操作員覆蓋是真正的調味料。讓我們分解一下 high-low- 平均值的計算:

self.hi_lo_avg = (self.data.high + self.data.low) / 2.0

元件:

  • self.data.high並且self.data.low本身就是物件(backtrader命名方案中的lines

在許多情況下,它們被錯誤地視為純數位,但事實並非如此。它們成為物件的原因:

  • 0backtrader實施索引-1計劃和索引計劃

  • 控制緩衝區大小調整和連結到其他物件

在這種情況下,最重要的方面是:

  • 重寫運算子以返回物件

這就是為什麼下面的操作返回一個 lines 物件。讓我們開始:

temp = self.data.high - self.data.low

然後,將臨時物件除以2.0 成員變數並將其分配給成員變數:

self.hi_lo_avg = temp / 2.0

這將再次返回另一個 lines 物件。因為運算子重寫不僅適用於直接在 lines 對象之間執行的操作,還適用於例如,像這種除法這樣的算術運算。

這意味著 具有self.hi_lo_avglines 物件的引用。此物件在 next 策略方法中很有用,或者作為指標或其他計算的輸入。

邏輯運算符示例

上面的範例在 中__init__使用了算術運算子和邏輯操作器的組合[0]> next

由於運算子重寫不僅限於算術,因此讓我們再舉一個示例,在組合中添加一個指標。第一次嘗試是:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):
        self.hi_lo_avg = (self.data.high + self.data.low) / 2.0
        self.sma = bt.indicators.SMA(period=30)

    def next(self):
        if self.hi_lo_avg[0] > self.sma[0]:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

但是在這種情況下,只需從another_value 更改為 self.sma[0]。讓我們改進它:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):
        self.hi_lo_avg = (self.data.high + self.data.low) / 2.0
        self.sma = bt.indicators.SMA(period=30)

    def next(self):
        if self.hi_lo_avg > self.sma:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

一個給好人。運算子覆蓋也確實有效next ,用戶實際上可以刪除 [0] 並直接比較物件。

如果所有這一切都是真正可能的,那實際上似乎有點過分了。但好消息是還有更多。請參閱此範例:

import backtrader as bt

class MyStrategy(bt.Strategy):

    def __init__(self):
        hi_lo_avg = (self.data.high + self.data.low) / 2.0
        sma = bt.indicators.SMA(period=30)
        self.signal = hi_lo_avg > sma

    def next(self):
        if self.signal:
            print('we have a winner!')

...
...
cerebro.addstrategy(MyStrategy)
cerebro.run()

我們做了兩件事:

  1. 創建一個名為 lines 物件,該物件self.signalhigh-low- 平均值與簡單移動平均值的值進行比較

    如上所述,當計算出此物件時,此物件在next

  2. 在檢查 if signal True時刪除 in next 的使用[0]。這是可能的,因為布爾運算也覆蓋了運算符

結論

希望這能為執行__init__ 操作時實際發生的情況以及運算元重寫的實際發生方式增加一些線索。

推薦閱讀

相關文章

Backtrader按日線交易

似乎在世界某個地方有一種权益(Interest)可以總結如下: 使用每日柱線引入訂單,但使用開盤價 這來自工單#105订单执行逻辑与当前数据和#101动态投注计算中的對話 backtrader 嘗試盡可能保持現實,並且在處理每日柱線時適用以下前提: 當每日柱被評估時,柱線已經結束 這是有道理的,

Backtrader教程:經紀人 - 開倉作弊

“發佈”1.9.44.116 添加了對 Cheat-On-Open的支援。這似乎是那些全力以赴的人的需求功能,他們在酒吧 close 后進行了計算,但希望與 open 價格相匹配。 當開盤價跳空(上漲或下跌,取決於是否buysell有效)並且現金不足以進行全面運營時,這樣的用例就會失敗。這將強制代理拒絕該操作。

Backtrader教程:數據饋送 - 展期交割

並非每個供應商都為可以交易的工具提供連續的未來。有時提供的數據是仍然有效的到期日期的數據,即:仍在交易的日期 這在回溯測試方面並不是很有幫助,因為數據分散在幾個不同的儀器上,這些儀器另外...時間重疊。 能夠正確地將這些儀器的數據從過去連接到連續的流中,可以減輕疼痛。

Backtrader迪克森移動平均線

下面的reddit帖子以自己的作者Nathan Dickson(reddit句柄)命名了這個平均值Dickson移動平均線。 在一次對reddit Algotrading 的定期訪問中,我發現了一篇關於移動平均線的帖子,該移動平均線試圖模仿Jurik移動平均線(又名JMA)。

Backtrader教程:過濾器 - 參考

工作階段篩檢程式 類 backtrader.filters。

Backtrader智慧質押

版本 1.6.4.93 標誌著 backtrader 的一個重要里程碑,即使版本號的更改很小。 職位大小調整是閱讀Van K. Tharp的《Trade Your Way To Financial Freedom 》後,為這個專案奠定基礎的事情之一。

Backtrader教程:日期時間 - 管理

在 1.5.0 版之前, backtrader 使用直接的方法來進行時間管理,因為數據源計算的任何日期時間都只是按面值使用。 對於任何使用者輸入也是如此,例如可以提供給任何數據源的參數fromdate (或 sessionstart)的情況 考慮到直接控制凍結的數據源以進行回溯測試,這種方法很好。

Backtrader卡爾曼等

注意 對以下指令的支援從提交開始 發佈1.9.30.x 將是包含它的第1個版本 。 backtrader的原始目標之一是成為純python,即:僅使用標準發行版中可用的軟體包。只有一個例外是matplotlib在沒有重新發明輪子的情況下進行繪圖。

Backtrader教程:數據饋送 - 熊貓

注意 pandas 並且必須安裝其依賴項 支援Pandas Dataframes似乎受到很多人的關注,他們依賴於已經可用的解析代碼來分析不同的數據源(包括CSV)和Pandas提供的其他功能。 數據饋送的重要聲明。 注意 這些只是 聲明。不要盲目複製此代碼。

Backtrader信貸利息

在某些情況下,真實經紀人的現金金額可能會減少,因為資產操作包括利率。例子: 賣空股票 交易所買賣基金包括多頭和空頭 這意味著不僅交易構成了系統的盈利能力,因為信貸上的利息在帳戶上佔有一席之地。 為了涵蓋這種情況, backtrader 包括(從發佈1.8.8.96開始)功能來考慮這一點。