我最近开始使用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开始的另一列,以便稍后与另一个时间序列进行比较。我无法这样做。
首先,我试过
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并没有让我找到解决方案。非常感谢你!
答案 0 :(得分: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
的值来定义它自己(递归只适用于函数)。
答案 1 :(得分:0)
看一下cbind命令。
我认为这就是你所需要的。