經過 backtrader 微調(因為它已經運行了一段時間),我決定不僅通過GitHub分享它,還告訴世界它在那裡,並在“Reddit”中發佈它的存在。
在評論了為什麼交易/演算法交易平臺會彈出,以及關於支持許多同時交易的即時交易的平臺的私人問題之後,我得出的結論是,我自己的孩子應該擁有自己的博客。
我們來了。但讓我們專注於業務。
backtrader
旨在讓我快速嘗試一些想法,並檢查我的眼睛可能告訴我這可能是一個機會。
backtrader
(現在)完全是關於回溯測試的,還沒有連接到任何即時交易平臺,甚至可能沒有(儘管我相信技術實現會允許它)
當我使用「嘗試想法」這個表達時,我的意思是兩件事:
-
能夠快速起草指標並能夠直觀地評估其行為
-
無論是這種情況,都可以圍繞該指標或與他人的組合制定潛在的戰略。
我的個人交易是100%判斷性的,因為自動化系統不會做出任何一個決定。但我看看指標有什麼要說明的。無論這些「跡象」是否真的是一個信號,它都留給了我錯誤的人類思維。
但是讓我們來試試吧。在Reddit上發佈了第一 次之後,我添加了一個眾所周知的指標:
- 特裡克斯
Stockcharts在Trix上有一個很好的討論:ChartSchool - Trix
讓我們嘗試一下如何做到這一點,以最小可能 lines:
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import backtrader.indicators as btind class MyTrix(bt.Indicator): lines = ('trix',) params = (('period', 15),) def __init__(self): ema1 = btind.EMA(self.data, period=self.p.period) ema2 = btind.EMA(ema1, period=self.p.period) ema3 = btind.EMA(ema2, period=self.p.period) self.lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)
Trix指標已啟動並運行。看著這一點,作為該平臺的作者,我確實相信我的目標是能夠快速嘗試易於使用的新想法......已達到。
開發細分:
-
lines = ('trix',)
此元組定義指標的輸出 lines (在本例中僅為一個)。類聲明開頭的此語句在類創建和物件實例化期間生成大量後台操作。
足以說該物件具有一個屬性“lines”,該屬性包含“trix”。
作為獎勵,如果在指標本身內部不使用名稱“trix”,則“line”也可以通過“self.trix”到達。但為了清楚起見,我更喜歡“自我”。lines.trix”
其他存取方法:
-
self.l.trix
-
自我。lines[0] ...作為索引是對應於元組中位置的索引
-
-
參數 = (('句點', 15),)
這個元組元組(也可以是字典或 OrderedDict)定義指標接受的參數並聲明預設值。
解析 kwargs 的負擔從使用者的肩上卸下來。
可以使用“self.params.xxxxx”表示法或速記“self.p.xxxxx”訪問參數
-
計算(其中 EMA 代表 ExponentialMovingAverage)
-
ema1 = btind.EMA(self.data, period=self.p.period)
顯示新的獎金...“自我數據”。這似乎是突然出現的,但這又是在指標的後台完成的預處理。
傳遞給指標進行計算的任何「數據」都會被攔截並放置在數位
self.datas
中,其中通常self.datas[0]
可用於訪問第一個數據。速記確實存在,如下所示:self.data 和 self.data0 表示陣列中的第一個數據。從那時起,self.data1,self.data2。
Trix只需要一個數據
-
ema2 = btind.EMA(ema1, period=self.p.period)
沒什麼可說的。EMA 使用 ema1 作為輸入數據
-
ema3 = btind.EMA(ema2, period=self.p.period)
更不用說
-
自我。lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)
首先,完成一個簡單的1週期百分比差異計算。
魔術 ema3(-1) 是一種表示法,用於表示:ema 的前一個值。
計算結果被分配給在類創建期間定義的輸出“line”“trix”。
-
簡單易用。但是,如果我沒有獲得Trix正在做什麼的視覺反饋,「實驗」就不會完成(即使Stockcharts有一篇很好的文章)。
注意
實際的Trix實施有一些額外的花裡胡哨的東西,主要是為了美化情節而結束的,這與這篇文章無關。
我們假設我們已經將MyTrix
指標放在一個 mytrix.py 檔中。
from __future__ import (absolute_import, division, print_function, unicode_literals) import backtrader as bt import backtrader.feeds as btfeeds from mytrix import MyTrix class NoStrategy(bt.Strategy): params = (('trixperiod', 15),) def __init__(self): MyTrix(self.data, period=self.p.trixperiod) if __name__ == '__main__': # Create a cerebro entity cerebro = bt.Cerebro() # Add a strategy cerebro.addstrategy(NoStrategy, trixperiod=15) # Create a Data Feed datapath = ('../datas/2006-day-001.txt') data = bt.feeds.BacktraderCSVData(dataname=datapath) # Add the Data Feed to Cerebro cerebro.adddata(data) # Run over everything cerebro.run() # Plot the result cerebro.plot()
視覺輸出如下(open 圖表在新視窗/選項卡中查看全尺寸圖像),希望顯示創建指標和可視化評估的速度和簡便性backtrader