我試圖爲財務事件分析準備好數據,並且想要計算買入和持有異常回報(BHAR)。對於測試數據集,我有三個事件(由event_id記錄),並且對於每個事件,我有272行,從t-252天到t + 20天(由變量時間記錄)。對於每一天,我也有股票的回報數據(ret)以及預期收益(Exp_Ret),這是使用市場模型計算的。這裏是一個樣本的數據:在30天的時間段內在PANDAS上滾動產品
index event_id time ret vwretd Exp_Ret
0 0 -252 0.02905 0.02498 nan
1 0 -251 0.01146 -0.00191 nan
2 0 -250 0.01553 0.00562 nan
...
250 0 -2 -0.00378 0.00028 -0.00027
251 0 -1 0.01329 0.00426 0.00479
252 0 0 -0.01723 -0.00875 -0.01173
271 0 19 0.01335 0.01150 0.01398
272 0 20 0.00722 -0.00579 -0.00797
273 1 -252 0.01687 0.00928 nan
274 1 -251 -0.00615 -0.01103 nan
這就是問題所在。我想計算以下巴爾式的每一天:
因此,使用上述式作爲一個例子,如果我想以計算10天購買和保持異常(1 + ret_t = 0)x(1 + ret_t = 1)... x(1 + ret_t = 10),然後用期望收益率(1 + Exp_Ret_t = 0) x(1 + Exp_Ret_t = 1)... x(1 + Exp_Ret_t = 10),然後從前者減去後者。
我已經使用rolling_apply但它並沒有解決我的所有問題取得了一些進展:
df['part1'] = pd.rolling_apply(df['ret'], 10, lambda x : (1+x).prod())
這似乎是正確執行巴爾方程,它會在加的左側正確的產品 - 雖然它會輸入兩行的值(可以通過移位來解決)。但是,一個問題是,數據框中有三個不同的「組」(3個事件),如果窗口要超過30天,它可能會開始使用下一個事件的產品。我試圖實現一個GROUPBY與rolling_apply但一直得到錯誤:類型錯誤:「系列」的對象是可變的,因此它們不能被散列
df.groupby('event_id').apply(pd.rolling_apply(df['ret'], 10, lambda x : (1+x).prod()))
我相信我在這裏缺少一些基本的東西所以任何幫助,將不勝感激。我可能只需要從另一個角度來看待它。這裏有一個想法:最後,我最感興趣的是從時間= 0開始獲得30天和60天的買入和持有異常收益。那麼,也許在時間= 0時選擇每個事件更容易,然後計算未來30天的產品?我不確定我如何才能最好地解決這個問題。
在此先感謝您的任何見解。
謝謝你 - 看起來很有希望。但是,我得到以下錯誤使用任一建議:「TypeError:只有長度爲1的數組可以轉換爲Python標量。」 –
哪裏?在'返回np。cumprod(ARR + 1)'? – Kartik
我在任何地方都看不到 - 看起來像這裏:----> 2組['BHAR'] = pd.rolling_apply(group ['ret'],10,bhar) - pd.rolling_apply (group ['Exp_Ret'],10,bhar) –