本文繼續記錄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)用于資料共享,歡迎加入!
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHLwUEVNpXQq5kMRpHW3BjMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL0YDOxEzN0EjMwITMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)