如何计算真实范围

how to calculate true range

在技术分析中,真实范围是高点和低点之间的差异加上交易时段之间出现的任何差距。因此,如果今天的高点是 10,低点是 9,范围是 1。如果昨天收盘价是 9.5,那么真实范围也是 1,但是如果昨天收盘价是 11,那么真实范围是 2。

我有一个按日期索引的 pandas 数据框,所以范围很简单:

df['range'] = df['High'] - df['Low']

真正的范围是这样的:

df['tr'] = max(df['High'], df['Close'].shift(1)) - min(df['Low'], df['Close'].shift(1))

但是max()min()不适用于pandas数据帧。 我如何引用前一行的 'Close' 来创建列 'tr'?

def calculate_true_range(a,b,c):
    true_range = max(a, b.shift(1)) - min(c, b.shift(1))
    return true_range


df['tr'] = df.apply(lambda row : calculate_true_range(row['High'], row['Close'], row['Low'], axis = 1)

这是另一种方法,假设您的 DataFrame 仅包含 OHLC 数据:

data = df.drop("Open", axis=1)
data.Close = data.Close.shift()
true_range = data.max(1) - data.min(1)

一些解释:如果您将 Close 列移动到位,则真实范围变为 maxmin 值之间的差异(按行)。

使用pd.concat获取每个系列的最小值和最大值:

df['tr'] = pd.concat([df['High'], df['Close'].shift()], axis=1).max(axis=1) \
           - pd.concat([df['Low'], df['Close'].shift()], axis=1).min(axis=1)

以上所有三个答案都可以计算真实范围。真实极差通常用于平均真实极差。一个典型的用法示例是 Chandelier stops。

atrLength = 10

data['atr'] = data['tr'].rolling(window=atrLength).mean()