【发布时间】:2015-05-13 06:05:29
【问题描述】:
我想使用 R 来估计固定数量的特征向量的每日解释方差(这与 Kritzman 等人在 this article 中定义的“吸收率”相同)。我正在使用this data file,这是一个每日回报矩阵。我的主要目标是以与 Kritzman 等人在上面的文章中所做的相同的方式估计每日解释方差(吸收率)。关于估计,Kritzman 等人说:
为了估计吸收率,我们使用一个 [rolling] 500 天的窗口来估计协方差矩阵和特征向量,我们将特征向量的数量固定在大约 1/ 5 我们样本中的资产数量。
为了在 R 中计算这个,我尝试了以下代码:
rm(list=ls(all=TRUE))
library("quadprog")
# read data set consisting of daily returns
data <- read.table("10_Industry_Portfolios_Daily.txt", header=TRUE)
Ret <- data[,2:ncol(data)]/100
names <- c("NoDur","Durbl","Manuf","Enrgy","HiTec",
"Telcm","Shops","Hlth","Utils","Other")
colnames(Ret) <- names
# lookback period in number of days (rolling window)
lb.period <- 500
nRow <- nrow(Ret)
nCol <- ncol(Ret)
n <- nRow-lb.period
ar <- rep(0,n) # reserve space for daily absorption ratio
for(i in 1:n) {
# define rolling window
start <- i
end <- i+lb.period-1
ret <- Ret[start:end,]
cov <- cov(ret)
eigenval <- eigen(cov)$values
sumeigenval <- sum(eigenval)
abs <- eigenval[1:2]/sumeigenval # variance explained by 2 eigenvectors
ar[i] <- ar[i]+abs # daily variance explained, out of sample period
}
当我运行这个程序时,我收到以下警告消息; “要替换的项目数不是替换长度的倍数”,并以由 n 个相等的数字组成的 ar[i] 向量结束。
我非常有信心这是计算 2 个特征向量的解释方差的正确方法
ret <- Ret[start:end,]
cov <- cov(ret)
eigenval <- eigen(cov)$values
sumeigenval <- sum(eigenval)
abs <- eigenval[1:2]/sumeigenval
但我的问题是我如何使用滚动窗口方法每天计算这个数字,正如 Kritzman 在他的文章中所做的那样。恐怕我的 R 知识在这里并不适用,所以如果有人能在这方面帮助我,我将不胜感激。如果有不清楚的地方,请随时提出问题。
【问题讨论】:
-
我还找到了this article,作者实际上在其中发布了与估计吸收率相关的 R 代码,但是当我用他的代码尝试我的数据文件时它不起作用。不过,您可能会在这里找到一些编程灵感。
-
我无权访问您的数据(一个可重复的示例将有很长的路要走),但您可以自己开始调试有问题的部分。要么将
browser()放在你认为会导致问题的块之前(并运行循环),要么手动定义i(例如i <- 3)并逐步完成循环。 -
我确实分享了我在第一篇文章中使用的数据,但我可以再次分享:mba.tuck.dartmouth.edu/pages/faculty/ken.french/ftp/… 我会继续努力,所以我也会尝试你的建议。感谢您的支持。
-
还有其他人有什么建议吗?
-
@Captain_Slow 嗨,我知道这是几年前发布的。我目前对实施吸收率感兴趣..您最终解决了问题吗?
标签: r for-loop time-series pca eigenvalue