2

如何仅使用 numpy 计算平均真实范围(ATR)?我更喜欢最快的方式。

Atr计算:

在此处输入图像描述

熊猫和 Numpy:

import numpy as np
import pandas as pd

high_low = data['High'] - data['Low']
high_close = np.abs(data['High'] - data['Close'].shift())
low_close = np.abs(data['Low'] - data['Close'].shift())

ranges = pd.concat([high_low, high_close, low_close], axis=1)
true_range = np.max(ranges, axis=1)

atr = true_range.rolling(14).sum()/14
4

1 回答 1

0

你可以试试这个,使用np.amax和定义my_shift而不是使用shift() from pandas

import numpy as np
from copy import deepcopy

def my_shift(my_list):
    for i in range(len(my_list)-1, -1, -1):
        if i == 0:
            my_list[i] = float('nan')
        else:
            my_list[i] = my_list[i-1]
    return my_list


high_low = data['High'] - data['Low']
high_close = np.abs(data['High'] - my_shift(deepcopy(data['Close'])))
low_close = np.abs(data['Low'] - my_shift(deepcopy(data['Close'])))


a = np.array([high_low,high_close,low_close])
TR = np.amax(a,0)
ATR = list()
rolling = 14
for i in range(len(TR)):
    ATR.append(np.sum(TR[((i+1)-rolling):(i+1)])/rolling)
ATR
于 2021-08-09T16:42:35.610 回答