Backtrader开发指针

  |  

经过 backtrader 微调(因为它已经运行了一段时间),我决定不仅通过GitHub分享它,还告诉世界它在那里,并在“Reddit”中发布它的存在。

在评论了为什么交易/算法交易平台会弹出,以及关于支持许多同时交易的即时交易的平台的私人问题之后,我得出的结论是,我自己的孩子应该拥有自己的博客。

我们来了。但让我们专注于业务。

backtrader 旨在让我快速尝试一些想法,并检查我的眼睛可能告诉我这可能是一个机会。

backtrader (现在)完全是关于回溯测试的,还没有连接到任何即时交易平台,甚至可能没有(尽管我相信技术实现会允许它)

当我使用「尝试想法」这个表达时,我的意思是两件事:

  1. 能够快速起草指针并能够直观地评估其行为

  2. 无论是这种情况,都可以围绕该指针或与他人的组合制定潜在的战略。

我的个人交易是100%判断性的,因为自动化系统不会做出任何一个决定。但我看看指针有什么要说明的。无论这些「迹象」是否真的是一个信号,它都留给了我错误的人类思维。

但是让我们来试试吧。在Reddit上发布了第一 次之后,我添加了一个众所周知的指针:

  • 特里克斯

Stockcharts在Trix上有一个很好的讨论:ChartSchool - Trix

让我们尝试一下如何做到这一点,以最小可能 lines

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import backtrader as bt
import backtrader.indicators as btind


class MyTrix(bt.Indicator):

    lines = ('trix',)
    params = (('period', 15),)

    def __init__(self):
        ema1 = btind.EMA(self.data, period=self.p.period)
        ema2 = btind.EMA(ema1, period=self.p.period)
        ema3 = btind.EMA(ema2, period=self.p.period)

        self.lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)

Trix指针已启动并运行。看着这一点,作为该平台的作者,我确实相信我的目标是能够快速尝试易于使用的新想法......已达到。

开发细分:

  • lines = ('trix',)

    此元组定义指针的输出 lines (在本例中仅为一个)。类声明开头的此语句在类创建和对象实例化期间生成大量后台操作。

    足以说该对象具有一个属性“lines”,该属性包含“trix”。

    作为奖励,如果在指针本身内部不使用名称“trix”,则“line”也可以通过“self.trix”到达。但为了清楚起见,我更喜欢“自我”。lines.trix”

    其他访问方法:

    • self.l.trix

    • 自我。lines[0] ...作为索引是对应于元组中位置的索引

  • 参数 = (('句点', 15),)

    这个元组元组(也可以是字典或 OrderedDict)定义指针接受的参数并声明默认值。

    解析 kwargs 的负担从用户的肩上卸下来。

    可以使用“self.params.xxxxx”表示法或速记“self.p.xxxxx”访问参数

  • 计算(其中 EMA 代表 ExponentialMovingAverage)

    • ema1 = btind.EMA(self.data, period=self.p.period)

      显示新的奖金...“自我数据”。这似乎是突然出现的,但这又是在指针的后台完成的预处理。

      传递给指针进行计算的任何「数据」都会被拦截并放置在数字self.datas 中,其中通常 self.datas[0] 可用于访问第一个数据。

      速记确实存在,如下所示:self.data 和 self.data0 表示数组中的第一个数据。从那时起,self.data1,self.data2。

      Trix只需要一个数据

    • ema2 = btind.EMA(ema1, period=self.p.period)

      没什么可说的。EMA 使用 ema1 作为输入数据

    • ema3 = btind.EMA(ema2, period=self.p.period)

      更不用说

    • 自我。lines.trix = 100.0 * (ema3 - ema3(-1)) / ema3(-1)

      首先,完成一个简单的1周期百分比差异计算。

      魔术 ema3(-1) 是一种表示法,用于表示:ema 的前一个值。

      计算结果被分配给在类创建期间定义的输出“line”“trix”。

简单易用。但是,如果我没有获得Trix正在做什么的视觉反馈,「实验」就不会完成(即使Stockcharts有一篇很好的文章)。

注意

实际的Trix实施有一些额外的花里胡哨的东西,主要是为了美化情节而结束的,这与这篇文章无关。

我们假设我们已经将MyTrix 指针放在一个 mytrix.py 档中。

from __future__ import (absolute_import, division, print_function,
                        unicode_literals)

import backtrader as bt
import backtrader.feeds as btfeeds

from mytrix import MyTrix


class NoStrategy(bt.Strategy):
    params = (('trixperiod', 15),)

    def __init__(self):
        MyTrix(self.data, period=self.p.trixperiod)


if __name__ == '__main__':
    # Create a cerebro entity
    cerebro = bt.Cerebro()

    # Add a strategy
    cerebro.addstrategy(NoStrategy, trixperiod=15)

    # Create a Data Feed
    datapath = ('../datas/2006-day-001.txt')
    data = bt.feeds.BacktraderCSVData(dataname=datapath)

    # Add the Data Feed to Cerebro
    cerebro.adddata(data)

    # Run over everything
    cerebro.run()

    # Plot the result
    cerebro.plot()

视觉输出如下(open 图表在新窗口/选项卡中查看全尺寸图像),希望显示创建指针和可视化评估的速度和简便性backtrader

推荐阅读

相关文章

Backtrader规范与非规范

这个问题或多或少地出现了几次:这样: backtrader如何最好/规范地实现这一点或那样? 作为 backtrader 的目标之一,可以灵活地 支持尽可能多的情况和用例,答案很简单:“至少在几种方式上”。

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

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

Backtrader改进代码

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

Backtrader观察员和统计

在 backtrader 内部运行的策略主要处理数据 和 指针。 数据被添加到Cerebro 实例中,并最终成为策略输入的一部分(解析并用作实例的属性),而指针由策略本身声明和管理。

Backtrader教程:数据馈送 - 扩展(Extending DataFeed)

GitHub 中的问题实际上是在推动文档部分的完成,或者説明我了解我是否backtrader 具有我从一开始就设想的易用性和灵活性以及在此过程中做出的决定。 在本例中为问题 #9。

Backtrader股票筛选

在寻找其他一些东西时,我在StackOverlow家族网站之一上遇到了一个问题:Quantitative Finance aka Quant StackExchange。问题: 它被标记为Python,因此值得一看的是 backtrader 是否能够胜任这项任务。 分析仪本身 该问题似乎适合用于简单的分析器。

Backtrader回溯

在一些关于改进的ShapeRatio的提示之后, backtrader 已将此分析仪添加到其武器库中。 文献位于: 从对数回报的好处开始,并遵循在SharpeRatio方程的分母中具有标准偏差的副作用,本文档开发了该分析仪的公式和期望。

数据多时间帧

有时投资决策是使用不同的时间框架做出的: 每周评估趋势 每天执行条目 或者5分钟对60分钟。 这意味着需要将多个时间帧的数据组合在 backtrader 中以支援此类组合。 对它的本机支持已经内置。

Backtrader现实咬合

上一篇文章设法拷贝了该BTFD 策略,发现真正的收益 16x 而不是 31x。 但正如拷贝期间所指出的: 不收取佣金 使用2x 杠杆不收取利息 这就提出了一个显而易见的问题: 当收取佣金和利息时,这16x中有多少会存在? 幸运的是,前面的示例足够灵活,可以对其进行试验。

Backtrader教程:指针 - ta-lib

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