R中的样本协方差矩阵



我应该使用EBAY、GOOG、TEVA从2015年3月1日到2017年3月31日下载的每日价格来计算算术回报的样本协方差矩阵。

这就是我所拥有的:

library(zoo)
library(tseries)
library(fBasics)
for(ticker in c("ebay", "goog", "teva", "ge")){
Prices = get.hist.quote(instrument = ticker, start = "2015-03-01",
end = "2017-03-01", quote = "Close", 
provider = "yahoo",origin = "1970-01-01", 
compression = "d", retclass = "zoo")}

return = diff(Prices)/lag(Prices, k=-1)
covariance = cov(return)

然而,当我打印协方差时,我得到了一个1乘1的矩阵。。。我知道我的循环正在覆盖Prices中的ticker,所以它只在代码的其余部分使用最后一个ticker中的价格。我试着使用列表函数来纠正这一点,但这并没有改变协方差的最终结果。我相信我最终会得到一个4x4矩阵,但我真的不明白如何得到它

我建议在尝试使用lists之前,先阅读更多关于lists及其工作方式的信息。此外,我建议您不要使用=来分配变量,请参阅此SO线程上的更多信息="以及"&lt-"在R?中?。

列表的替代方案可以是为每个ticker保存单独的data.frame,然后为data.frame保存cbind

但根据您的代码,列表版本为:

library(zoo)
library(tseries)
Prices <- c()
k <- 1
for(ticker in c("ebay", "goog", "teva", "ge")){
Prices[[k]] <- get.hist.quote(instrument = ticker, start = "2015-03-01",
end = "2017-03-01", quote = "Close", 
provider = "yahoo",origin = "1970-01-01", 
compression = "d", retclass = "zoo")
k <- k+1
}

return_list <- lapply(Prices, function(x) diff(x)/lag(x, k=c(-1)))
return_matrix <- do.call("cbind", return_list)
colnames(return_matrix) <- c("ebay", "goog", "teva", "ge")
covariance <- cov(return_matrix)
ebay         goog         teva           ge
ebay 3.180376e-04 8.985594e-05 5.332997e-05 7.296451e-05
goog 8.985594e-05 2.385761e-04 6.331062e-05 7.274448e-05
teva 5.332997e-05 6.331062e-05 3.919655e-04 4.754861e-05
ge   7.296451e-05 7.274448e-05 4.754861e-05 1.538201e-04

最新更新