R 如何在data.table中计算收益?
我是一个新的堆栈溢出和R初学者 我想计算一个大数据集的收益,如下所示: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
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