将指数从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
的值来定义自己(递归只适用于函数)。
答
看看cbind命令。
我认为这就是你需要的。
谢谢你的帮助,文森特。你的代码完美地工作。我不熟悉'coredata'和'is.na'的功能。 R代码看起来很神秘。 :) Thx再次! – DMueller 2012-03-11 17:07:45