0

我有一个投资组合组件的数据集,它提供了我的投资组合中在每个重新平衡日期(每月)持有的 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 的列,以便:

  • 如果股票在时间 t-1 和时间 t 持有,则值为 0
  • 如果股票在时间 t-1 持有,但在时间 t 卖出,价值 1
  • 如果股票在时间 t-1 买入,并且在时间 t 持有(未卖出),则价值 1
  • 如果股票在时间 t-1 买入,在时间 t 卖出,则值为 2

将值分配给 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
4

1 回答 1

0

我认为您的示例数据不足以显示所有情况,但这通常应该这样做:

 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]
于 2020-04-29T10:58:39.930 回答