首页 > 解决方案 > R中的样本协方差矩阵

问题描述

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

这就是我所拥有的:

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 x 1 的矩阵...我知道我的循环正在覆盖价格中的代码,因此它只使用最后一个代码中的价格作为其余代码。我尝试使用 list 函数来纠正这个问题,但这并没有改变我对协方差的最终结果。我相信我最终会得到一个 4x4 矩阵,但我真的不明白如何得到它。

标签: rcovariance

解决方案


list我建议在尝试使用 s 之前阅读更多关于s 以及它们如何工作的信息list。另外,我建议您不要=用于分配变量,请参阅此 SO 线程上的更多信息 R 中的“=”和“<-”有什么区别?.

data.frame列表的另一种选择可能是为每个单独保存ticker,然后cbinddata.frames。

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

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

推荐阅读