神秘的SAR抛物线转向指标是怎么实现的呢?各大平台为啥都处于保密状态呢,难道真的很重要吗?不见得吧!让我们来探个究竟。
我查阅了一下各大平台的SAR算法,感觉都不一样,因为基本上都是保密状态,算法也无从考究。但是都各家算法都遵从了基本的计算准则。经过博主的研究,归纳算法如下,如有出错,望指正哦。
看到这些抛物线似的小圆点,是不是觉得很神奇,感觉涨跌有序,反转点也挺准确啊,照着买是不是会发财,这里我由衷的告诉各位,千万不要这样做,虽然说这样的概率在有些股票也挺高,但是陷阱也挺深哦,你知道的庄家都知道,你不知道的庄家更知道。所以这里不说策略如何,只说说这个可爱的SAR抛物线是怎么算出来的。
简介
抛物转向指标,在股票领域,SAR(Stop and Reverse)是一种用于制定交易策略的指标,SAR指标是技术分析中一种常用的趋势追踪指标,它通常用于股票、期货等市场的短期交易中,下面是一些实现 SAR 指标的步骤:
计算方法
SAR 值:SARi = SARi-1 + AFi ×(EPi-1 - SARi-1 )
软件中一般用 SAR(4,2,20) 来计算,SAR(N,S,M) 其中 N=统计周期、S=加速因子增量、M=反向临界参数,S/100其实就是AF的每步增量,M/100就是AF的最大值
趋势判断
在计算之前,我们首先要确定一个趋势,就是周期N内,趋势是上涨还是下跌,通过开始周期和结束周期的收盘价,可以判断上涨还是下跌
趋势 = 当前周期收盘价 - 首周期收盘价
趋势大于0就是上涨趋势,反之是下跌趋势,计算第一个SAR值的时候可以这样计算。
需要注意的是,在连续计算SAR值的过程中,需要用当前周期收盘价跟上一个 SAR 做比较
趋势 = 当前周期收盘价 - 上个周期SAR值
EP 极值
EP (极点值)指的是股票价格运行趋势的最高点或最低点,如果当前趋势为上涨趋势,EP就是周期内最高点,反之如果当前趋势为下跌趋势,EP就是周期内最低点。
EP = 上涨趋势 ?周期内最高点 :周期内最低点
AF 加速因子
AF (加速因子),用于控制SAR指标曲线的变化速度,通常从0.02开始,每经过一定时间就会增加一次,直到最高值为0.2为止。在SAR指标中,AF的计算方法如下:
当前上涨趋势:
当前最高价>上一个周期最高价:
AF每次增加0.02,最高值为0.2 ,
当前为下跌趋势
当前最低价<上一个周期的最低价:
AF每次增加0.02,最高值为0.2
计算反转点
要注意反转的判断,我这里提出了两个判断依据,一个是对当前SAR值的反转判断,一个是对上一个SAR值的反转判断。
当前SAR反转点判断:
如果是上涨趋势,当前最低价小于等于SAR,表明SAR触碰了当前最低点,反转
如果是下跌趋势,当前最高价大于等于SAR,表明SAR触碰了当前最高点,反转
上一个SAR反转点判断:
如果前面是上涨趋势:上一个周期最低价小于等于上一个SAR,表明上一个SAR触碰了上一个周期最低点,本周期直接反转。
如果前面是下跌趋势:上一个周期最高价大于等于上一个SAR,表明上一个SAR触碰了上一个周期最高点,本周期直接反转。
这里的反转点有别于其他软件,为了更灵敏用了最低价最高价触碰SAR值的方式。其他软件会对这类触碰进行缓冲处理。
注意以上的反转点需要初始化SAR值和EP值
上涨反转到下跌:SAR=周期内最高价,EP=周期内最低价,AF=0
下跌反转到上涨:SAR=周期内最低价,EP=周期内最高价,AF=0
示例
以下是计算平安银行2023年3月23日时的日线SAR抛物线结果:
注意:本示例的算法与通达信同花顺等平台的算法有细小差别,因为各家平台算法均处于保密状态,但是计算方式大同小异,本算法仅供参考。
代码实现
以下是Python的部分代码实现
def SAR(self:BaseSindexer,N:int,S:int,M:int):
"""抛物转向
SAR(i)= SAR(i-1)+ AF(i)×(EP(i-1)- SAR(i-1))
SAR(N,S,M),N为计算周期,S为步长,M为极值
SAR(10,2,20)表示计算10日抛物转向,步长为2%,极限值为20%
"""
if self.cursor.index<N: return
# 这个key主要用来保存上一个计算值
last_key = ""+str(N)+"_"+str(S)+"_"+str(M)
# 取得第一个K线下标
start = max(0,self.cursor.index - N)
close = self.CLOSE
high = self.HIGH
low = self.LOW
# EP值
ep = 0
# AF值
af = 0.0
# SAR值
sar = 0
# 第一个收盘价
close_0 = self.GET("CLOSE",start)
# 若Tn周期为上涨趋势,EP(Tn-1)为Tn-1周期的最高价,若Tn周期为下跌趋势,EP(Tn-1)为Tn-1周期的最 低价;
max_high = self.HHV("HIGH",N)
min_low = self.LLV("LOW",N)
# 确定趋势
# 第一个T0日的趋势 上涨=1 下跌=0
# 初始值SAR(T0)的确定
# 若T1周期中SAR(T1)上涨趋势,则SAR(T0)为T0周期的最低价,若T1周期下跌趋势,则SAR(T0)为T0周期 的最高价;
qushi = True
if (close>close_0):
ep = max_high
qushi = True
# 看涨行情第一个sar为周期内的最低价
sar = min_low
else:
qushi = False
ep = min_low
# 看跌行情第一个sar为周期内的最高价
sar = max_high
# 上一个SAR值
last_sar = self.REF("SAR"+last_key)
# 这里会直接从计算第二个sar开始
if(last_sar) :
# 上一个趋势
ll_qushi = self.REF("QS"+last_key)
# 如果上涨趋势当前的最低价小于 sar ,则表明进入反转下跌
if ll_qushi and low<=last_sar:
ep = min_low
sar = max_high
af = 0
# 周期反转
qushi = not ll_qushi
elif not ll_qushi and high>=last_sar:
# 如果下跌趋势当前的最高价大于sar ,则表明进入反转上涨
ep = max_high
sar = min_low
af = 0
# 周期反转
qushi = not ll_qushi
else:
# 抛物线的趋势判断需要跟上一个sar值进行判断,跟第一个TO值趋势判断不同
# 当前收盘价>N日前的收盘价 看涨
# 极点价EP的确定
if close>last_sar:
ep = max_high
qushi = True
else:
qushi = False
ep = min_low
# 上一个周期的值
l_high = self.REF("HIGH")
l_low = self.REF("LOW")
last_af = self.REF("AF"+last_key)
last_ep = self.REF("EP"+last_key)
# 上涨趋势,最高价大于前一个最高价,af就根据步长递增,否则保持
if qushi:
if(high>l_high):
af = last_af + S/100
else:
af = last_af
# af最大值
if(af> M/100) : af = S/100
else:
# 下跌趋势,最低价小于前一个最低价,af就根据步长递增,否则保持
if(low<l_low):
af = last_af + S/100
else:
af = last_af
# af最大值
if(af> M/100) : af = S/100
# sar 计算公式
sar = last_sar + af*(last_ep - last_sar)
# 这里计算的当前sar值也要进行拐点判断,我们规定sar不能触碰最低价最高价,否则反转
if(qushi and low<=sar):
ep = min_low
sar = max_high
af = 0
qushi=not qushi
elif(not qushi and high>=sar):
# 如果下跌趋势当前的收盘价大于sar ,则表明进入反转上涨
ep = max_high
sar = min_low
af = 0
qushi=not qushi
self.save_temp("AF"+last_key,af)
self.save_temp("EP"+last_key,ep)
self.save_temp("QS"+last_key,qushi)
self.save_temp("SAR"+last_key,sar)
return sar
这里是指标框架里面的一部分代码,详细可参考开源指标公式编辑器 dsxindexer 开源仓库地址: https://github.com/dsxkline/dsxindexer
感觉有用,别忘了点赞收藏关注哦,感谢阅读!