1. 程式人生 > 實用技巧 >Backtrader中文筆記之Platform Concepts(平臺介紹)。

Backtrader中文筆記之Platform Concepts(平臺介紹)。

這裡將介紹平臺的一些概念的集合。它試圖收集在使用該平臺時有用的資訊位。

在開始之前

所有微小程式碼示例都假設以下匯入可用:

import backtrader as bt
import backtrader.indicators as btind
import backtrader.feeds as btfeeds

  注意訪問子模組的另外方法比如indicatorsfeeds

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 宣告