2016-11-17 67 views
0

在计算系列的平均真实范围[ATR]时,我被卡住了。 ATR基本上TrueRange的精通企图不平均[TR]需要PandasDataSeries上的平均真实范围和指数移动平均函数

TR is nothing but MAX of - 
     Method 1: Current High less the current Low 
     Method 2: Current High less the previous Close (absolute value) 
     Method 3: Current Low less the previous Close (absolute value) 

在熊猫我们没有一个内置的EMA功能。相反,我们有EWMA这是一个加权移动平均数。

如果有人可以帮助计算EMA,也将是足够好的

 def ATR(df,n): 
      df['H-L']=abs(df['High']-df['Low']) 
      df['H-PC']=abs(df['High']-df['Close'].shift(1)) 
      df['L-PC']=abs(df['Low']-df['Close'].shift(1)) 
      df['TR']=df[['H-L','H-PC','L-PC']].max(axis=1) 
      df['ATR_' + str(n)] =pd.ewma(df['TR'], span = n, min_periods = n) 
      return df 

上面的代码犯规给错误,但它也犯规要么放弃正确的价值观。我用手动在Excel中对同一dataseries计算ATR值相比较它和值分别为不同

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

      - Multiply the previous 14-day ATR by 13. 
      - Add the most recent day's TR value. 
      - Divide the total by 14 

这是我作为一个样本dataseries

  start='2016-1-1' 
      end='2016-10-30' 
      auro=web.DataReader('AUROPHARMA.NS','yahoo',start,end) 

回答

1

您确实需要使用EWMA 在这里看到:指数移动平均线(EMA)是一种类似于简单移动平均线的移动平均线,除了给予最新数据更多的权重之外。

了解更多:指数移动平均线(EMA)http://www.investopedia.com/terms/e/ema.asp#ixzz4ishZbOGx

我不认为你的Excel公式是正确的...这是计算EMA在python

def exponential_average(values, window): 
    weights = np.exp(np.linspace(-1.,0.,window)) 
    weights /= weights.sum() 

    a = np.convolve(values, weights) [:len(values)] 
    a[:window]=a[window] 
    return a 
0

scipy.signal.lfilter可以帮助您以手动方式。

scipy.signal.lfilter(b, a, x, axis=-1,zi=None) 

该过滤功能被实现为直接II转置结构。这意味着该滤波器实现:

a[0]*y[n] = b[0]*x[n] + b[1]*x[n-1] + ... + b[M]*x[n-M] 
         - a[1]*y[n-1] - ... - a[N]*y[n-N] 

如果我们正常化上述公式中,可以得到以下之一:

y[n] = b'[0]*x[n] + b'[1]*x[n-1] + ... + b'[M]*x[n-M] 
        - a'[1]*y[n-1] + ... + a'[N]*y[n-N] 

其中b'[i] = b[i]/a[0], i = 0,1,...,M; a'[j] = a[j]/a[0],j = 1,2,...,Na'[0] = 1

指数移动平均计算公式:

y[n] = alpha*x[n] + (1-alpha)*y[n-1] 

所以申请scipy.signal.lfilter,由上面的公式,我们可以设置一个与如下B:

a[0] = 1, a[1] = -(1-alpha) 
b[0] = alpha 

我实现如下,希望能帮助你。

def ema(values, window_size): 
    alpha = 2./ (window_size + 1) 
    a = np.array([1, alpha - 1.]) 
    b = np.array([alpha]) 
    zi = sig.lfilter_zi(b, a) 
    y, _ = sig.lfilter(b, a, values, zi=zi) 
    return y