簡體   English   中英

每組時間序列滾動函數

[英]time series rolling function per group

我有以下類型的數據集:

      ID     date       RET
1  10026 20171227 -0.003768
2  10026 20171228  0.008958
3  10027 20171227 -0.001447
4  10027 20171228 -0.017454
5  10028 20171227 -0.009988
6  10028 20171228  0.013813

我需要為每個 ID 計算 RET 的滾動 sd,窗口為 252。 為此,函數

roll_sd(df50[,2],252)

計算滾動 sd 但不考慮不同的 ID。 我知道我可以寫一個這樣的循環

for (i in 1:dim(list_of_all_ID_to_be_created)) {
  roll_sd(df50[i,2],252)
}

然后將此值附加到空數據幀。 但是,有沒有辦法一次完成所有操作,以便在我的原始數據框中,我只得到一個新列“roll_sd”,它可以為每個 ID 進行計算? 所需的結果如下所示:

      ID     date       RET  roll_sd
1  10026 20171227 -0.003768  0.18667
2  10026 20171228  0.008958  0.21667
3  10027 20171227 -0.001447  0.18668
4  10027 20171228 -0.017454  0.32542
5  10028 20171227 -0.009988  0.87763
6  10028 20171228  0.013813  0.11221

使用窗口大小為 252 的roll_sd的前 252 個值成為NA - 它不會給出您在問題中建議的結果。 但是,在您可以實現結果的幾種方法中,最簡單的方法可能是使用group_by並從 tidyverse 系列軟件包中進行mutate 我已經使用drop_na從最終數據幀中刪除了結果NA

library(tidyverse)
library(roll)

df <- data.frame(ID = rep(letters[1:5], 500), RET = rnorm(2500))

df %>% 
  group_by(ID) %>% 
  mutate(roll_sd = roll_sd(RET, 252)) %>% 
  drop_na(roll_sd)
#> # A tibble: 1,245 x 3
#> # Groups:   ID [5]
#>    ID       RET roll_sd
#>    <fct>  <dbl>   <dbl>
#>  1 a     -0.538   1.02 
#>  2 b     -0.669   1.08 
#>  3 c     -0.438   0.990
#>  4 d     -0.511   1.06 
#>  5 e      0.953   1.04 
#>  6 a     -1.68    1.02 
#>  7 b     -0.806   1.08 
#>  8 c     -1.86    0.995
#>  9 d      3.49    1.08 
#> 10 e     -1.36    1.05 
#> # ... with 1,235 more rows

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM