backtrader已經提供了通用 CSV數據提要和一些特定的 CSV數據提要。總結:
通用CSV數據
可視化圖表CSV數據
YahooFinanceData(用於在線下載)
YahooFinanceCSVData(用於已下載的數據)
BacktraderCSVData(內部......用於測試目的,但可以使用)
但即便如此,最終用戶可能希望開發對特定 CSV Data Feed的支持。
通常的座右銘是:“說起來容易做起來難”。實際上,該結構旨在使其變得容易。
腳步:
從
backtrader .CSVDataBase繼承如果需要,定義任何
params在
start方法中進行任何初始化在
stop方法中進行任何清理定義實際工作發生的
_loadline方法此方法接收一個參數:linetokens。
顧名思義,這包含根據
separator參數拆分當前行之後的標記(繼承自基類)如果完成工作後有新數據……填寫相應的行並返回
True如果沒有可用的東西,因此解析已經結束:返回
False如果正在讀取文件行的幕後代碼發現沒有更多行可以解析,則甚至可能不需要返回
False。
已經考慮到的事情:
打開文件(或接收類似文件的對象)
如果指示存在,則跳過標題行
讀線
標記線條
預加載支持(將整個數據饋送一次加載到內存中)
通常一個例子抵得上一千個需求描述。讓我們使用來自BacktraderCSVData的內部定義的 CSV 解析代碼的簡化版本。這個不需要初始化或清理(例如,這可能是打開一個套接字並稍後關閉它)。
筆記
backtrader數據提要包含通常的行業標準提要,這些提要是要填寫的。即:
約會時間
打開
高的
低的
關
體積
未平倉合約
如果您的策略/算法或簡單的數據閱讀只需要,例如收盤價,您可以保持其他不變(每次迭代都會在最終用戶代碼有機會做任何事情之前自動用 float('NaN') 值填充它們。
在此示例中,僅支持每日格式:
import itertools
...
import backtrader import bt
class MyCSVData(bt.CSVDataBase):
def start(self):
# Nothing to do for this data feed type
pass
def stop(self):
# Nothing to do for this data feed type
pass
def _loadline(self, linetokens):
i = itertools.count(0)
dttxt = linetokens[next(i)]
# Format is YYYY-MM-DD
y = int(dttxt[0:4])
m = int(dttxt[5:7])
d = int(dttxt[8:10])
dt = datetime.datetime(y, m, d)
dtnum = date2num(dt)
self.lines.datetime[0] = dtnum
self.lines.open[0] = float(linetokens[next(i)])
self.lines.high[0] = float(linetokens[next(i)])
self.lines.low[0] = float(linetokens[next(i)])
self.lines.close[0] = float(linetokens[next(i)])
self.lines.volume[0] = float(linetokens[next(i)])
self.lines.openinterest[0] = float(linetokens[next(i)])
return True
該代碼期望所有字段都到位並且可以轉換為浮點數,除了具有固定 YYYY-MM-DD 格式並且可以在不使用datetime.datetime.strptime的情況下進行解析的日期時間。
通過添加幾行代碼來解決空值、日期格式解析,可以滿足更複雜的需求。 GenericCSVData就是這樣做的。
買者自負
使用GenericCSVData現有的提要和繼承可以完成很多以支持格式。
讓我們添加對Sierra Chart每日格式(始終以 CSV 格式存儲)的支持。
定義(通過查看“.dly”數據文件之一:
字段:日期、開盤價、最高價、最低價、收盤價、成交量、開盤價
行業標準和已由
GenericCSVData以相同順序支持的那些(這也是行業標準)分隔符:,
日期格式:YYYY/MM/DD
這些文件的解析器:
class SierraChartCSVData(backtrader.feeds.GenericCSVData):
params = (('dtformat', '%Y/%m/%d'),)
params定義只是重新定義了基類中的現有參數之一。在這種情況下,只需更改日期的格式字符串。
等等…… Sierra Chart的解析器完成了。
下面是GenericCSVData的參數定義作為提醒:
class GenericCSVData(feed.CSVDataBase):
params = (
('nullvalue', float('NaN')),
('dtformat', '%Y-%m-%d %H:%M:%S'),
('tmformat', '%H:%M:%S'),
('datetime', 0),
('time', -1),
('open', 1),
('high', 2),
('low', 3),
('close', 4),
('volume', 5),
('openinterest', 6),
)