天天看點

Python量化交易學習筆記(56)——backtrader的一些基本概念4

本文繼續記錄bt相關的概念内容。

Line疊代器

backtrader中的Line疊代器和Python裡的疊代器關系不大,隻是稍微模仿了Python疊代器的一些功能。

在bt中,政策(Strategy)和名額(Indicator)都是Line疊代器。

Line疊代器在自身line疊代的同時,會告知其附屬疊代器一起進行疊代。

  • next

    Line疊代器的關鍵函數是next,Line疊代器在每次疊代時都會調用next函數,同時Line疊代器中所包含的data數組會在疊代中,由系統将數組索引自動後移一位。

    需要注意的是,next函數隻有在最小周期後才會被調用,後文将介紹最小周期的概念。

與傳統的疊代器相比,Line疊代器還實作了另外兩個實用的函數,這兩個函數都和前面說到最小周期有關:

  • prenext,在最小周期前,每次疊代都會被調用
  • nextstart,當最小周期到達時,此函數會被調用一次,且僅被調用一次,預設的實作方式是調用next函數。

Indicator其他一些方法

為了實作運算的加速,Indicator支援被稱為runonce的一系列操作。如果隻使用next函數也足以完成任務,但是使用runonce可以大大節省計算時間。

在next系列函數中,使用的是索引方式間接地來通路(get/set)資料,而在runonce系列函數中,是直接通路存儲資料的底層數組。

runonce系列函數的命名與next系列函數命名一緻(once對應next,preonce對應prenext,oncestart對應nextstart),主要包含以下函數:

  • once(self, start, end) ,在最小周期後的每次疊代都會被調用,start和end用于限制函數所處理的底層數組的範圍
  • preonce(self, start, end),在最小周期前,每次疊代都會被調用
  • oncestart(self, start, end),當最小周期到達時,此函數會被調用一次,且僅被調用一次,預設的實作方式是調用once函數。

最小周期

通過一個簡單的例子來介紹最小周期的概念,下面的代碼中,定義了均線的名額:

class SimpleMovingAverage(Indicator):
    lines = ('sma',)
    params = dict(period=20)
    def __init__(self):
        ...  # Not relevant for the explanation
    def prenext(self):
        print('prenext:: current period:', len(self))
    def nextstart(self):
        print('nextstart:: current period:', len(self))
        # emulate default behavior ... call next
        self.next()
    def next(self):
        print('next:: current period:', len(self))
           

在使用這個名額時,執行個體化的方式如下:

假設傳給該名額的資料是标準的data feed(沒有延時,下一個例子會出現的data feed),那麼period=25就意味着在計算25周期均線的時候,就會依次調用:

  • prenext 24次
  • nextstart 1次(預設去調用next)
  • next 直到data feed被消費完畢

再舉一個更複雜的例子,定義一個均線(SimpleMovingAverage )的均線名額,執行個體化的代碼如下:

sma1 = btind.SimpleMovingAverage(self.data, period=25)
sma2 = btind.SimpleMovingAverage(sma1, period=20)
           

第1行的代碼實作一個與上一個例子相同的25周期均線sma1,第2行代碼把sma1作為data feed傳入到均線sma2中,sma2就會依次調用:

  • prenext 前25+18=43次,其中前25個時間周期生成了第1個sma1的資料,再經過18個時間周期,共生成了19個sma1資料
  • nextstart 1次(預設去調用next)
  • next 直到data feed被消費完畢

也就是說,在經過44根K線後,sma2才會直接調用next函數。

最小周期的規則會被自動應用到data feed中,隻有經過最小周期後,next函數才會被調用(不考慮在nextstart中預設會調用next),在Strategy和Indicator中都遵循這樣的規則。同樣,runonce系列函數遵循next函數同樣的調用規則。

此外,雖然bt不建議手動設定最小周期,但也提供了相關的函數,在Strategy和Indicator中可以通過setminperiod(minperiod)設定最小周期。

歡迎大家關注、點贊、轉發、留言,感謝支援!

微信群用于學習交流,群1已滿,群2已建立,感興趣的讀者請掃碼加微信!

QQ群(676186743)用于資料共享,歡迎加入!

Python量化交易學習筆記(56)——backtrader的一些基本概念4
Python量化交易學習筆記(56)——backtrader的一些基本概念4