backtrader 已经提供了通用 CSV 数据馈送和一些特定的 CSV 数据馈送。总结:

  • 通用CSV数据
  • 可视化图表CSV数据
  • YahooFinanceData(用于在线下载)
  • YahooFinanceCSVData(用于已下载的数据)
  • BacktraderCSVData(内部……用于测试目的,但可以使用)

但即便如此,最终用户可能希望开发对自定义CSV 数据馈送的支持。

通常的座右铭是:“说起来容易做起来难”。实际上,该结构旨在使其变得容易。

步骤:

  • 继承自backtrader.CSVDataBase
  • params如果需要,定义任何
  • start在方法中进行任何初始化
  • stop在方法中进行任何清理
  • 定义_loadline实际工作发生的方法

    此方法接收一个参数:linetokens。

    顾名思义,这包含根据separator参数拆分当前行之后的标记(从基类继承)

    如果完成工作后有新数据……填写相应的行并返回True

    如果没有可用的东西,因此解析已经结束:返回 False

    False如果正在读取文件行的​​幕后代码发现没有更多行可以解析,则甚至可能不需要返回。

已经考虑到的事情:

  • 打开文件(或接收类似文件的对象)
  • 如果指示存在,则跳过标题行
  • 读线
  • 标记线条
  • 预加载支持(将整个数据馈送一次加载到内存中)

通常一个例子抵得上一千个需求描述。让我们使用内部定义的 CSV 解析代码的简化版本,来自 BacktraderCSVData. 这个不需要初始化或清理(例如,这可能是打开一个套接字并稍后关闭它)。

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”数据文件之一:

  • 字段:日期、开盘价、最高价、最低价、收盘价、成交量、OpenInterest

    行业标准和同订单已经支持的 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),
    )