Продолжайте наблюдение, если оно находится в пределах последовательности 13 чисел 1 - PullRequest
0 голосов
/ 06 мая 2019

Для стратегии инвестирования я рассчитываю рассчитать возврат по импульсу. Возврат рассчитывается как среднее значение за последние 12–2 месяца с задержкой (12) -Lag (2).

Для этих результатов мне нужно очистить мой набор данных и удалить все наблюдения, которые не входят в последовательность из 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, чтобы показать, равно ли расстояние между лаг12 и фактическим значением или отрывом 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

Как вы можете видеть, столбец, содержащий А, имеет два шага 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

1 Ответ

1 голос
/ 07 мая 2019

ОБНОВЛЕНИЕ : Теперь мы можем добавить немного 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

...