【问题标题】:R: create column to determine wether stock is bought, held or soldR:创建列以确定是否购买、持有或出售股票
【发布时间】:2020-04-29 09:45:10
【问题描述】:

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

【问题讨论】:

    标签: r portfolio rebalancing


    【解决方案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]
    

    【讨论】:

    • 感谢您的回答@otwtm!我不熟悉 data.table,但我认为我理解逻辑并且它看起来应该可以工作。我试图让它适合我的实际数据,但我最终得到所有股票的 1,我知道这是不正确的。在解决方案的最后一部分中,TRUE ~ 88 指的是什么?
    • 您好,您能否提供一个包含所有 4 个案例的更多数据的示例?然后我可以想办法。关于 TRUE~88,这意味着在所有其他情况下都选择 88。作为一个假人,用于查看一行是否对于 4 种情况中的任何一种都不为真。
    • 谢谢!我真的让它工作了,所以应该没问题!感谢您的帮助。
    猜你喜欢
    • 2011-03-15
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多