【问题标题】:R data.table Return calculation and set()R data.table 返回计算和set()
【发布时间】:2014-02-20 19:15:19
【问题描述】:

我确定我遗漏了一些简单的东西,但是如何使用 R 中的 data.tables 计算每日回报?

假设我有一个 data.table,例如:

DT <- data.table(ticker=rep(letters,each=5), priceA=runif(5*26^2), priceB=runif(5*26^2))

如何形成一个新列,其中包含每个代码的相应价格回报?

我所说的回报是指正常的百分比回报。也就是说,股票代码 a 的价格 A 的第二个值减去同一股票代码的前一个值,然后除以前一个。

鉴于列代码、价格A 和价格B 的示例,我应该得到列returnA,如下所示:

      ticker     priceA     priceB  returnsA
   1:      a 0.63519775 0.04784728 
   2:      a 0.01530738 0.34917328  -0.97590
   3:      a 0.28601406 0.12307475  17.68472 
   4:      a 0.77851212 0.47829863  1.721937
   5:      a 0.84078779 0.23491432  0.079993

另外,我如何使用set()而不是:=来做某事

DT[, newprice := priceA * priceB]

?

谢谢! :)

【问题讨论】:

  • 对于set,也许是DT[,newprice:=NA]; set(DT,j=4L,value=DT[['priceA']]*DT[['priceB']]) 你还没有定义“返回”。
  • 感谢您的回答,这正是我想要的 set()。我更新了我的问题并添加了一个示例。

标签: r data.table


【解决方案1】:

好的,这行得通:

set.seed(42)
DT <- data.table(
  ticker=rep(letters,each=5),
  priceA=runif(5*26^2),
  priceB=runif(5*26^2))

DT[,paste('returns',LETTERS[1:2],sep=''):={
  lapply(.SD,function(x){
    old <- head(x,-1)
    new <- tail(x,-1)
    c(NA,(new-old)/old)
  })
},by=ticker,.SDcols=grep('^price',names(DT))]

结果(对于这个种子值)是

      ticker    priceA    priceB    returnsA   returnsB
   1:      a 0.9148060 0.7956245          NA         NA
   2:      a 0.9370754 0.9314941  0.02434327  0.1707710
   3:      a 0.2861395 0.6269996 -0.69464620 -0.3268883
   4:      a 0.8304476 0.1666758  1.90224707 -0.7341691
   5:      a 0.6417455 0.6483800 -0.22722939  2.8900659
  ---                                                  
3376:      z 0.2887293 0.3473923 -0.54132570 -0.3514041
3377:      z 0.9013438 0.1788842  2.12176058 -0.4850656
3378:      z 0.3126429 0.7648157 -0.65313686  3.2754788
3379:      z 0.8791381 0.1300418  1.81195584 -0.8299698
3380:      z 0.8160158 0.8159330 -0.07180019  5.2743905

在您的示例中使用set

DT[,newprice:=NA]
set(DT,j=ncol(DT),value=DT[['priceA']]*DT[['priceB']])

此外,还有一些专为处理退货等而设计的软件包,如下所示:Calculating %changes with the By()

【讨论】:

  • 所以,事情没那么简单。 :) 非常感谢你。对于任何感兴趣的人,stackoverflow.com/questions/14937165/…stackoverflow.com/questions/8508482/… 有助于理解 .SDcols
  • 不客气。是的,实际上.SDcols 不是严格需要的,如果您的 DT 看起来完全一样(因为.SD 的列将默认为除“ticker”之外的每一列,因为它在by 中)。我在这里使用它是因为(1)如果你在没有它的情况下连续运行两次操作,你会发现奇怪的结果;并且...好吧(2)如果他们是您或其他人遇到这个问题的新手,那么了解grephead[[等很有用:)无论如何,这些都是您在那里找到了很好的参考资料。
  • 我正在尝试了解您的工作解决方案并尝试对其进行修改。假设我想使用 library(quantmod) 中的 Delt() 来计算回报,而不是你的 function(x)。请问我该怎么做?
  • @user2383408 尽管链接到它,但我不知道 quantmod 包。也许您应该发布另一个问题...?
  • 在这里提问:stackoverflow.com/questions/21923028/… 非常感谢你,弗兰克,你拯救了我的一天! :)
猜你喜欢
  • 2019-09-03
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多