如果在距离为1的13个数列内,继续观察
Keep observation if it is within a sequence of 13 numbers of distance 1
对于投资策略,我希望计算动量 returns。 Returns 是根据过去 12 到 2 个月的平均值 lag(12)-lag(2) 计算得出的。
对于这些 returns 我需要清理我的数据集并删除不在 13 个观察序列中的每个观察结果。
到目前为止,我已经删除了所有独立的观察结果:
x <- x %>%
arrange(seriesid, datem) %>%
group_by(seriesid) %>%
mutate(A = ifelse(((lead(datem,1)-datem) <=1 | (datem-lag(datem,1)) <=1),1,NA)) %>%
ungroup()
x <- x[complete.cases(x),
然后编辑变量A来显示lag12和实际值之间的距离或者lead 12和实际值之间的距离是否为12,包含13个观察值。
x <- x %>%
arrange(seriesid, datem) %>%
group_by(seriesid) %>%
mutate(A = ifelse(((lead(datem,12)-datem) <=12 | (datem-lag(datem,12)) <=12),1,NA)) %>%
ungroup()
当前输出
date seriesid datem closeret A
1883-07-28 50102 22603 2.381538e-01 NA
1883-08-25 50102 22604 6.461233e-03 NA
1883-12-29 50102 22608 -3.947368e-02 1
1884-01-26 50102 22609 -2.328767e-01 NA
1884-02-23 50102 22610 0.000000e+00 NA
1884-03-29 50102 22611 3.392857e-01 NA
1884-04-26 50102 22612 -1.733333e-01 NA
1884-05-31 50102 22613 1.612903e-02 NA
1884-06-28 50102 22614 -1.428571e-01 NA
1884-07-26 50102 22615 -2.222222e-01 NA
1884-08-30 50102 22616 -1.428571e-01 NA
1884-09-27 50102 22617 1.111111e-01 NA
1884-10-25 50102 22618 0.000000e+00 NA
1884-11-29 50102 22619 -1.000000e-01 NA
1884-12-27 50102 22620 -3.333333e-01 1
1885-03-28 50102 22623 8.333333e-02 NA
如您所见,包含 A 的列有两个 1,彼此相隔 12 步。现在我的目标是让它们之间的值也为 1。这样一来,至少有 13 个值的序列中的所有内容都会被保留下来,并且我可以稍后删除 NA。我也试过:
x <- x %>%
arrange(seriesid, datem) %>%
group_by(seriesid) %>%
mutate(A = ifelse((lead(A,11)==12&(lead(datem,11)-datem)==11)&(lag(A,1)==12)&(datem-lag(datem,1))==1,12,A)) %>%
mutate(A = ifelse((lead(A,10)==12&(lead(datem,10)-datem)==10)&(lag(A,2)==12)&(datem-lag(datem,2))==2,12,A)) %>%
mutate(A = ifelse((lead(A,9)==12&(lead(datem,9)-datem)==9)&(lag(A,3)==12)&(datem-lag(datem,3))==3,12,A)) %>%
mutate(A = ifelse((lead(A,8)==12&(lead(datem,8)-datem)==8)&(lag(A,4)==12)&(datem-lag(datem,4))==4,12,A)) %>%
mutate(A = ifelse((lead(A,7)==12&(lead(datem,7)-datem)==7)&(lag(A,5)==12)&(datem-lag(datem,5))==5,12,A)) %>%
mutate(A = ifelse((lead(A,6)==12&(lead(datem,6)-datem)==6)&(lag(A,6)==12)&(datem-lag(datem,6))==6,12,A)) %>%
mutate(A = ifelse((lead(A,5)==12&(lead(datem,5)-datem)==5)&(lag(A,7)==12)&(datem-lag(datem,7))==7,12,A)) %>%
ungroup()
但是,这也会将之前的正确值更改为不正确的值。
期望的输出:
date seriesid datem closeret A
1883-07-28 50102 22603 2.381538e-01 NA
1883-08-25 50102 22604 6.461233e-03 NA
1883-12-29 50102 22608 -3.947368e-02 1
1884-01-26 50102 22609 -2.328767e-01 1
1884-02-23 50102 22610 0.000000e+00 1
1884-03-29 50102 22611 3.392857e-01 1
1884-04-26 50102 22612 -1.733333e-01 1
1884-05-31 50102 22613 1.612903e-02 1
1884-06-28 50102 22614 -1.428571e-01 1
1884-07-26 50102 22615 -2.222222e-01 1
1884-08-30 50102 22616 -1.428571e-01 1
1884-09-27 50102 22617 1.111111e-01 1
1884-10-25 50102 22618 0.000000e+00 1
1884-11-29 50102 22619 -1.000000e-01 1
1884-12-27 50102 22620 -3.333333e-01 1
1885-03-28 50102 22623 8.333333e-02 NA
更新:现在我们可以添加一些 dplyr。之前的部分现在在 sequer
函数中(我不擅长命名)。
sequer <- function(x) {
seq <- rle(cumsum(!c(1, diff(x))==1))
seq$values <- ifelse(seq$lengths >= 13, 1, NA)
inverse.rle(seq)
}
df %>%
group_by(seriesid) %>%
mutate(A = sequer(datem)) -> res
> res
date seriesid datem closeret A
1 1883-07-28 50102 22603 0.238153800 NA
2 1883-08-25 50102 22604 0.006461233 NA
3 1883-12-29 50102 22608 -0.039473680 1
4 1884-01-26 50102 22609 -0.232876700 1
5 1884-02-23 50102 22610 0.000000000 1
6 1884-03-29 50102 22611 0.339285700 1
7 1884-04-26 50102 22612 -0.173333300 1
8 1884-05-31 50102 22613 0.016129030 1
9 1884-06-28 50102 22614 -0.142857100 1
10 1884-07-26 50102 22615 -0.222222200 1
11 1884-08-30 50102 22616 -0.142857100 1
12 1884-09-27 50102 22617 0.111111100 1
13 1884-10-25 50102 22618 0.000000000 1
14 1884-11-29 50102 22619 -0.100000000 1
15 1884-12-27 50102 22620 -0.333333300 1
16 1885-03-28 50102 22623 0.083333330 NA
对于投资策略,我希望计算动量 returns。 Returns 是根据过去 12 到 2 个月的平均值 lag(12)-lag(2) 计算得出的。
对于这些 returns 我需要清理我的数据集并删除不在 13 个观察序列中的每个观察结果。
到目前为止,我已经删除了所有独立的观察结果:
x <- x %>%
arrange(seriesid, datem) %>%
group_by(seriesid) %>%
mutate(A = ifelse(((lead(datem,1)-datem) <=1 | (datem-lag(datem,1)) <=1),1,NA)) %>%
ungroup()
x <- x[complete.cases(x),
然后编辑变量A来显示lag12和实际值之间的距离或者lead 12和实际值之间的距离是否为12,包含13个观察值。
x <- x %>%
arrange(seriesid, datem) %>%
group_by(seriesid) %>%
mutate(A = ifelse(((lead(datem,12)-datem) <=12 | (datem-lag(datem,12)) <=12),1,NA)) %>%
ungroup()
当前输出
date seriesid datem closeret A
1883-07-28 50102 22603 2.381538e-01 NA
1883-08-25 50102 22604 6.461233e-03 NA
1883-12-29 50102 22608 -3.947368e-02 1
1884-01-26 50102 22609 -2.328767e-01 NA
1884-02-23 50102 22610 0.000000e+00 NA
1884-03-29 50102 22611 3.392857e-01 NA
1884-04-26 50102 22612 -1.733333e-01 NA
1884-05-31 50102 22613 1.612903e-02 NA
1884-06-28 50102 22614 -1.428571e-01 NA
1884-07-26 50102 22615 -2.222222e-01 NA
1884-08-30 50102 22616 -1.428571e-01 NA
1884-09-27 50102 22617 1.111111e-01 NA
1884-10-25 50102 22618 0.000000e+00 NA
1884-11-29 50102 22619 -1.000000e-01 NA
1884-12-27 50102 22620 -3.333333e-01 1
1885-03-28 50102 22623 8.333333e-02 NA
如您所见,包含 A 的列有两个 1,彼此相隔 12 步。现在我的目标是让它们之间的值也为 1。这样一来,至少有 13 个值的序列中的所有内容都会被保留下来,并且我可以稍后删除 NA。我也试过:
x <- x %>%
arrange(seriesid, datem) %>%
group_by(seriesid) %>%
mutate(A = ifelse((lead(A,11)==12&(lead(datem,11)-datem)==11)&(lag(A,1)==12)&(datem-lag(datem,1))==1,12,A)) %>%
mutate(A = ifelse((lead(A,10)==12&(lead(datem,10)-datem)==10)&(lag(A,2)==12)&(datem-lag(datem,2))==2,12,A)) %>%
mutate(A = ifelse((lead(A,9)==12&(lead(datem,9)-datem)==9)&(lag(A,3)==12)&(datem-lag(datem,3))==3,12,A)) %>%
mutate(A = ifelse((lead(A,8)==12&(lead(datem,8)-datem)==8)&(lag(A,4)==12)&(datem-lag(datem,4))==4,12,A)) %>%
mutate(A = ifelse((lead(A,7)==12&(lead(datem,7)-datem)==7)&(lag(A,5)==12)&(datem-lag(datem,5))==5,12,A)) %>%
mutate(A = ifelse((lead(A,6)==12&(lead(datem,6)-datem)==6)&(lag(A,6)==12)&(datem-lag(datem,6))==6,12,A)) %>%
mutate(A = ifelse((lead(A,5)==12&(lead(datem,5)-datem)==5)&(lag(A,7)==12)&(datem-lag(datem,7))==7,12,A)) %>%
ungroup()
但是,这也会将之前的正确值更改为不正确的值。
期望的输出:
date seriesid datem closeret A
1883-07-28 50102 22603 2.381538e-01 NA
1883-08-25 50102 22604 6.461233e-03 NA
1883-12-29 50102 22608 -3.947368e-02 1
1884-01-26 50102 22609 -2.328767e-01 1
1884-02-23 50102 22610 0.000000e+00 1
1884-03-29 50102 22611 3.392857e-01 1
1884-04-26 50102 22612 -1.733333e-01 1
1884-05-31 50102 22613 1.612903e-02 1
1884-06-28 50102 22614 -1.428571e-01 1
1884-07-26 50102 22615 -2.222222e-01 1
1884-08-30 50102 22616 -1.428571e-01 1
1884-09-27 50102 22617 1.111111e-01 1
1884-10-25 50102 22618 0.000000e+00 1
1884-11-29 50102 22619 -1.000000e-01 1
1884-12-27 50102 22620 -3.333333e-01 1
1885-03-28 50102 22623 8.333333e-02 NA
更新:现在我们可以添加一些 dplyr。之前的部分现在在 sequer
函数中(我不擅长命名)。
sequer <- function(x) {
seq <- rle(cumsum(!c(1, diff(x))==1))
seq$values <- ifelse(seq$lengths >= 13, 1, NA)
inverse.rle(seq)
}
df %>%
group_by(seriesid) %>%
mutate(A = sequer(datem)) -> res
> res
date seriesid datem closeret A
1 1883-07-28 50102 22603 0.238153800 NA
2 1883-08-25 50102 22604 0.006461233 NA
3 1883-12-29 50102 22608 -0.039473680 1
4 1884-01-26 50102 22609 -0.232876700 1
5 1884-02-23 50102 22610 0.000000000 1
6 1884-03-29 50102 22611 0.339285700 1
7 1884-04-26 50102 22612 -0.173333300 1
8 1884-05-31 50102 22613 0.016129030 1
9 1884-06-28 50102 22614 -0.142857100 1
10 1884-07-26 50102 22615 -0.222222200 1
11 1884-08-30 50102 22616 -0.142857100 1
12 1884-09-27 50102 22617 0.111111100 1
13 1884-10-25 50102 22618 0.000000000 1
14 1884-11-29 50102 22619 -0.100000000 1
15 1884-12-27 50102 22620 -0.333333300 1
16 1885-03-28 50102 22623 0.083333330 NA