R: создать столбец, чтобы определить, покупаются ли акции, удерживаются или продаются.

У меня есть набор данных компонентов портфеля, который дает информацию о 10 акциях, находящихся в моем портфеле, на каждую дату ребалансировки (ежемесячно).

Пример фрейма данных всего с 4 датами и 4 акциями:

Date <- c(rep(as.Date("2010/12/14"), 4), rep(as.Date("2011/01/13"), 4), rep(as.Date("2011/02/10"), 4),rep(as.Date("2011/03/10"), 4))

Name <- c("A","B","C","D","A","C","F","G","A","B","F","H","A","F","H","I")

df <- data.frame(Date, Name)

Акции различаются между датами, поэтому мне нужно вычислить прямые транзакционные издержки на основе того, покупаю ли я, держу или продаю каждую акцию. Я хотел бы добавить столбец со значениями 0,1,2 в зависимости от этого, чтобы:

  • значение 0, если акции удерживаются в момент времени t-1 и время t
  • значение 1, если акции удерживаются в момент времени t-1, но продаются в момент времени t
  • значение 1, если акции куплены в момент времени t-1 и удерживаются (не продаются) в момент времени t
  • значение 2, если акции покупаются в момент времени t-1 и продаются в момент времени t

Со значениями, присвоенными запасу в момент времени t-1.

пример того, как это будет выглядеть:

Date          Stock      Status
2010-12-14    A          1
2010-12-14    B          2
2010-12-14    C          1
2010-12-14    D          2

2011-01-13    A          0
2011-01-13    C          1       
2011-01-13    F          1
2011-01-13    G          2

2011-02-10    A          0
2011-02-10    B          1
2011-02-10    F          0
2011-02-10    H          1

2011-03-10    A
2011-03-10    F
2011-03-10    H
2011-03-10    I

person signe    schedule 29.04.2020    source источник


Ответы (1)


Я думаю, что данных вашего примера недостаточно, чтобы показать все случаи, но обычно это должно делаться:

 Date <- c(rep(as.Date("2010/12/14"), 4), rep(as.Date("2011/01/13"), 4), rep(as.Date("2011/02/10"), 4),rep(as.Date("2011/03/10"), 4))
    dummy <- rep(1, 16)
    Name <- c("A","B","C","D","A","C","F","G","A","B","F","H","A","F","H","I")
    df <- data.frame(Date, Name, dummy)

    le = LETTERS[1:9]
    temp = CJ(Name=le, Date=unique(Date))

    df = data.table(df)
    setkey(df, Name, Date)
    setkey(temp, Name, Date)
    df = df[temp]


    df[,value:=case_when(dummy==1 & shift(dummy, type = "lag", n = 1)==1 & shift(dummy, type = "lag", n = 2)==1 ~ 0,
                         dummy==0 & shift(dummy, type = "lag", n = 1)==1 & shift(dummy, type = "lag", n = 2)==1 ~ 1,
                         dummy==1 & shift(dummy, type = "lag", n = 1)==1 & shift(dummy, type = "lag", n = 2)==0 ~ 1,
                         dummy==0 & shift(dummy, type = "lag", n = 1)==1 & shift(dummy, type = "lag", n = 2)==0 ~ 2,
                         TRUE~88), by=Name][dummy==1]
person otwtm    schedule 29.04.2020
comment
Спасибо за ваш ответ @otwtm! Я не знаком с data.table, но думаю, что понимаю логику, и похоже, что она должна работать. Я пытаюсь привести его в соответствие с моими фактическими данными, но в итоге получаю 1 для всех акций, что, как я знаю, неверно. К чему относится TRUE ~ 88 в последней части вашего решения? - person signe; 29.04.2020
comment
Привет еще раз, не могли бы вы привести пример с дополнительными данными, которые охватывают все 4 случая? Тогда я смогу что-нибудь придумать. Что касается TRUE~88, это означает, что во всех остальных случаях следует выбирать 88. Это было задумано как фиктивный, чтобы увидеть, не верна ли строка для любого из 4 случаев. - person otwtm; 30.04.2020
comment
Благодарю вас! Я на самом деле заставил его работать, так что все должно быть в порядке! Спасибо за вашу помощь. - person signe; 02.05.2020