【问题标题】:data.table shifting variable with missing ID缺少 ID 的 data.table 移位变量
【发布时间】:2018-03-09 12:30:53
【问题描述】:

我的问题是我有每月变量 TICKER 名称、RETURN 和日期月份的股票数据。我想计算前 1 个月的回报,所以我会在 data.table 中使用带有潜在客户的 shift() 函数。

以我的数据为例,这个data.table叫做A。

date.mth    TICKER    RETURN
  201501       ABC         1
  201501       DEF         2
  201501       GHI         3
  201502       ABC         4
  201502       DEF         5
  201502       JKL         6

如您所见: TICKER "GHI" 在 201502 没有交易。 TICKER "JKL" 在 201501 没有交易。 在 LEAD.RETURN 中两者都不会返回

如果我使用代码:

A[, LEAD.RETURN := shift(RETURN, 1L, fill=NA, type="lead"), by=.(date.mth,TICKER)]

然后 data.table 不知道如何处理丢失的公司,所以它会返回类似:

date.mth    TICKER    RETURN    LEAD1.RETURN
  201501       ABC         1             NA
  201501       DEF         2             NA
  201501       GHI         3             NA
  201502       ABC         4             NA
  201502       DEF         5             NA
  201502       JKL         6             NA

我想要的结果是,如果该公司不存在,那么在 LEAD1.RETURN 中,我将强制它为 NA:

 date.mth    TICKER    RETURN    LEAD1.RETURN
  201501       ABC         1              4
  201501       DEF         2              5
  201501       GHI         3             NA
  201502       ABC         4             NA
  201502       DEF         5             NA
  201502       JKL         6             NA

我知道在 STATA 中,当你让程序知道带有 TICKER 和 RETURN 的系列然后将领先系列定义为 F1.RETURN 时,它会自动领先 1 个周期。 F2.RETURN 会自动领先2个句点。

有什么办法可以在 data.table 中实现,或者我应该在上面写一个 for 循环吗?

谢谢。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    我认为从 groupby 中删除 date.mth 应该会得到预期的结果。

    A[, LEAD.RETURN := shift(RETURN, 1L, fill=NA, type="lead"), by=.(TICKER)]
    print(A)
    
         date.mth TICKER RETURN LEAD.RETURN
    1:   201501    ABC      1           4
    2:   201501    DEF      2           5
    3:   201501    GHI      3          NA
    4:   201502    ABC      4          NA
    5:   201502    DEF      5          NA
    6:   201502    JKL      6          NA
    

    【讨论】:

    • 但是我的整个样本是从 201501 到 201712。如果我猜只有两个时期,这会起作用吗?或许我应该说清楚
    • 不确定我是否理解你,但只要数据按 date.mth 排序,它就适用于所有时期。由于我们在 groupby 之后移动了一个值,因此下一个 ABC 返回将移动到上一行。
    • 是的,它有效!我得到了想要的结果。我想当我制作 groupby 时,我想确保它正确引导,所以我添加了 date.mth。
    猜你喜欢
    • 2021-03-13
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多