2016-02-12 2 views
2

Я это dataframeРасчет кумулятивных возвращения с панды dataframe

Poloniex_DOGE_BTC Poloniex_XMR_BTC Daily_rets perc_ret 
172 0.006085 -0.000839 0.003309 0 
173 0.006229 0.002111 0.005135 0 
174 0.000000 -0.001651 0.004203 0 
175 0.000000 0.007743 0.005313 0 
176 0.000000 -0.001013 -0.003466 0 
177 0.000000 -0.000550 0.000772 0 
178 0.000000 -0.009864 0.001764 0 

Я пытаюсь сделать бегущую общей сложности daily_rets в perc_ret

однако мой код просто копирует значения из daily_rets

df['perc_ret'] = ( df['Daily_rets'] + df['perc_ret'].shift(1)) 


Poloniex_DOGE_BTC Poloniex_XMR_BTC Daily_rets perc_ret 
172 0.006085 -0.000839 0.003309 NaN 
173 0.006229 0.002111 0.005135 0.005135 
174 0.000000 -0.001651 0.004203 0.004203 
175 0.000000 0.007743 0.005313 0.005313 
176 0.000000 -0.001013 -0.003466 -0.003466 
177 0.000000 -0.000550 0.000772 0.000772 
178 0.000000 -0.009864 0.001764 0.001764 
+0

Я думаю, вы только столбец 'shift', заполненный' 0', поэтому это означает только копии 'Daily_rets' с первым' NaN' (после сдвига virst значение 'NaN') – jezrael

ответ

0

Я думаю, что вам необходимо cumsum:

Пример:

s = pd.Series([0,1,2,3]) 
print s.cumsum() 
0 0 
1 1 
2 3 
3 6 
dtype: int64 

Ваши данные:

print df['Daily_rets'].cumsum() 
172 0.003309 
173 0.008444 
174 0.012647 
175 0.017960 
176 0.014494 
177 0.015266 
178 0.017030 
Name: Daily_rets, dtype: float64 

df['perc_ret'] = df['Daily_rets'].cumsum() 
print df 
    Poloniex_DOGE_BTC Poloniex_XMR_BTC Daily_rets perc_ret 
172   0.006085   -0.000839 0.003309 0.003309 
173   0.006229   0.002111 0.005135 0.008444 
174   0.000000   -0.001651 0.004203 0.012647 
175   0.000000   0.007743 0.005313 0.017960 
176   0.000000   -0.001013 -0.003466 0.014494 
177   0.000000   -0.000550 0.000772 0.015266 
178   0.000000   -0.009864 0.001764 0.017030 

Вы делаете:

print df 
    Poloniex_DOGE_BTC Poloniex_XMR_BTC Daily_rets perc_ret 
172   0.006085   -0.000839 0.003309   0 
173   0.006229   0.002111 0.005135   0 
174   0.000000   -0.001651 0.004203   0 
175   0.000000   0.007743 0.005313   0 
176   0.000000   -0.001013 -0.003466   0 
177   0.000000   -0.000550 0.000772   0 
178   0.000000   -0.009864 0.001764   0 

print df['Daily_rets'] 
172 0.003309 
173 0.005135 
174 0.004203 
175 0.005313 
176 -0.003466 
177 0.000772 
178 0.001764 
Name: Daily_rets, dtype: float64 

print df['perc_ret'].shift(1) 
172 NaN 
173  0 
174  0 
175  0 
176  0 
177  0 
178  0 
Name: perc_ret, dtype: float64 
print ( df['Daily_rets'] + df['perc_ret'].shift(1)) 
172   NaN 
173 0.005135 
174 0.004203 
175 0.005313 
176 -0.003466 
177 0.000772 
178 0.001764 
dtype: float64 
+0

Ах отличный крик, спасибо много jezael –

6

Если они ежедневно возвращается, и вы хотите кумулятивное возвращение, конечно, вы должен ли вы иметь ежедневный укомплектованный номер?

df['perc_ret'] = (1 + df.Daily_rets).cumprod() - 1 

>>> df 
    Poloniex_DOGE_BTC Poloniex_XMR_BTC Daily_rets perc_ret 
172   0.006085   -0.000839 0.003309 0.003309 
173   0.006229   0.002111 0.005135 0.008461 
174   0.000000   -0.001651 0.004203 0.012700 
175   0.000000   0.007743 0.005313 0.018080 
176   0.000000   -0.001013 -0.003466 0.014551 
177   0.000000   -0.000550 0.000772 0.015335 
178   0.000000   -0.009864 0.001764 0.017126 
1

вы просто не можете просто добавить их все с помощью cumsum

, например, если у вас есть массив [1.1, 1.1], вы должны иметь 2,21, а не 2,2

import numpy as np 

# daily return: 
df['daily_return'] = df['close'].pct_change() 

# calculate cumluative return 
df['cumluative_return'] = np.exp(np.log1p(df['daily_return']).cumsum()) 
Смежные вопросы