Backtrader交叉回溯测试陷阱

  |  

backtrader 社区中 ,倾向于重复的事情是,用户解释了拷贝在例如 TradingView 中获得的回溯测试结果的意愿,这些天非常流行,或者其他一些回溯测试平台。

在不真正了解TradingView中使用的语言(命名Pinescript)并且对回溯测试引擎内部进行零公开的情况下,仍然有一种方法可以让用户知道,跨平台编码必须加紧盐。

指针:并不总是忠于来源

当为 backtrader实施新指针时,无论是直接用于分发还是作为网站的片段,都非常重视原始定义。这是RSI 一个很好的例子。

  • 威尔斯·怀尔德设计了RSI 使用 Modified Moving Average (又名 Smoothed Moving Average,参见 维琪百科 - 修改后的移动平均线

  • 尽管如此,许多平台还是为用户提供了一些称为经典RSIExponential Moving Average的东西,而不是书中所说的。

  • 鉴于两个平均值都是指数级的,差异并不大,但这不是Welles Wilder所定义的。它可能仍然有用,甚至可能更好,但它不是RSI.文档(如果可用)没有提到这一点。

in backtrader 的缺省配置RSI是使用 MMA 忠实于源,但要使用的移动平均线是一个参数,可以通过子类化或在运行时实例化期间更改为使用EMA甚至简单移动平均线。

例如:顿奇安海峡

维琪百科的定义:维琪百科 - Donchian频道 )。它只是文本,它没有提到使用信道突破作为交易信号。

另外两个定义:

这两个引用明确指出,用于计算信道的数据不包括当前柱,因为如果它包含...突破不会被反映出来。这是来自股票图表的示例图表

现在转到TradingView。首先是链接

以及该页面的图表。

甚至Investopedia也使用TradingView的图表,显示没有突破。这里: 投资百科 - 顿奇安频道 - https://www.investopedia.com/terms/d/donchianchannels.asp

正如有些人所说...起泡的藤壶!!!!。因为在 TradingView 图表 中看不到 突破。这意味着指针的实现是使用 当前 价格柱来计算信道。

backtrader的顿奇安海峡

标准backtrader发行版中没有DonchianChannels实现,但可以快速制作。参数将是当前柱是否用于信道计算的决定因素。

class DonchianChannels(bt.Indicator):
    '''
    Params Note:
      - ``lookback`` (default: -1)

        If `-1`, the bars to consider will start 1 bar in the past and the
        current high/low may break through the channel.

        If `0`, the current prices will be considered for the Donchian
        Channel. This means that the price will **NEVER** break through the
        upper/lower channel bands.
    '''

    alias = ('DCH', 'DonchianChannel',)

    lines = ('dcm', 'dch', 'dcl',)  # dc middle, dc high, dc low
    params = dict(
        period=20,
        lookback=-1,  # consider current bar or not
    )

    plotinfo = dict(subplot=False)  # plot along with data
    plotlines = dict(
        dcm=dict(ls='--'),  # dashed line
        dch=dict(_samecolor=True),  # use same color as prev line (dcm)
        dcl=dict(_samecolor=True),  # use same color as prev line (dch)
    )

    def __init__(self):
        hi, lo = self.data.high, self.data.low
        if self.p.lookback:  # move backwards as needed
            hi, lo = hi(self.p.lookback), lo(self.p.lookback)

        self.l.dch = bt.ind.Highest(hi, period=self.p.period)
        self.l.dcl = bt.ind.Lowest(lo, period=self.p.period)
        self.l.dcm = (self.l.dch + self.l.dcl) / 2.0  # avg of the above

将与范例图表一起使用lookback=-1 看起来像这样(放大)

人们可以清楚地看到突破,而版本中没有突破lookback=0

编码影响

程序师首先进入商业平台,并使用Donchian Channels实施策略。由于图表不显示突破,因此必须将当前价格值与之前的信道值进行比较。某物如

if price0 > channel_high_1:
    sell()
elif price0 < channel_low_1:
    buy()

当前价格,即:price0 正在与周期前的 high/low 信道值 1 进行比较(因此后 _1 缀)

作为一个谨慎的程序师,并且不知道 backtrader 中Donchian信道的实现缺省为突破,代码被移植并看起来像这样

    def __init__(self):
        self.donchian = DonchianChannels()

    def next(self):
        if self.data[0] > self.donchian.dch[-1]:
            self.sell()
        elif self.data[0] < self.donchian.dcl[-1]:
            self.buy()

这是错误的!!!因为突破发生在比较的同一时刻。正确的代码:

    def __init__(self):
        self.donchian = DonchianChannels()

    def next(self):
        if self.data[0] > self.donchian.dch[0]:
            self.sell()
        elif self.data[0] < self.donchian.dcl[0]:
            self.buy()

虽然这只是一个小例子,但它显示了回溯测试结果可能有何不同,因为指针已使用柱差进行1 编码。它可能看起来不多,但是当错误的交易开始时,它肯定会有所作为。

推荐阅读

相关文章

Backtrader向 OHLC 提供买入价/卖出价数据

最近,backtrader通过实现line覆盖来运行从 ohlc-land 逃逸,这允许重新定义整个层次结构,例如,具有仅具有 bid,ask 和 datetime lines的data feeds。

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

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

Backtrader标杆

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

Backtrader教程:操作平台

Line 反复运算器 为了参与操作,plaftorm使用 line 反复运算器的概念。它们已经松散地模仿了Python的反复运算器,但实际上与它们无关。 策略和指针是 line 反复运算器。

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

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

Backtrader教程:数据馈送 - 展期交割

并非每个供应商都为可以交易的工具提供连续的未来。有时提供的数据是仍然有效的到期日期的数据,即:仍在交易的日期 这在回溯测试方面并不是很有帮助,因为数据分散在几个不同的仪器上,这些仪器另外...时间重叠。 能够正确地将这些仪器的数据从过去连接到连续的流中,可以减轻疼痛。

Backtrader迪克森移动平均线

下面的reddit帖子以自己的作者Nathan Dickson(reddit句柄)命名了这个平均值Dickson移动平均线。 在一次对reddit Algotrading 的定期访问中,我发现了一篇关于移动平均线的帖子,该移动平均线试图模仿Jurik移动平均线(又名JMA)。

Backtrader蟒蛇隐藏的力量3

Last,但并非最不重要的一点是,在这个系列中,关于如何在 backtrader 中使用Python的隐藏功能是一些神奇变量是如何出现的。

Backtrader教程:数据馈送 - 熊猫

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

Backtrader教程:分析仪 - PyFolio

注意 从(至少)2017-07-25pyfolio 开始,API已更改,不再 create_full_tear_sheet 具有 gross_lev 作为命名参数的参数。