揭秘股票SAR抛物线指标算法

神秘的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

感觉有用,别忘了点赞收藏关注哦,感谢阅读!