Python中的抛物线SAR ...... PSAR继续增长而不是逆转

问题描述 投票:1回答:1

我有一个开放/高/低/收盘价的熊猫数据框,我写的是编写一个函数,将抛物线SAR添加到我的数据帧。现在,PSAR数字刚刚变得非常庞大,而且在牛市和熊市方向之间的翻转方面,我似乎也没有太多变化。任何帮助理解为什么我的PSAR变得如此疯狂将是伟大的。我试过这个代码的几个变种无济于事。

对于那些不熟悉PSAR的人:

  • 先前SAR:前一时期的SAR值。

上升的星

  • 极端点(EP):当前上升趋势的最高点。
  • 加速因子(AF):从.02开始,每当极值点达到新的高点时,AF增加.02。无论上升趋势延伸多长时间,AF都可以达到最大值.20。
  • 加速因子乘以极值点和前一个周期的SAR之间的差值。然后将其添加到前一时期的SAR中。但请注意,SAR永远不会超过前两个时期的低点。如果SAR高于其中一个低点,请使用SAR中的最低值。 Current SAR = Prior SAR + Prior AF(Prior EP - Prior SAR)

例如:13-Upper-10:爵士= 48.28 = 48.13 + .14(49.20 - 48.13)

堕落的先生

  • 极端点(EP):当前下行趋势的最低点。
  • 加速因子(AF):从.02开始,每当极值点达到新的低点时,AF增加.02。无论下降趋势延伸多长时间,AF都可以达到最大值.20。
  • 加速因子乘以前期SAR和极值点之间的差值。然后从前一个时期的SAR中减去。但请注意,SAR永远不会低于前两个时期的高点。如果SAR低于其中一个高点,请使用SAR中最高的两个。 Current SAR = Prior SAR - Prior AF(Prior EP - Prior SAR)

例如:9月2日至10日: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
python finance quantitative-finance
1个回答
2
投票

想通了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天

© www.soinside.com 2019 - 2024. All rights reserved.