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

2024-01-29

ATR 是给定时期真实波幅的平均值。真实范围是(高-低),这意味着我已经用以下公式计算了这一点:

df['High'].subtract(df['Low']).rolling(distance).mean()

然而,如果需要较短的周期(或上例中的“距离”),ATR 可能会非常跳跃,即某些数字之间会出现较大的零星间隙。

真正的 ATR 方程认识到这一点并通过执行以下操作来平滑它:

Current ATR = [(Prior ATR x 13) + Current TR] / 14

但是我不确定如何以与上面相同的方式执行此操作,即列宽操作。

示例数据包括来自我原始方法的 TR 和 ATR(10):

Date        Time            Open    High    Low     Close   TR      ATR
30/09/16    14:45:00+00:00  1.1216  1.1221  1.1208  1.1209  0.0013  0.0013
30/09/16    15:00:00+00:00  1.1209  1.1211  1.1203  1.1205  0.0008  0.0013
30/09/16    15:15:00+00:00  1.1205  1.1216  1.1204  1.1216  0.0012  0.0013
30/09/16    15:30:00+00:00  1.1217  1.1222  1.1213  1.1216  0.0008  0.0013
30/09/16    15:45:00+00:00  1.1216  1.1240  1.1216  1.1240  0.0025  0.0015
30/09/16    16:00:00+00:00  1.1239  1.1246  1.1228  1.1242  0.0019  0.0015
30/09/16    16:15:00+00:00  1.1242  1.1251  1.1235  1.1240  0.0016  0.0016
30/09/16    16:30:00+00:00  1.1240  1.1240  1.1234  1.1236  0.0007  0.0014
30/09/16    16:45:00+00:00  1.1237  1.1245  1.1235  1.1238  0.0009  0.0012
30/09/16    17:00:00+00:00  1.1238  1.1239  1.1231  1.1233  0.0008  0.0012
30/09/16    17:15:00+00:00  1.1233  1.1245  1.1232  1.1240  0.0013  0.0012
30/09/16    17:30:00+00:00  1.1240  1.1242  1.1228  1.1230  0.0013  0.0013
30/09/16    17:45:00+00:00  1.1230  1.1230  1.1221  1.1227  0.0009  0.0013
30/09/16    18:00:00+00:00  1.1227  1.1232  1.1227  1.1232  0.0005  0.0012
30/09/16    18:15:00+00:00  1.1232  1.1232  1.1227  1.1227  0.0005  0.0010
30/09/16    18:30:00+00:00  1.1227  1.1231  1.1225  1.1231  0.0006  0.0009
30/09/16    18:45:00+00:00  1.1231  1.1237  1.1230  1.1232  0.0007  0.0008
30/09/16    19:00:00+00:00  1.1232  1.1233  1.1229  1.1231  0.0004  0.0008
30/09/16    19:15:00+00:00  1.1231  1.1234  1.1230  1.1230  0.0004  0.0007
30/09/16    19:30:00+00:00  1.1231  1.1234  1.1230  1.1234  0.0004  0.0007
30/09/16    19:45:00+00:00  1.1233  1.1240  1.1230  1.1239  0.0010  0.0007
30/09/16    20:00:00+00:00  1.1239  1.1242  1.1237  1.1238  0.0005  0.0006
30/09/16    20:15:00+00:00  1.1238  1.1240  1.1235  1.1237  0.0005  0.0006
30/09/16    20:30:00+00:00  1.1237  1.1238  1.1235  1.1235  0.0003  0.0005
30/09/16    20:45:00+00:00  1.1235  1.1236  1.1233  1.1233  0.0003  0.0005
30/09/16    21:00:00+00:00  1.1233  1.1238  1.1233  1.1237  0.0006  0.0005
30/09/16    21:15:00+00:00  1.1237  1.1244  1.1237  1.1242  0.0008  0.0005
30/09/16    21:30:00+00:00  1.1242  1.1243  1.1239  1.1239  0.0004  0.0005
30/09/16    21:45:00+00:00  1.1239  1.1244  1.1236  1.1241  0.0008  0.0006

对于其他正在寻找如何做到这一点的人,这是我的答案。

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐