极具迷惑性的ZIG之字转向指标算法

简介

ZIG指标又称ZigZag指标,中文名叫之字转向,在各大金融平台都有它的身影,如果你是第一次接触这个指标,你会发现它非常神奇,它能准确找到K线趋势上的顶底点,这个时候你心里肯定会想,如果按照ZIG顶底点的趋势去买入卖出,岂不是赚大发了,如果有这种想法,奉劝各位再三思量啊,所以我们有必要深入了解ZIG底层算法是如何计算的,然后再做入市的打算,入市一定要谨慎呀。了解底层原理才能做到泰然自若稳操胜券哦!

从上图可以看出,ZIG转向非常精准,单单从图片上看,买卖点信号非常明显,几乎百分百胜率,如果计算回测,收益率爆棚啊,哈哈。当然了,不要开心的那么早哦,亮个算法来给我们泼泼冷水先。

ZIG算法

ZIG算法主要是计算高低极点位置:

  1. 如果当前价格突破了最后一个高点,则将当前价格标记为新的高点,并且之前的所有低点被忽略。
  2. 如果当前价格跌破了最后一个低点,则将当前价格标记为新的低点,并且之前的所有高点被忽略。
  3. 在趋势转折点处,将前一段时间内的价格极值点进行合并,形成一条新的折线。

通常价格的突破设置一个百分比幅度,例如ZIG(3,5) 表示 当收盘价突破正负%5涨跌幅时进行转向,如果下一个价格继续突破就继续更新高低点极值。

代码实现

python代码实现,完整代码参考开源的麦语言解析器框架 dsxindexer

预览功能可以看 http://www.dsxkline.com 网站

def ZIG(self:BaseSindexer,K:int,N:float):
    """之字转向 属于未来函数
    ZIG(K,N),当价格变化量超过N%时转向,K表示0:开盘价,1:最高价,2:最低价,3:收盘价
    ZIG(3,5)表示收盘价的5%的ZIG转向
    """
    zig = None
    # 计算过程缓存
    key = "zig_%s_%s_" % (K,N)
    CLOSE = "CLOSE"
    if K==0: CLOSE = "OPEN"
    if K==1: CLOSE = "HIGH"
    if K==2: CLOSE = "LOW"
    if K==3: CLOSE = "CLOSE"
    # 当前值
    value = self.GET(CLOSE)
    # 上一个低点
    zig_low = self.REF(key+"low")
    if not zig_low:zig_low = value
    # 上一个高点
    zig_high = self.REF(key+"high")
    if not zig_high:zig_high = value
    # 上一个低点位置
    zig_low_day = self.REF(key+"low_day")
    if zig_low_day==None:zig_low_day = self.cursor.index
    # 上一个高点位置
    zig_high_day = self.REF(key+"high_day")
    if zig_high_day==None:zig_high_day = self.cursor.index
    # 默认继承
    self.save_temp(key+"low",zig_low)
    self.save_temp(key+"high",zig_high)
    self.save_temp(key+"high_day",zig_high_day)
    self.save_temp(key+"low_day",zig_low_day)
    
    # 极点阀值,计算跟上一个低点的阀值
    fz = 100 * (value - zig_low) / zig_low
    # 如果极点阀值大于N,这个是高点
    if fz>=N:
        zig_max = self.HHV(CLOSE, self.cursor.index-zig_low_day);
        if value>=zig_max:
            # 更新中间的zig值
            self.__ZIG(CLOSE,zig_low_day,1)
            # 更新极点
            zig = value
            self.save_temp(key+"high",value)
            self.save_temp(key+"high_day",self.cursor.index)
        
    # 低点阀值
    fz = 100 * (value - zig_high) / zig_high;
    if fz<=-N:
        zig_min = self.LLV(CLOSE, self.cursor.index-zig_high_day)
        if value<=zig_min:
            # 更新中间的zig值
            self.__ZIG(CLOSE,zig_high_day,0)
            # 更新极点
            zig = value
            self.save_temp(key+"low",value)
            self.save_temp(key+"low_day",self.cursor.index)

    # 最新一个k线值
    if(self.cursor.index==self.cursor.count-1):
        # 高点延续
        if zig_high_day>zig_low_day:
            # 更新中间的zig值
            self.__ZIG(CLOSE,zig_high_day,0)
            # 更新极点
            zig = value
            self.save_temp(key+"low",value)
            self.save_temp(key+"low_day",self.cursor.index)
        else:
            # 更新中间的zig值
            self.__ZIG(CLOSE,zig_low_day,1)
            # 更新极点
            zig = value
            self.save_temp(key+"high",value)
            self.save_temp(key+"high_day",self.cursor.index)
    
    return zig
       
    
def __ZIG(self:BaseSindexer,CLOSE,day,type=0):
    # 计算斜边长度
    first_value = self.GET(CLOSE,day)
    a = self.cursor.index - day
    b = first_value - self.GET(CLOSE)
    if(type>0):
        # 低到高
        b = self.GET(CLOSE) - first_value
    c = math.sqrt(a*a + b*b)
    # 计算b边长对向的角度,后面根据角度即可计算斜线c
    thetb = math.acos(a / c) * 180 / math.pi
    # 之前的低点位置全部为空
    for i in range(self.cursor.index-1,day,-1):
        a = i - day
        c = a / math.cos(thetb * math.pi / 180)
        b = first_value - math.sqrt(c ** 2 - a ** 2)
        if(type>0):
            b = first_value + math.sqrt(c ** 2 - a ** 2)
        # 更新之前的ZIG指标值
        subitem = self.klines[i]
        if hasattr(subitem,self.namespace):
            namespace = getattr(subitem,self.namespace)
            if namespace and self.variable_name:
                if hasattr(namespace,self.variable_name):
                    setattr(namespace,self.variable_name,b)
        

从ZIG指标的算法可以得知:转向点之间的极点值是会根据最新的K线值而变化的,例如当最新K线值不断突破高点的时候,新的极点值会不断被更新,直到不能被突破而产生最终的极点,从而趋势转向下跌,所以为什么我们称ZIG指标是未来函数,就是因为这个道理,ZIG的值会随着未来新K线数据的变化而变化。

思考

了解了ZIG的底层算法原理后,是不是就不那么迷恋技术指标了,当然了ZIG指标还是有一些参考价值的,它在趋势的转向上是有一定参考价值的,可以用来做趋势判断,或者做趋势套利,这个最好结合其他因子综合判断,主要是要规避未来数据的影响。

我们在入市操作中,还是要尽量避免使用未来函数指标,因为未来函数会带来极大的不确定性,想象一下在一个连续突破底线的下跌行情中,不断出现的买点是会让你破产的,一定要谨慎哦!

感觉有用就点赞关注收藏吧!