简介
ZIG指标又称ZigZag指标,中文名叫之字转向,在各大金融平台都有它的身影,如果你是第一次接触这个指标,你会发现它非常神奇,它能准确找到K线趋势上的顶底点,这个时候你心里肯定会想,如果按照ZIG顶底点的趋势去买入卖出,岂不是赚大发了,如果有这种想法,奉劝各位再三思量啊,所以我们有必要深入了解ZIG底层算法是如何计算的,然后再做入市的打算,入市一定要谨慎呀。了解底层原理才能做到泰然自若稳操胜券哦!
从上图可以看出,ZIG转向非常精准,单单从图片上看,买卖点信号非常明显,几乎百分百胜率,如果计算回测,收益率爆棚啊,哈哈。当然了,不要开心的那么早哦,亮个算法来给我们泼泼冷水先。
ZIG算法
ZIG算法主要是计算高低极点位置:
- 如果当前价格突破了最后一个高点,则将当前价格标记为新的高点,并且之前的所有低点被忽略。
- 如果当前价格跌破了最后一个低点,则将当前价格标记为新的低点,并且之前的所有高点被忽略。
- 在趋势转折点处,将前一段时间内的价格极值点进行合并,形成一条新的折线。
通常价格的突破设置一个百分比幅度,例如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指标还是有一些参考价值的,它在趋势的转向上是有一定参考价值的,可以用来做趋势判断,或者做趋势套利,这个最好结合其他因子综合判断,主要是要规避未来数据的影响。
我们在入市操作中,还是要尽量避免使用未来函数指标,因为未来函数会带来极大的不确定性,想象一下在一个连续突破底线的下跌行情中,不断出现的买点是会让你破产的,一定要谨慎哦!
感觉有用就点赞关注收藏吧!