每组时间序列滚动函数
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 的 window 为 252 的 RET 的滚动 sd。为此,函数
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
使用 roll_sd
和 window 大小为 252 将使每个组中的前 252 个值成为 NA
- 它不会给出您在问题中建议的结果。但是,在实现该结果的几种方法中,最简单的可能是使用 tidyverse 包系列中的 group_by
和 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
我有以下类型的数据集:
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 的 window 为 252 的 RET 的滚动 sd。为此,函数
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
使用 roll_sd
和 window 大小为 252 将使每个组中的前 252 个值成为 NA
- 它不会给出您在问题中建议的结果。但是,在实现该结果的几种方法中,最简单的可能是使用 tidyverse 包系列中的 group_by
和 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