R 如何在data.table中计算收益?

R 如何在data.table中计算收益?,r,data.table,finance,quantitative-finance,R,Data.table,Finance,Quantitative Finance,我是一个新的堆栈溢出和R初学者 我想计算一个大数据集的收益,如下所示: Date C1 C2 C3 31.01.1985 NA 47 NA 28.02.1985 NA 45 NA 29.03.1985 130 56 NA 30.04.1985 140 67 NA 31.05.1985 150 48 93 28.06.1985 160 79 96 31.07.1985 160 56 94 30.08.1985 160 77 93 30.09.1

我是一个新的堆栈溢出和R初学者

我想计算一个大数据集的收益,如下所示:

Date        C1  C2  C3
31.01.1985  NA  47  NA
28.02.1985  NA  45  NA
29.03.1985  130 56  NA
30.04.1985  140 67  NA
31.05.1985  150 48  93
28.06.1985  160 79  96
31.07.1985  160 56  94
30.08.1985  160 77  93
30.09.1985  160 66  93
31.10.1985  160 44  93
29.11.1985  160 55  93
它是一种
数据。表格
格式,我们可以说它叫做价格,列是公司,值是价格,实际数据集有更多的列和行。我想建立一个新的DT,在这里我计算每月回报,我知道你可以用
diff()
函数来实现这一点。但是,如果没有for循环,如何构建包含这么多列的新数据表呢

我想到:

Returns <- diff(Prices[, names(Prices) != "Date"])

提前感谢。

您获得该输出的原因是
Prices[,names(Prices)!=“Date”]
返回一个逻辑向量:

> Prices[, names(Prices) != "Date"]
[1] FALSE  TRUE  TRUE  TRUE
因为可以使用逻辑进行计算,所以也可以对逻辑向量使用
diff
<代码>假
然后被视为
0
被视为
1
。所以基本上你在做
diff(c(0,1,1,1))


您想要的解决方案:

cols <- setdiff(names(Prices),"Date")

# option 1:
Prices[, paste0(cols,"_return") := lapply(.SD, function(x) (x - shift(x, fill = NA))/shift(x, fill = NA)), .SDcols = cols][]

# option 2:
Prices[, paste0(cols,"_return") := lapply(.SD, function(x) c(NA,diff(x))/shift(x, fill = NA)), .SDcols = cols][]
如果要创建新的
数据表
,可以使用以下两个选项之一:

# option 1:
Returns <- Prices[, c(list(Date = Date), lapply(.SD, function(x) (x - shift(x, fill = NA))/shift(x, fill = NA))), .SDcols = cols]

# option 2:
Returns <- copy(Prices)
Returns[, (cols) := lapply(.SD, function(x) (x - shift(x, fill = NA))/shift(x, fill = NA)), .SDcols = cols]
#选项1:

返回我将编写一个函数来处理一列值

pc.change <- function(x) {   
(c(x[2:length(x)], NA) - x)*100/x }
d <- read.table(text = "Date        C1  C2  C3
31.01.1985  NA  47  NA
28.02.1985  NA  45  NA
29.03.1985  130 56  NA
30.04.1985  140 67  NA
31.05.1985  150 48  93
28.06.1985  160 79  96
31.07.1985  160 56  94
30.08.1985  160 77  93
30.09.1985  160 66  93
31.10.1985  160 44  93
29.11.1985  160 55  93", header = TRUE)

apply(as.matrix(d[,2:4]), 2, pc.change)

如果需要,应该可以将其转换为数据表

哦,这很有魅力,非常感谢,你不知道自己帮了多少忙。为了更好地理解这一点,我有几个问题。a) 为什么在前两个选项的末尾使用[]?其次,当您创建data.table时,为什么在选项2中使用(cols)?抱歉,如果这些都是愚蠢的问题,但我真的想理解R,尤其是data.table。非常感谢。again@AahuM回答您的问题:(a)我使用
[]
生成
数据。table
立即将结果打印到控制台;没有必要使用这个;(b) 我在选项2中使用了
(cols)
,因为这样就可以通过引用更新列。当您想了解更多关于
data.table
的信息时,您也可以研究这些小插曲。谢谢您的回答,我现在更了解它了。是的,我将学习入门小故事。
Prices <- fread("Date        C1  C2  C3
31.01.1985  NA  47  NA
28.02.1985  NA  45  NA
29.03.1985  130 56  NA
30.04.1985  140 67  NA
31.05.1985  150 48  93
28.06.1985  160 79  96
31.07.1985  160 56  94
30.08.1985  160 77  93
30.09.1985  160 66  93
31.10.1985  160 44  93
29.11.1985  160 55  93")[, Date := as.Date(Date, "%d.%m.%Y")]
pc.change <- function(x) {   
(c(x[2:length(x)], NA) - x)*100/x }
d <- read.table(text = "Date        C1  C2  C3
31.01.1985  NA  47  NA
28.02.1985  NA  45  NA
29.03.1985  130 56  NA
30.04.1985  140 67  NA
31.05.1985  150 48  93
28.06.1985  160 79  96
31.07.1985  160 56  94
30.08.1985  160 77  93
30.09.1985  160 66  93
31.10.1985  160 44  93
29.11.1985  160 55  93", header = TRUE)

apply(as.matrix(d[,2:4]), 2, pc.change)
            C1         C2        C3
[1,]       NA  -4.255319        NA
[2,]       NA  24.444444        NA
[3,] 7.692308  19.642857        NA
[4,] 7.142857 -28.358209        NA
[5,] 6.666667  64.583333  3.225806
[6,] 0.000000 -29.113924 -2.083333
[7,] 0.000000  37.500000 -1.063830
[8,] 0.000000 -14.285714  0.000000
[9,] 0.000000 -33.333333  0.000000
[10,] 0.000000  25.000000  0.000000
[11,]       NA         NA        NA