【问题标题】:Parabolic SAR in Python....PSAR keep growing instead of reversingPython中的抛物线SAR ....PSAR不断增长而不是逆转
【发布时间】:2019-07-21 22:38:01
【问题描述】:

我有一个开盘/高/低/收盘价的 pandas 数据框,我正在写一个函数,将抛物线 SAR 添加到我的数据框。现在,PSAR 数字变得异常庞大,而在牛市和熊市方向之间的转换方面,我似乎从来没有得到太多。任何有助于理解为什么我的 PSAR 变得如此疯狂的帮助都会很棒。我已经对此代码尝试了几种变体,但均无济于事。

对于不熟悉 PSAR 的人:

  • 上一时期的 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 低于其中一个高点,请使用两者中的最高点作为 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

【问题讨论】:

  • PSAR 得到了很好的解释。如果您可以详细说明您面临的问题以及您在代码方面需要哪些帮助,我们可以为您提供帮助。我是一名交易员,我想编写软件来帮助其他交易员。我很乐意提供帮助。
  • 当我运行此程序时,我的 PSAR 值会不断增长,不断增长......达到数百万和数十亿......这显然是不正确的。我盯着我的代码看,似乎无法弄清楚我做错了什么。

标签: python finance quantitative-finance


【解决方案1】:

想通了捂脸

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 天

【讨论】:

  • 太好了,顺便说一句,您从哪里获得 OHLC 值..?您是手动输入这些值还是有办法从网络将这些值输入我们的程序?
  • 有多种 API 可用。我是通过我的经纪人。
  • 你得到这个工作的最终版本了吗?我还在跌落悬崖......你能分享你的工作代码吗?
  • 在我的情况下,该功能不起作用......当然,我改变了上面的行。你有工作版本吗?
【解决方案2】:

我将您的函数编辑如下:

就我而言,我的数据框索引是日期时间,所以我将所有 a 转换为 df.index[a]a-1 转换为 df.index[a-1]。我还更改了AF,PSAR,EP,PSARdir 列,因为所有行值都将被初始化为相同,例如df['AF'] =0.02

def addSAR(df):
    df['AF'] =0.02
    df['PSAR'] = df['Low']
    df['EP'] = df['High']
    df['PSARdir'] = "bull"

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

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

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

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

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

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



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

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

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

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

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

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

    return df

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2013-12-09
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多