将指数从100开始的列添加到股票价格/收益矩阵

问题描述:

我最近开始使用R进行财务数据计算,所以请耐心等待。我会尽量做到尽可能具体。将指数从100开始的列添加到股票价格/收益矩阵

我想要做的事:与quantmod包使用R,我加载财务数据到矩阵,然后与日收益增加一列,如下所示:

> 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开始,以便与其他时间系列进行后续比较。我一直无法这样做。

首先,我想

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编码我可能会接近这个错误的方式。但是搜索web和*并没有让我找到解决方案。非常感谢你!

您可以将收盘价栏的第一个值除以。

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的值来定义自己(递归只适用于函数)。

+0

谢谢你的帮助,文森特。你的代码完美地工作。我不熟悉'coredata'和'is.na'的功能。 R代码看起来很神秘。 :) Thx再次! – DMueller 2012-03-11 17:07:45

看看cbind命令。

我认为这就是你需要的。