第一次接觸Python,朋友帶着玩,發現官方文檔寫得好棒(https://www.backtrader.com/docu/),以下內容來自於官方文檔,以及我自己的學習心得。
數據結構:
數據格式:必須有6列(日期時間,開盤,收盤,最高,最低,持倉量?)
用lines存儲:很多line組成的list 數組類型(?)。
dataFeed:本地讀入csv或者txt文件用 bt.feeds.GenericCSVData 類,該類可以重載源數據每列的屬性,從0開始。本來之前按照官方文檔用的Yahoo那個類,調試半天數據都對不上,后來才發現是 因為Yahoo類定義的列屬性順序不可調,例子里用的源文件順序又不完全是按照Yahoo類定義的排列,導致除了收盤價,其他的數據都對不上號。
數據訪問的方法有很多種,對於源數據而言,一旦讀入data.lines,在數據源類實例中的數據就不會改變了,實際改變的會是指標里的數據。以下訪問方式都是等價的:
if self.movav.lines.sma[0] > self.data.lines.close[0]: print(self.data_close[0]) # 等價於self.data.close[0],self.data.lines.close[0],self.data0[0],self.data.lines[0][0] print(self.data.close[0]) # 此類等價僅支持數據源,指標不支持 print(self.movav.sma[0]) # self.movav.sma等價於self.movav.lines[0],self.movav.line0,self.movav.line_0
官方還有更詳細的說明,通過這個說明,才真的有點明白怎么訪問實際數據。
對於每個指標的類,在類定義時需要定義lines的值,比如對於SMA類,最開始會定義lines的屬性值為sma,此時通過self.mov.sma[0],就可以取到最新的一個平均值了。所有指標的返回都是存在List中的,我理解就是數組中,所以單單通過self.mov.sma實際上得到的是一個指針地址。
Line的操作:
BT平台不支持List的Slice!! 因為平台的數據源將0認為是最新的數據,-1是前一個數據。這個與Python默認的定義不一樣,所以不支持slice函數。平台通過 get函數,取得list中的指定數據段:注意取出來的數據順序,是從舊到新的順序。我測試了下,也可以用append來賦值,哈哈,笨方法。
first_t = t.get(size = (periods)) # t.get(ago = 0,size = periods):從當前數據開始取前periods個數據,如果周期是10,則取即0~-9,注意順序 first_t2 = t.get(ago =-1,size=(periods))#從第二新的數據開始取,一共periods個數據 for li in range(-1*(periods),0): # print(li,t.lines[0][li]) first_t.append(t.lines[0][li])
策略中的__init__: 僅定義指標,參數,不會實際加載任何數據。但是如果定義了k線數值,即period,則系統會統計,必須滿足所有指標的k線量達成后,會進入next進行實際計算。比如5日均線,與10日ATR,init中會數到10個bar(K線)后才會進入next 加載數據,並計算5日SMA和10日ATR。
next:執行真正的數據加載,以及指標計算。