我在 R 中使用了很棒的 PortfolioAnalytics 包。
为了缩小协方差矩阵,我使用了“sigma.robust”示例。我使用 EDHEC 数据。
我创建了初始投资组合,并从中创建了我打算比较的 4 个投资组合。
我想看到的是,a)通过健壮的 covar 是有效的——通过将它与有和没有的 covar 进行比较,以及 b)它与 StdDev 和预期短缺的风险模型一起工作。
data(edhec)
# Use the first 4 columns in edhec for a returns object
R <- edhec[, 1:4]
colnames(R) <- c("CA", "CTAG", "DS", "EM")
head(R, 5)
funds <- colnames(R)
初始化 pf 并使用一些基本约束
init.portf <- portfolio.spec(assets=funds)
init.portf <- add.constraint(portfolio=init.portf, type="full_investment")
init.portf <- add.constraint(portfolio=init.portf, type="box",min = .05,max = .4)
以标准差为目标的投资组合
SD.portf <- add.objective(portfolio=init.portf, type="risk", name="StdDev")
SD.portf <- add.objective(portfolio=SD.portf, type="return", name="mean")
以预期短缺为目标的投资组合
ES.portf <- add.objective(portfolio=init.portf, type="risk", name="ES")
ES.portf <- add.objective(portfolio=ES.portf, type="return", name="mean")
健壮 covar 的函数
sigma.robust <- function(R){
require(MASS)
out <- list()
set.seed(1234)
out$sigma <- cov.rob(R, method="mcd")$cov
return(out)
}
通过自定义函数
opt.sd_robust <- optimize.portfolio(R, SD.portf,optimize_method="ROI",momentFUN = "sigma.robust",trace = TRUE)
opt.es_robust <- optimize.portfolio(R, ES.portf,optimize_method="ROI",momentFUN = "sigma.robust",trace = TRUE)
创建我打算对比效果的正常投资组合
opt.sd <- optimize.portfolio(R, SD.portf,optimize_method="ROI",trace = TRUE)
opt.es <- optimize.portfolio(R, ES.portf,optimize_method="ROI",trace = TRUE)
将它们组合起来以便于查看
opt_comb = combine.optimizations(list(opt.sd_robust = opt.sd_robust,opt.es_robust = opt.es_robust,opt.sd = opt.sd,opt.es = opt.es))
绘制它们
chart.Weights(opt_comb,ylim(0,1))
检查他们
extractWeights(opt_comb)
CA CTAG DS EM
opt.sd_robust 0.08507019 0.1149298 0.4 0.40
opt.es_robust 0.15000000 0.4000000 0.4 0.05
opt.sd 0.05000000 0.1500000 0.4 0.40
opt.es 0.15000000 0.4000000 0.4 0.05
结论
它确实适用于使用 StdDev 的风险模型。权重不同。通关已经奏效。但这似乎不会影响预期短缺模型。重量是相同的。我发现即使我放宽了框约束也是如此[我想知道我是否已经使任何其他结果不可行,所以我尝试了有无约束]。
所以我想我想知道我是否做错了什么。我虽然 ES 只是查看从变换后的协方差矩阵有效导出的分布的尾部。
因此,缩小/正则化 covar 将与 ES 兼容。
所以我得出结论,我做错了什么。
有人可以帮忙吗?