CSV数据源开发#
backtrader
已经提供了一种通用的CSV数据源和一些特定的CSV数据源。总结如下:
GenericCSVData
VisualChartCSVData
YahooFinanceData(用于在线下载)
YahooFinanceCSVData(用于已下载的数据)
BacktraderCSVData(内部使用……用于测试目的,但可用)
但即使如此,最终用户可能希望为特定的CSV数据源开发支持。
通常的座右铭是:”一言难尽”。实际上,该结构旨在使其变得容易。
步骤:
继承自
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):
# 对于这种数据源类型不需要做任何操作
pass
def stop(self):
# 对于这种数据源类型不需要做任何操作
pass
def _loadline(self, linetokens):
i = itertools.count(0)```
- dttxt = linetokens[next(i)]
# Date 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 已有的feed和继承中添加几行代码,可以实现更复杂的需求,以适应不同的格式。
千万要注意#
通过使用 GenericCSVData 现有的feed和继承,可以实现很多功能,以支持不同的格式。
让我们为 Sierra Chart <www.sierrachart.com> _每日格式(始终存储在CSV格式中)添加支持。
定义(通过查看 ‘.dly’ 数据文件之一): - 字段 : 日期,开盘价,最高价,最低价,收盘价,成交量,持仓量
行业标准和已被”GenericCSVData”支持的参数,顺序一致(这也是行业标准)
分隔符 : ,
日期格式 : YYYY/MM/DD
用于这些文件的解析器:
class SierraChartCSVData(backtrader.feeds.GenericCSVData):
params = (('dtformat', '%Y/%m/%d'),)
“params”定义仅仅重新定义了基类中的一个现有参数。在此情况下,时间日期的格式化字符串需要更改。
终于… Sierra Chart 的解析器完成了。
下面是”GenericCSVData”的参数定义,以供参考:```python 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),
)