我的数据帧为1分钟。我想计算更高时间帧的AverageTruerange指标而不重新数据。我提出了以下解决方案,但它很慢。
tf - 更高的时间范围,n = ATR的回顾,OHLC提供更高的时间帧蜡烛。
def ATR(df, tf, n):
ha_o = 'open_' + str(tf)
ha_h = 'high_' + str(tf)
ha_l = 'low_' + str(tf)
ha_c = 'close_' + str(tf)
df = OHLC(df, tf, n)
df['p_close'] = df[ha_c].shift(tf)
TR = df[ha_h] - df[ha_l]
df['TR'] = TR
df['TR_avg'] = np.nan
atr_label = 'ATR_' + str(tf) + '_' + str(n)
df[atr_label] = np.nan
i = tf*n
while i <= df.index[-1]:
TR_sum = 0
j = 0
while j < n:
TR_sum += TR.at[i-j*tf]
j += 1
TR_sum /= n
df.at[(i, 'TR_avg')] = TR_sum
df.at[(i, atr_label)] = (TR.at[i] + (n-1)*df.at[(i-tf, 'TR_avg')])/n
i = i + 1
return df
我已经看到下面的熊猫ATR功能在1分钟内效果很好。但是我想在10/15分钟计算。
def ATR(df, tf, n):
i = 0
TR_l = [0]
while i < df.index[-1]:
TR = max(df.get_value(i + 1, 'high'), df.get_value(i, 'close')) - min(df.get_value(i + 1, 'low'), df.get_value(i, 'close'))
TR_l.append(TR)
i = i + 1
df['ATR_' + str(tf) + '_' + str(n)] = Series(TR_l).ewm(ignore_na=False,span=1,min_periods=tf*n,adjust=False).mean()
return df
请帮我优化功能。