在backtrader 社区中 ,倾向于重复的事情是,用户解释了拷贝在例如 TradingView 中获得的回溯测试结果的意愿,这些天非常流行,或者其他一些回溯测试平台。
在不真正了解TradingView中使用的语言(命名Pinescript
)并且对回溯测试引擎内部进行零公开的情况下,仍然有一种方法可以让用户知道,跨平台编码必须加紧盐。
指针:并不总是忠于来源
当为 backtrader实施新指针时,无论是直接用于分发还是作为网站的片段,都非常重视原始定义。这是RSI
一个很好的例子。
-
威尔斯·怀尔德设计了
RSI
使用Modified Moving Average
(又名Smoothed Moving Average
,参见 维琪百科 - 修改后的移动平均线 ) -
尽管如此,许多平台还是为用户提供了一些称为经典
RSI
Exponential 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
编码。它可能看起来不多,但是当错误的交易开始时,它肯定会有所作为。