Python中的抛物线SAR…PSAR不断增长而不是逆转

2024-05-13 09:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas的开盘/高/低/收盘股价数据框,我正在写一个函数,将抛物线SAR添加到我的数据框。现在,PSAR的数量增长得惊人的巨大,我似乎从来没有在牛市和熊市之间来回切换。任何有助于理解为什么我的PSAR变得如此疯狂将是伟大的。我试过几种不同的代码,但都没有用。在

对于不熟悉PSAR的人:

  • previor SAR:上期的SAR值。在

上升SAR

  • 极值点(EP):当前上升趋势的最高点。在
  • 加速因子(AF):从0.02开始,每次极值点达到一个新的高点,AF就会增加0.02。无论上升趋势持续多久,AF最高可达0.20。在
  • 加速度系数乘以极值点与上期SAR之差。然后将其添加到上期的SAR中。但是请注意,SAR永远不会高于前两个时期的低点。如果SAR高于其中一个低点,则使用两个最低的SAR。在

    Current SAR = Prior SAR + Prior AF(Prior EP - Prior SAR)

例如:2010年4月13日:SAR=48.28=48.13+.14(49.20-48.13)

下降SAR

  • 极值点(EP):当前下降趋势的最低点。在
  • 加速因子(AF):从0.02开始,每次极值点创下新低,AF增加0.02。无论下降趋势持续多久,AF最高可达0.20。在
  • 加速度系数乘以前期SAR与极值点之间的差值。然后从前期的SAR中减去。但是请注意,SAR永远不会低于前两个时期的高点。SAR应该是两个最高点中的一个。在

    Current SAR = Prior SAR - Prior AF(Prior EP - Prior SAR)

例如:2010年2月9日:SAR=43.56=43.84-.16(43.84-42.07)

在反转过程中,PSAR成为先前的极值点EP,而新的EP是先前的高点或低点,这取决于反转的方向。AF重置为0.02。在

我的职能:

def addSAR(df):
    df.loc[0, 'AF'] =0.02
    df.loc[0, 'PSAR'] = df.loc[0, 'low']
    df.loc[0, 'EP'] = df.loc[0, 'high']
    df.loc[0, 'PSARdir'] = "bull"

    for a in range(1, len(df)):

        if df.loc[a-1, 'PSARdir'] == 'bull':

            df.loc[a, 'PSAR'] = df.loc[a-1, 'PSAR'] + (df.loc[a-1, 'AF']*(df.loc[a-1, 'EP']-df.loc[a-1, 'PSAR']))            

            df.loc[a, 'PSARdir'] = "bull"

            if df.loc[a, 'low'] < df.loc[a-1, 'PSAR']:
                df.loc[a, 'PSARdir'] = "bear"
                df.loc[a, 'PSAR'] = df.loc[a-1, 'EP']
                df.loc[a, 'EP'] = df.loc[a-1, 'low']
                df.loc[a, 'AF'] = .02

            else:
                if df.loc[a, 'high'] > df.loc[a-1, 'EP']:
                    df.loc[a, 'EP'] = df.loc[a, 'high']
                    if df.loc[a-1, 'AF'] <= 0.18:
                        df.loc[a, 'AF'] =df.loc[a-1, 'AF'] + 0.02
                    else:
                        df.loc[a, 'AF'] = df.loc[a-1, 'AF']
                elif df.loc[a, 'high'] <= df.loc[a-1, 'EP']:
                    df.loc[a, 'AF'] = df.loc[a-1, 'AF']
                    df.loc[a, 'EP'] = df.loc[a-1, 'EP']               



        elif df.loc[a-1, 'PSARdir'] == 'bear':

            df.loc[a, 'PSAR'] = df.loc[a-1, 'PSAR'] - (df.loc[a-1, 'AF']*(df.loc[a-1, 'EP']-df.loc[a-1, 'PSAR']))

            df.loc[a, 'PSARdir'] = "bear"

            if df.loc[a, 'high'] > df.loc[a-1, 'PSAR']:
                df.loc[a, 'PSARdir'] = "bull"
                df.loc[a, 'PSAR'] = df.loc[a-1, 'EP']
                df.loc[a, 'EP'] = df.loc[a-1, 'high']
                df.loc[a, 'AF'] = .02

            else:
                if df.loc[a, 'low'] < df.loc[a-1, 'EP']:
                    df.loc[a, 'EP'] = df.loc[a, 'low']
                    if df.loc[a-1, 'AF'] <= 0.18:
                        df.loc[a, 'AF'] = df.loc[a-1, 'AF'] + 0.02
                    else:
                        df.loc[a, 'AF'] = df.loc[a-1, 'AF']

                elif df.loc[a, 'low'] >= df.loc[a-1, 'EP']:
                    df.loc[a, 'AF'] = df.loc[a-1, 'AF']
                    df.loc[a, 'EP'] = df.loc[a-1, 'EP']           

    return df

Tags: dfifelse趋势loclowepaf
1条回答
网友
1楼 · 发布于 2024-05-13 09:26:31

找到了Facepalm

df.loc[a, 'PSAR'] = df.loc[a-1, 'PSAR'] + (df.loc[a-1, 'AF']*(df.loc[a-1, 'EP']-df.loc[a-1, 'PSAR'])) 

应该是df.loc[a, 'PSAR'] = df.loc[a-1, 'PSAR'] + (df.loc[a-1, 'AF']*(df.loc[a-1, 'PSAR']-df.loc[a-1, 'EP']))

最后两个变量换位了!多痛苦啊。。。在

现在我可以清理函数并使其更好。。在

希望这能帮助其他人避免做一些愚蠢的事情,并坚持2天

相关问题 更多 >