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

)

```