python - Python中的抛物线SAR ....PSAR不断增长而不是逆转
问题描述
我有一个开盘/高/低/收盘价的熊猫数据框,我正在写一个函数,将抛物线 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 是先前的高点或低点,具体取决于翻转的方向。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
解决方案
想通了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']))
最后两个变量转置!多么痛苦……
现在我可以清理功能并使其更好..
希望这可以帮助其他人避免做一些愚蠢的事情并卡在上面两天
推荐阅读
- javascript - 如何通过单击javascript中的项目符号来显示图像?
- php - 如何在 PHP 文件中获取当前 wordpress 主题的页眉和页脚?
- ios - 滚动后在 UITableView 单元格中无法再次点击 Facebook 原生广告
- javascript - jQuery on textarea selectionchange
- html - 关于为什么我的容器与我的标题重叠的任何想法?
- python - 调用 gnuplot 时如何保持 PyQt5 响应?
- mysql - SQL Query根据不同的单价,不同时间的数量获取总值
- docker - 如何在运行 .net Core 模板的 Windows Docker 容器和 Windows 主机中安装开发证书?
- javascript - 合并两个自定义 javascript 函数
- jquery - 将资源动态添加到 fullcalendar