Параболический SAR в Python .... PSAR продолжает расти, а не наоборот - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть пандас данных с ценами акций Open / High / Low / Close, и я пишу, чтобы написать функцию, которая добавит Parabolic SAR к моему фрейму данных.Прямо сейчас число PSAR просто растет безумно огромным, и я, кажется, никогда не получаю много с точки зрения переключения между направлениями быка и медведя.Любая помощь в понимании, почему мой PSAR становится настолько сумасшедшим, была бы великолепна.Я пробовал несколько вариантов этого кода, но безрезультатно.

Для тех, кто не знаком с PSAR:

  • Prior SAR: значение SAR за предыдущий период.

Восходящий SAR

  • Экстремальная точка (EP): наивысший максимум текущего восходящего тренда.
  • Коэффициент ускорения (AF):Начиная с 0,02, AF увеличивается на 0,02 каждый раз, когда крайняя точка устанавливает новый максимум.AF может достигать максимума .20 независимо от того, как долго продолжается восходящий тренд.
  • Коэффициент ускорения умножается на разницу между крайней точкой и SAR предыдущего периода.Затем это добавляется к SAR предыдущего периода.Однако обратите внимание, что SAR никогда не может быть выше минимумов предыдущих двух периодов.Если SAR будет выше одного из этих минимумов, используйте для SAR наименьшее из двух значений.

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

Например: 13-Apr-10: SAR = 48,28 = 48,13 + .14 (49,20 - 48,13)

Падающий SAR

  • Экстремальная точка (EP): наименьший минимум текущий нисходящий тренд.
  • Коэффициент ускорения (AF): Начиная с 0,02, AF увеличивается на 0,02 каждый раз, когда крайняя точка устанавливает новый минимум.AF может достигать максимума .20 независимо от того, как долго продолжается нисходящий тренд.
  • Коэффициент ускорения умножается на разницу между SAR предыдущего периода и экстремальной точкой.Затем это вычитается из SAR предыдущего периода.Однако обратите внимание, что SAR никогда не может быть ниже максимумов двух предыдущих периодов.Если SAR будет ниже одного из этих максимумов, используйте для SAR наивысшее из двух значений:

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

Например: 9 февраля 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

1 Ответ

0 голосов
/ 01 марта 2019

понял это 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 дней

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...