Python pandas在更高的时间范围内计算ATR而无需重新采样

时间:2018-03-28 22:04:56

标签: python pandas dataframe stocks

我的数据帧为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

请帮我优化功能。

0 个答案:

没有答案