1

我最近开始使用 R 对财务数据进行计算,所以请多多包涵。我会尽量具体。

我正在尝试做的事情:将 R 与 quantmod 包一起使用,我将财务数据加载到矩阵中,然后添加一个包含每日收益的列,如下所示:

> getSymbols("^GDAXI",from="1900-01-01")
> "GDAXI"
> GDAXI$Returns<-dailyReturn(Cl(GDAXI))
> head(GDAXI)
               GDAXI.Open GDAXI.High GDAXI.Low GDAXI.Close GDAXI.Volume GDAXI.Adjusted  Returns
1990-11-26     1466.3     1466.3     1443.2    1443.2      0            1443.2          0.000000000
1990-11-27     1438.3     1438.3     1415.3    1415.3      0            1415.3         -0.019332040
1990-11-28     1410.0     1431.9     1402.8    1420.6      0            1420.6          0.003744789
1990-11-29     1420.4     1424.6     1415.8    1418.9      0            1418.9         -0.001196677
1990-11-30     1421.5     1443.9     1421.5    1441.2      0            1441.2          0.015716400
1990-12-03     1470.1     1476.6     1458.7    1462.6      0            1462.6          0.014848737

但是,接下来我想添加另一个索引从 100 开始的列,以便以后与另一个 time series 进行比较。我无法这样做。

首先,我试过

GDAXI$Index[1]=100
for(i in 2:nrow(GDAXI)){ GDAXI$Index[i]<-GDAXI$Index[i-1]*(1+GDAXI$Returns[i]) }

但我收到此错误消息,我不明白:

Error in NextMethod(.Generic) : replacement has length zero

然后,我尝试了

> GDAXI$Index<-ifelse(index(GDAXI$Returns)==index(first(GDAXI)),100,lag(GDAXI$Index,1)*(1+GDAXI$Returns))

并收到另一条错误消息:

Error in hasTsp(x) : attempt to set an attribute on NULL

我想要的只是一个具有以下值的列(如图所示手动添加):

1990-11-26  100.00
1990-11-27   98.066796
1990-11-28   98.4340255
1990-11-29   98.3162417
1990-11-30   99.8614191
1990-12-03  101.344235

请帮忙!以前在 VBA 中编码过,我可能以错误的方式处理这个问题。但是搜索网络和stackoverflow并没有让我找到解决方案。非常感谢你!

4

2 回答 2

2

您可以将收盘价列除以其第一个值。

library(quantmod)
ind <- function(x) {
  coredata(x) <- t(
    t(coredata(x)) / 
    apply(coredata(x),2,function(u){ c(u[!is.na(u)&u!=0],NA)[1] })
   )
  x
}
getSymbols("^GDAXI",from="1900-01-01")
GDAXI$Index <- 100 * ind( Cl(GDAXI) )

您代码中的错误主要来自 xts 对象不是 data.frames 的事实。每个值都与一个日期相关联,并且您不能组合不同日期的元素:当您编写 时GDAXI$Index[i-1]*(1+GDAXI$Returns[i]),日期不匹配。

lag,就像您的第二次尝试一样,更改这些日期,以便计算有意义。但是您的代码是递归的:您使用 的值GDAXI$Index来定义自身(递归仅适用于函数)。

于 2012-03-11T12:35:06.463 回答
0

看看 cbind 命令。

我认为这就是你所需要的。

于 2012-03-11T12:06:48.803 回答