2016-11-17 69 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