R:创建列以确定股票是买入、持有还是卖出
R: create column to determine wether stock is bought, held or sold
我有一个投资组合组成部分的数据集,它提供了我的投资组合在每个重新平衡日期(每月)持有的 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
我认为您的示例数据不足以显示所有情况,但通常应该这样做:
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]
我有一个投资组合组成部分的数据集,它提供了我的投资组合在每个重新平衡日期(每月)持有的 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
我认为您的示例数据不足以显示所有情况,但通常应该这样做:
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]