【发布时间】: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