具有已知mu和cov矩阵的R投资组合优化

具有已知mu和cov矩阵的R投资组合优化,r,finance,portfolio,R,Finance,Portfolio,希望在fPortfolio中优化投资组合,理想情况下,向量mu(收益)和协方差矩阵已经已知(从其他进行计算的算法中)。那么,假设我有以下几点: mu = c(0.05,0.1,0.075,0.06) cov= 0.02657429 0.01805751 0.02048764 0.02110555 0.01805751 0.03781108 0.03859943 0.02959261 0.02048764 0.03859943 0.04606304 0.03043146 0.0211055

希望在fPortfolio中优化投资组合,理想情况下,向量mu(收益)和协方差矩阵已经已知(从其他进行计算的算法中)。那么,假设我有以下几点:

mu = c(0.05,0.1,0.075,0.06)
cov=    
0.02657429 0.01805751 0.02048764 0.02110555
0.01805751 0.03781108 0.03859943 0.02959261
0.02048764 0.03859943 0.04606304 0.03043146
0.02110555 0.02959261 0.03043146 0.03880064
现在,我想做什么

efficientPortfolio(data, spec = portfolioSpec(), constraints = "LongOnly")
返回和协方差如上所述。那怎么办

问候
安德烈亚斯

你需要这样做:

library(quadprog)

d = rep(0,4); #4 - no. of stocks
A = rbind(rep(1,4), #1st const. --- sum of weights should be 1
                mu, #2nd const. --- returns should be positive
                diag(4) #3rd const ---- all the weights are positive   
        );
b = c(1, 0, rep(0,4) );
solve.QP(cov, d, t(A), b, meq=1)

我不是fPortfolio软件包的专家。但看起来您需要定义自己的fPFOLIODATA对象。在fPortfolio中,这是在portfolioData()函数中完成的。因此,一个快速而肮脏的解决方案可能是编写自己的函数,该函数不进行协方差估计,而是将估计的mu和sigma作为输入。 因此,我的解决方案如下:

myPortfolioData <- function(mu, sigma, data, spec){
    if (is(data, "fPFOLIODATA")) 
        return(data)
    stopifnot(class(data) == "timeSeries")
    data = sort(data)
    nAssets = NCOL(data)
    names = colnames(data)
    if (is.null(names)) 
        names = paste("A", 1:nAssets, sep = "")
    Cov = cov(data)
    rownames(Cov) <- colnames(Cov) <- names
    .data = list(series = data, nAssets = nAssets, names = names)
    .statistics <- list(mean = colMeans(data), Cov = Cov, estimator = 'other', mu = mu, Sigma = covar);
    .tailRisk = spec@model$tailRisk
    new("fPFOLIODATA", data = .data, statistics =.statistics, tailRisk = .tailRisk)
}

myPortfolioData还有另一种方法可以编写自己的协方差估计器。《2015年R/Rmetrics更新投资组合优化》,Diethelm Würtz,Tobias Setz,Yohan Chalabi,William Chen,Andrew Ellis,第234页,对此进行了解释

您可以这样做:-

mu = c(0.05,0.1,0.075,0.06)
cov <- matrix(c(0.02657429, 0.01805751, 0.02048764, 0.02110555, 0.01805751, 0.03781108, 0.03859943, 0.02959261, 0.02048764, 0.03859943, 0.04606304, 0.03043146, 0.02110555, 0.02959261, 0.03043146, 0.03880064), 4, 4, dimnames=list(names(mu), names(mu))) 
lppAssets <- 100*LPP2005.RET[, c("SBI", "SPI", "LMI", "MPI")]

covtEstimator <- function (x, spec = NULL, ...) {
x.mat = as.matrix(x)
list(mu = mu, Sigma = cov) }   #Input your mean and covariance matrix here.

defaultSpec <- portfolioSpec()
setEstimator(defaultSpec) <- "covtEstimator"
setTargetReturn(defaultSpec) <- 0.06

myPort2 <- efficientPortfolio(lppAssets, defaultSpec, constraints = "LongOnly")

希望现在回答这个问题还不算太晚!可能对其他人有用。感谢

solveRquadprog
的文档(由
efficientPortfolio
调用)说,您可以传递一个包含
mu
Sigma
组件的列表,但这似乎没有实现:如果您真的想使用此函数,您必须构建一个没有数据的
fPFOLIODATA
对象。直接调用
quadprog::solve.QP
可能更容易。@user2157086,因为您还没有指定预期的输出,请看这里,您可以找到许多关于有效平均风险值投资组合的函数。谢谢您的回答,但我不打算这么做。我只想交出我的估计值。很好的解决方案。但有一件事,我试着运行代码,但它说没有找到对象“covar”,我认为你需要修正函数;西格玛=西格玛。或者您应该将对象sigma更改为covar。是这样吗?
mu <- c(SBI=0.05, SPI=0.1, LMI=0.075, MPI=0.06)
sigma <- matrix(c(0.02657429, 0.01805751, 0.02048764, 0.02110555, 0.01805751, 0.03781108, 0.03859943, 0.02959261, 0.02048764, 0.03859943, 0.04606304, 0.03043146, 0.02110555, 0.02959261, 0.03043146, 0.03880064), 4, 4, dimnames=list(names(mu), names(mu))) 
myLppData <- myPortfolioData(mu, sigma, lppAssets, defaultSpec)
myPort <- efficientPortfolio(myLppData, defaultSpec, constraints = "LongOnly")
mu = c(0.05,0.1,0.075,0.06)
cov <- matrix(c(0.02657429, 0.01805751, 0.02048764, 0.02110555, 0.01805751, 0.03781108, 0.03859943, 0.02959261, 0.02048764, 0.03859943, 0.04606304, 0.03043146, 0.02110555, 0.02959261, 0.03043146, 0.03880064), 4, 4, dimnames=list(names(mu), names(mu))) 
lppAssets <- 100*LPP2005.RET[, c("SBI", "SPI", "LMI", "MPI")]

covtEstimator <- function (x, spec = NULL, ...) {
x.mat = as.matrix(x)
list(mu = mu, Sigma = cov) }   #Input your mean and covariance matrix here.

defaultSpec <- portfolioSpec()
setEstimator(defaultSpec) <- "covtEstimator"
setTargetReturn(defaultSpec) <- 0.06

myPort2 <- efficientPortfolio(lppAssets, defaultSpec, constraints = "LongOnly")
Title:
MV Efficient Portfolio 
Estimator:         covtEstimator 
Solver:            solveRquadprog 
Optimize:          minRisk 
Constraints:       LongOnly 

Portfolio Weights:
[1] 0.7316 0.1829 0.0000 0.0855

Covariance Risk Budgets:
[1] 0.1473 0.6156 0.0000 0.2370

Target Returns and Risks:
 mean     mu    Cov  Sigma   CVaR    VaR 
0.0205 0.0600 0.1986 0.1555 0.4805 0.3003