Python 中的抛物线 SAR ......PSAR 保持增长而不是反转
Parabolic SAR in Python....PSAR keep growing instead of reversing
我有一个 pandas 股票价格的 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)
特区下降
- 极点 (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 是先前的高点或低点,具体取决于翻转的方向。自动对焦重置为 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
想通了 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 天
我按如下方式编辑了你的函数:
就我而言,我的数据框索引是日期时间,所以我将所有 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
我更新了脚本,修复了 PSAR 值增加以及 PSAR 与 high/low 价格重叠的错误。
现在此函数提供与 TradingView 完全相同的 PSAR。
def PSAR(df, af=0.02, max=0.2):
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'] or df.loc[a, 'low'] < df.loc[a, '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'] = af
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'] + af
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, 'PSAR']-df.loc[a-1, 'EP']))
df.loc[a, 'PSARdir'] = "bear"
if df.loc[a, 'high'] > df.loc[a-1, 'PSAR'] or df.loc[a, 'high'] > df.loc[a, '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'] = af
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'] < max:
df.loc[a, 'AF'] = df.loc[a-1, 'AF'] + af
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
我有一个 pandas 股票价格的 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)
特区下降
- 极点 (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 是先前的高点或低点,具体取决于翻转的方向。自动对焦重置为 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
想通了 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 天
我按如下方式编辑了你的函数:
就我而言,我的数据框索引是日期时间,所以我将所有 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
我更新了脚本,修复了 PSAR 值增加以及 PSAR 与 high/low 价格重叠的错误。
现在此函数提供与 TradingView 完全相同的 PSAR。
def PSAR(df, af=0.02, max=0.2):
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'] or df.loc[a, 'low'] < df.loc[a, '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'] = af
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'] + af
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, 'PSAR']-df.loc[a-1, 'EP']))
df.loc[a, 'PSARdir'] = "bear"
if df.loc[a, 'high'] > df.loc[a-1, 'PSAR'] or df.loc[a, 'high'] > df.loc[a, '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'] = af
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'] < max:
df.loc[a, 'AF'] = df.loc[a-1, 'AF'] + af
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