Backtrader中文筆記之Platform Concepts(平臺介紹)。
這裡將介紹平臺的一些概念的集合。它試圖收集在使用該平臺時有用的資訊位。
在開始之前
所有微小程式碼示例都假設以下匯入可用:
import backtrader as bt import backtrader.indicators as btind import backtrader.feeds as btfeeds
注意訪問子模組的另外方法比如indicators和feeds
import backtrader as bt
然後
thefeed = bt.feeds.OneOfTheFeeds(...) theind = bt.indicators.SimpleMovingAverage(...)
資料傳輸---傳遞資料
平臺工作的基礎的基礎將以策略來完成,而這些都將通過資料反饋,平臺終端使用者不需要在意接收它們。
資料提供以陣列或者資料位置的形式自動為策略提供成員變數
快速預覽一個策略派生類宣告和執行平臺:
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.datas[0], period=self.params.period) ... cerebro = bt.Cerebro() ... data = btfeeds.MyFeed(...) cerebro.adddata(data) ... cerebro.addstrategy(MyStrategy, period=30) ...
請注意以下幾點
策略的__init__方法沒有使用*args與**kwargs接收引數(它們任然是可以用的)
self.datas變數物件存在,它至少是陣列/列表/可迭代資料的一種(希望如此,否則將引發異常)
因此,資料被新增到平臺中,它們被新增到系統中,在策略中按照順序顯示。
注意
這也適用與指標線,如果終端使用者開發了自己的定製指標線,或者查看了一些現有指示引用的原始碼做出的指標線
資料反饋的捷徑
self.datas陣列項可直接訪問附加的自動成員變數
-
self.data
對應self.datas[0]
-
self.dataX
對應self.datas[X]
示例如下
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.data, period=self.params.period) ...
self.data == self.datas[0]
忽略資料傳遞
上面的示例可以簡化如下:
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(period=self.params.period) ...
self.data已經完全從SimpleMovingAverage呼叫中刪除.如果這麼做,指標線(在本例中是
SimpleMovingAverage
)將接收正在建立策略物件的第一個資料,就是self.data(self.data0或self.datas[0])
幾乎所有的東西是資料飼料
不僅資料飼料是資料,可以四處傳遞。指標線和行動結果也是資料
在前面的例子中,最簡單的平均數是接收self.datas[0
]作為操作的輸入。下面是一個帶有操作和額外指標線的例子:
class MyStrategy(bt.Strategy): params = dict(period1=20, period2=25, period3=10, period4) def __init__(self): sma1 = btind.SimpleMovingAverage(self.datas[0], period=self.p.period1) # This 2nd Moving Average operates using sma1 as "data"
# 操作指標線1 sma2 = btind.SimpleMovingAverage(sma1, period=self.p.period2) # New data created via arithmetic operation
# 對指標線進行算術操作 something = sma2 - sma1 + self.data.close # This 3rd Moving Average operates using something as "data" sma3 = btind.SimpleMovingAverage(something, period=self.p.period3) # Comparison operators work too ...
進行比較操作 greater = sma3 > sma1 # Pointless Moving Average of True/False values but valid # This 4th Moving Average operates using greater as "data" sma3 = btind.SimpleMovingAverage(greater, period=self.p.period4) ...
基本上每樣東西都可以轉換成物件,一旦被操作,它就可以成為資料飼料。
引數
平臺中的大多數其他類都支援引數的概念。
引數和預設值被宣告為類屬性(元組套元組或類似於dict的物件)
掃描關鍵字args (**kwargs)以匹配引數,如果找到關鍵字,則將其從**kwargs中刪除,並將值賦給相應的引數
引數最終能被類的例項適用,通過self.params或self.p進行訪問成員變數
前面的快速策略已經包含了一個引數示例,但為了保險起見,再來一次只關注引數。使用元祖
class MyStrategy(bt.Strategy): params = (('period', 20),) def __init__(self): sma = btind.SimpleMovingAverage(self.data, period=self.p.period)
使用字典
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): sma = btind.SimpleMovingAverage(self.data, period=self.p.period)
Lines
同樣平臺中幾乎所有的其他物件獨有Lines物件。從終端使用者的角度來看,這意味著:
它可以容納多個線系列,作為一個線系列,就是陣列的各個值聯絡在一起,在圖示中就會形成一條線
行(或行序列)的一個很好的例子就是由股票收盤價構成的線。這實際上是一個眾所周知的價格演變圖表(稱為線上收盤價)
該平臺的常規使用只關心lines物件。前面的迷你策略示例稍加擴充套件,就又派上用場了:
class MyStrategy(bt.Strategy): params = dict(period=20) def __init__(self): self.movav = btind.SimpleMovingAverage(self.data, period=self.p.period) def next(self):
# 20日均線的點大於收盤價 if self.movav.lines.sma[0] > self.data.lines.close[0]: print('Simple Moving Average is greater than the closing price')
暴露了兩個lines物件
self.data它有一個lines屬性,該屬性依次包含一個close屬性
self.movav是一個簡單的平均指標,它有一個lines屬性,該屬性依次包含一個sma屬性
注意
很明顯,行被命名了。也可以按照宣告的順序訪問它們,但這隻能在指示符開發中使用
同時可以查詢close和sma這兩條線,取一個點(index 0)進行數值比較。
對線的快速訪問也存在:
xxx.lines短寫成xxx.l
xxx.lines.name短些成xxx.lines_name
像策略和指標這樣的複雜物件提供了對資料線的快速訪問
self.data_name提供了對self.data.lines.name的直接訪問
這也適用於編號資料變數:self.data1_name - > self.data1.lines.name
另外行名也可以直接在物件上使用:
self.data.close
and self.movav.sma
但是如果行被直接訪問,這個符號就沒有像前一個這麼清楚了。
注意
不支援使用這兩個後面的符號設定/分配行
Lines 宣告