如何计算具有多个证券的数据框中的百分比回报?

时间:2016-11-15 00:22:46

标签: r dataframe aggregate tapply

我的数据框构造如下:

    SecTicker Price
[1]    X     10
[2]    X     12
[3]    X     11
[4]    Y     5
[5]    Y     8
[6]    Y     4 
    etc...

我想插入一个每天都有安全性回报的列,所以有点像这样

    SecTicker Price     ret
[1] X         10         NA
[2] X         12         .2 
[3] X         11         -.0833 
[4] Y         5          NA 
[5] Y         8          .6  
[6] Y         4          -.5

基本上只是(价格(当前)/价格(时间-1))-1每列,每个股票代码的第一行为NA

看一下tapply(),我仍然不确定如何计算差异,因为我指的是同一列。关于如何解决这个问题有什么建议吗?我很感激帮助

2 个答案:

答案 0 :(得分:0)

将其转换为data.frame,获取价格lag的{​​{1}}(使用and divide it by 'Price' after grouping by 'SecTicker)。

data.table

根据显示的示例,数据集似乎为library(data.table) as.data.table(m1)[, Price := as.numeric(Price) ][, ret := round((Price/shift(Price))-1, 2), by = SecTicker][] # SecTicker Price ret #1: X 10 NA #2: X 12 0.20 #3: X 11 -0.08 #4: Y 5 NA #5: Y 8 0.60 #6: Y 4 -0.50 ,但matrix只能包含一个matrix。由于有class类列,转换为character后,在创建'ret'之前将'Price'类更改为data.table

如果是numeric,那么

data.frame

答案 1 :(得分:0)

对于基本R解决方案,我将从by函数

开始
newdata <- by(origdata[["Price"]], INDICES = origdata["SecTicker"], 
              FUN = function(x) data.frame(Price = x, ret = x/c(NA, x[-(length(x))]) - 1))

这为您提供了一个名称为SecTicker的列表,每个列表元素中都包含Priceret值的数据框。您可以使用。{/ p>重新获得data.frame格式

finaldata <- do.call(function(...) rbind(..., make.row.names = FALSE), newdata)
finaldata[["SecTicker"]] <- rep(names(newdata), 
                                vapply(newdata, nrow, numeric(1)))