R: создать столбец, чтобы определить, куплен ли, хранится или продан ли запас - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть набор компонентов портфеля, который дает информацию о 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

1 Ответ

0 голосов
/ 29 апреля 2020

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

 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]
...