BacktraderMFI 通用

  |  

在最近的Canonical vs Non-Canonical 帖子中 MFI ,开发了(aka MoneyFlowIndicator)。

尽管它是以规范的方式开发的,但它仍然提供了一些改进和成为通用的空间。

让我们关注实现的第lines即创建典型价格的那些

class MFI_Canonical(bt.Indicator):
    lines = ('mfi',)
    params = dict(period=14)

    def __init__(self):
        tprice = (self.data.close + self.data.low + self.data.high) / 3.0
        mfraw = tprice * self.data.volume
        ...

典型的实例化如下所示

class MyMFIStrategy(bt.Strategy):

    def __init__(self):
        mfi = bt.MFI_Canonical(self.data)

这里的问题应该是显而易见的:“人们需要一个指针的输入,lowhigh其中的特征closevolume组件(又名*linesbacktrader生态系统中)”*

当然,可能的情况是,人们希望从不同的数据源(lines来自data feeds或来自其他指针lines)创建一MoneyFlowIndicator个使用组件,就像想要赋予close更多的权重一样简单,而不必开发一个特定的指针。考虑到行业标准OHLCV的字段排序,多个输入,额外的权重,close实例化可能看起来像这样

class MyMFIStrategy2(bt.Strategy):

    def __init__(self):
        wclose = self.data.close * 5.0
        mfi = bt.MFI_Canonical(self.data.high, self.data.low,
                               wclose, self.data.volume)

或者因为用户以前使用ta-lib 过并幻想过多输入样式。

支持多种输入

backtrader 尝试尽可能的pythonic,self.datas 并且可以查找包含系统中 data feeds 清单的数字(并且自动神奇地提供给您的策略)的长度。让我们用它来区分调用方想要什么,并正确计算 tpricemfraw

class MFI_MultipleInputs(bt.Indicator):
    lines = ('mfi',)
    params = dict(period=14)

    def __init__(self):
        if len(self.datas) == 1:
            # 1 data feed passed, must have components
            tprice = (self.data.close + self.data.low + self.data.high) / 3.0
            mfraw = tprice * self.data.volume
        else:
            # if more than 1 data feed, individual components in OHLCV order
            tprice = (self.data0 + self.data1 + self.data2) / 3.0
            mfraw = tprice * self.data3

        # No changes with regards to previous implementation
        flowpos = bt.ind.SumN(mfraw * (tprice > tprice(-1)), period=self.p.period)
        flowneg = bt.ind.SumN(mfraw * (tprice < tprice(-1)), period=self.p.period)

        mfiratio = bt.ind.DivByZero(flowpos, flowneg, zero=100.0)
        self.l.mfi = 100.0 - 100.0 / (1.0 + mfiratio)

注意

请注意各个组件的参考方式(self.dataXself.data0self.data1

这与使用self.datas[x]相同,如 self.datas[0] ...

让我们以图形方式看到,此指针产生的结果与规范指针相同,当多个输入对应于 data feed的原始分量时,产生相同的结果。为此,它将在策略中运行,如下所示

class MyMFIStrategy2(bt.Strategy):

    def __init__(self):
        MFI_Canonical(self.data)
        MFI_MultipleInputs(self.data, plotname='MFI Single Input')
        MFI_MultipleInputs(self.data.high,
                           self.data.low,
                           self.data.close,
                           self.data.volume,
                           plotname='MFI Multiple Inputs')

无需检查每个值,从图片中可以明显看出,三者的结果相同。

让我们最终看看如果把更多的权重放在上面close会发生什么。让我们这样运行。

class MyMFIStrategy2(bt.Strategy):
    def __init__(self):

        MFI_MultipleInputs(self.data)
        MFI_MultipleInputs(self.data.high,
                           self.data.low,
                           self.data.close * 5.0,
                           self.data.volume,
                           plotname='MFI Close * 5.0')

这是否有意义留给读者,但人们可以清楚地看到,增加重量close 已经改变了模式。

结论

通过简单地使用pythoniclen,可以将使用具有多个组件(和固定名称)的 data feed 的指针转换为接受多个通用输入的指针。

推荐阅读

相关文章

Backtrader教程:经纪人 - 开仓作弊

“发布”1.9.44.116 添加了对 Cheat-On-Open的支持。这似乎是那些全力以赴的人的需求功能,他们在酒吧 close 后进行了计算,但希望与 open 价格相匹配。 当开盘价跳空(上涨或下跌,取决于是否buysell有效)并且现金不足以进行全面运营时,这样的用例就会失败。这将强制代理拒绝该操作。

Backtrader改进代码

时不时地,带有 backtrader 代码的示例会在互联网上弹出。在我看来,有几个是中国人。最新的一个在这里: 标题是: backtrader-学习笔记2,这显然(感谢谷歌)翻译成 backtrader- 学习笔记2。

Backtrader标杆

backtrader 包括 2 种不同类型的对象,可帮助进行跟踪: Observers Analyzers 工单 #89 是关于添加资产基准测试的。明智的是,人们实际上可能有一个策略,即使积极,也低于简单地跟踪资产所能提供的策略。

Backtrader教程:绘图 - 日期范围

该版本1.9.31.x 增加了制作部分绘图的功能。 使用策略实例中保存的完整时间戳数组的索引 或者使用实际datetime.date 或 datetime.datetime 实例来限制必须绘制的内容。 一切都超过标准cerebro.plot。

Backtrader卡尔曼等

注意 对以下指令的支持从提交开始 发布1.9.30.x 将是包含它的第1个版本 。 backtrader的原始目标之一是成为纯python,即:仅使用标准发行版中可用的软件包。只有一个例外是matplotlib在没有重新发明轮子的情况下进行绘图。

Backtrader开场作弊

“发布”1.9.44.116 添加了对 Cheat-On-Open的支持。这似乎是那些全力以赴的人的需求功能,他们在酒吧 close 后进行了计算,但希望与 open 价格相匹配。 当开盘价跳空(上涨或下跌,取决于是否buysell有效)并且现金不足以进行全面运营时,这样的用例就会失败。这将强制代理拒绝该操作。

Backtrader教程:数据馈送 - 熊猫

注意 pandas 并且必须安装其依赖项 支持Pandas Dataframes似乎受到很多人的关注,他们依赖于已经可用的解析代码来分析不同的数据源(包括CSV)和Pandas提供的其他功能。 数据馈送的重要声明。 注意 这些只是 声明。不要盲目拷贝此代码。

Backtrader买入/卖出箭头

backtrader 旨在尝试提供易用性。创建指针和其他常见嫌疑人应该很容易。 当然,定制现有项目也应该是交易的一部分。 社区中的一个主题,BuySell Arrows,它起源于从问题迁移而来的,就是一个很好的例子。

Backtrader教程:指针 - ta-lib

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

Backtrader开发指针

经过 backtrader 微调(因为它已经运行了一段时间),我决定不仅通过GitHub分享它,还告诉世界它在那里,并在“Reddit”中发布它的存在。 在评论了为什么交易/算法交易平台会弹出,以及关于支持许多同时交易的即时交易的平台的私人问题之后,我得出的结论是,我自己的孩子应该拥有自己的博客。 我们来了。