使用Python计算OHLC数据的平均真实范围(ATR)

时间:2016-10-26 07:37:12

标签: python pandas dataframe

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

2 个答案:

答案 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

Pandas ewm

答案 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