Backtrader 教程:数据馈送 - 开发 - CSV

  |  

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

推荐阅读

相关文章

Backtrader细分佣金计划

不久前,委员会计划的实施进行了重新设计。最重要的是:涉及的部分返工: 保留原始的佣金信息类和行为 打开大门,轻松创建用户定义的佣金 将格式 xx% 作为新佣金方案的默认值,而不是 0.xx(只是一个品味问题),保持行为可配置 扩展委员会概述了基本要素。

Backtrader对逐笔报价数据重新采样

backtrader 已经可以从分钟数据中重新采样。接受价格变动数据不是问题,只需将 4 个常用字段(open、 high、 low、 close)设置为价格变动值。 但是传递要重新采样的逐笔报价数据再次生成相同的数据。作为或版本 1.1.11.88,情况已不再如此。

Backtrader教程:数据馈送 - 重新采样

如果数据仅在单个时间范围内可用,并且必须在不同的时间范围内进行分析,则是时候进行一些重新采样了。 “重采样”实际上应该称为“上采样”,因为一个人从源时间帧到更大的时间帧(例如:几天到几周) backtrader 内置支持通过筛选器对象传递原始数据,从而进行重采样。

BacktraderOCO订单

Release1.9.34.116 将 OCO (又名One Cancel Others)添加到回溯测试武器库中。 注意 这仅在回溯测试中实现,并且还没有针对即时代理的实现 注意 随版本1.9.36.116更新。盈透证券支持 StopTrail和 StopTrailLimit OCO。

Backtrader唐钟斯10天连胜

它已成为新闻。DJI正在创下历史新高,已经连续10个上涨日和9个历史高点。例如,请参阅: 当然,许多人已经注意到道琼斯指数处于这样的状态,这篇文章只是告诉我们它正在成为主流。

Backtrader条形同步

文献和/或行业中缺乏标准公式不是问题,因为问题实际上可以总结为: 条形同步 工单 #23 提出了一些问题,即是否可以 backtrader 考虑计算 相对体积 指针。 请求者需要将给定时刻的 volume 与前一个交易日的相同时刻进行比较。

Backtrader节省内存

1.3.1.92版本已经重新设计并完全实现了以前到位的内存节省方案,尽管没有太多的吹捧和使用。

Backtrader 教程:交易

交易的定义:当工具中的头寸从 0 变为大小 X 时,交易打开,对于多头/空头头寸可能为正/负)当头寸从 X 变为 0 时,交易平仓。以下两个动作:正转负负转正实际上被视为:一笔交易已关闭(仓位从 X 变为 0)新交易已开立(仓位从 0 变为 Y)交易只是提供信息,没有用户可调用的方法。

Backtrader教程:指针 - ta-lib

即使 backtrader 提供了已经 high 数量的内置指针,并且开发指针主要是定义输入,输出和以自然的方式编写公式的问题,有些人也希望使用TA-LIB。

Backtrader教程:策略 - 信号

操作 backtrader 也是可能的,而无需编写策略。虽然这是首选方式,但由于构成机器的对象层次结构,使用信号也是可能的。