2016-05-02 3 views
2

Я пытаюсь реализовать коэффициент эффективности Kaufman (ER) в Python с Pandas.Расчет коэффициента эффективности Кауфмана в Python с Pandas?

В панды DataFrame, у меня есть две колонки:

  1. Дата
  2. Цена закрытия запаса (немецкий индекс DAX,^GDAXI, в данном примере):
 
    Date  Close 
    2016-01-05 10310.10 
    2016-01-06 10214.02 
    2016-01-07 9979.85 
    2016-01-08 9849.34 
    2016-01-11 9825.07  
    2016-01-12 9985.43  
    2016-01-13 9960.96  
    2016-01-14 9794.20 

Мне нужен третий столбец, который включает в себя ER для заданного периода n.

Определение ER:

ER = Direction/Volatility 

Где:

Direction = ABS (Close – Close[n]) 
Volatility = n * ∑ (ABS(Close – Close[1])) 
n = The efficiency ratio period. 

Вот пример = 3 периода ER (взяты из http://etfhq.com/blog/2011/02/07/kaufmans-efficiency-ratio/):

ER-Calculation

С чем я боюсь, как это сделать в Python с Pandas? В конце концов, мой dataframe должен выглядеть следующим образом, в соответствии с расчетом выше:

 
Date  Adj Close ER(3) 
2016-01-04 10283.44  
2016-01-05 10310.10  
2016-01-06 10214.02  
2016-01-07 9979.85  0.9 
2016-01-08 9849.34  1.0 
2016-01-11 9825.07  1.0 
2016-01-12 9985.43  0.0 
2016-01-13 9960.96  0.5 
2016-01-14 9794.20  0.1 

Как сделать панда, чтобы оглянуться назад на предыдущем п строки для расчета необходимого для ER?

Любая помощь очень ценится! Спасибо заранее. Dirk

+1

Не похоже, что вы действительно пробовали. По крайней мере, у вас есть данные в рамке данных pandas? Если это так, пожалуйста, покажите фрагмент в качестве примера. А затем покажите, какой будет результат для этого примера. – IanS

+0

Привет, Ян, спасибо за предложение добавить срез блока данных. Сообщение обновлено соответствующим образом. Я попытался - и я в порядке с основными (катящимися) функциями в Pandas, но не могу понять, как создать функцию качения самостоятельно - я считаю, что это то, что в конечном итоге необходимо. – user1653205

ответ

3

Нет необходимости писать качению функцию, просто используйте diff и rolling_sum:

df['direction'] = df['Close'].diff(3).abs() 
df['volatility'] = pd.rolling_sum(df['Close'].diff().abs(), 3) 

Я думаю, что код довольно много разъяснений. Пожалуйста, дайте мне знать, если вы хотите объяснений.

In [11]: df['direction']/df['volatility'] 
Out[11]: 
0   NaN 
1   NaN 
2   NaN 
3 1.000000 
4 1.000000 
5 0.017706 
6 0.533812 
7 0.087801 
dtype: float64 

Это похоже на то, что вы ищете.

+1

Рад, что я мог помочь. В следующий раз вы также должны включить любой код, который вы написали, вместе с сообщениями об ошибках. Люди с большей вероятностью помогут, если они увидят, что вы пробовали. – IanS