ATR是给定时期内真实范围的平均值。真实范围是(高 - 低)意味着我已使用以下方法计算:
var str = XDocument.Parse("<?xml version=\"1.0\" encoding=\"utf-8\" ?><mail> <id>signUpConfirmation</id> <subject>Activation</subject> <body>Hi, You account is activated \nRegards</body></mail>");
var result = from mail in str.Elements("mail")
where (string)mail.Element("id") == "signUpConfirmation"
select mail.Element("body");
result.FirstOrDefault();
然而,如果需要短时间段(或上述示例中的“距离”),则ATR可能非常跳跃,即在某些数字之间出现大的零星间隙。
真正的ATR方程通过执行以下操作来识别并平滑它:
df['High'].subtract(df['Low']).rolling(distance).mean()
但是我不确定如何以与上面相同的方式执行此操作,即以列宽操作。
样本数据包括我原始方法中的TR和ATR(10):
Current ATR = [(Prior ATR x 13) + Current TR] / 14
答案 0 :(得分:3)
这不是TR的正确计算 - ATR,但这是我将如何做的:
其中alpha = 2 /(span + 1)
df['ATR'] = df['TR'].ewm(span = 10).mean()
否则你应该可以很容易地做到这样的平滑:
df['ATR'] = ( df['ATR'].shift(1)*13 + df['TR'] ) / 14
答案 1 :(得分:1)
对于正在寻找如何执行此操作的其他人,这是我的答案。
def wwma(values, n):
"""
J. Welles Wilder's EMA
"""
return values.ewm(alpha=1/n, adjust=False).mean()
def atr(df, n=14):
data = df.copy()
high = data[HIGH]
low = data[LOW]
close = data[CLOSE]
data['tr0'] = abs(high - low)
data['tr1'] = abs(high - close.shift())
data['tr2'] = abs(low - close.shift())
tr = data[['tr0', 'tr1', 'tr2']].max(axis=1)
atr = wwma(tr, n)
return atr