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 as 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),
)