【问题标题】:Portfolio optimization with R with known mu and cov matrix使用已知 mu 和 cov 矩阵的 R 进行投资组合优化
【发布时间】:2014-02-03 11:08:03
【问题描述】:

希望优化 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")

具有上面指定的返回和协方差。这将如何运作?

问候 安德烈亚斯

【问题讨论】:

  • solveRquadprog 的文档(由efficientPortfolio 调用)说你可以传递一个带有muSigma 组件的列表,但这似乎没有实现:如果你真的想要要使用此功能,您必须构建一个没有数据的fPFOLIODATA 对象。直接拨打quadprog::solve.QP可能更方便。
  • @user2157086,因为您没有指定您的预期输出,请查看此 R script,您可以在其中找到很多关于有效均值方差投资组合的函数。

标签: r finance portfolio


【解决方案1】:

你需要做这样的事情:

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)

【讨论】:

  • 感谢您的回答,但这不是我打算做的。我只想交出我的估计值。
【解决方案2】:

我不是 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)
}

让我们测试它是否给出相同的结果:

library(fPortfolio)

#This is how you would usually do it
defaultSpec <- portfolioSpec()
setTargetReturn(defaultSpec) <- 0.06
lppAssets <- 100*LPP2005.RET[, c("SBI", "SPI", "LMI", "MPI")]
lppData <- portfolioData(data = lppAssets, spec = defaultSpec)
port <- efficientPortfolio(lppData, defaultSpec, constraints = "LongOnly")

#Now I am creating my own mu and sigma 
#In this case exactly the same as the estimation above to see if the results match  
mu <- c(SBI=0.0000406634, SPI=0.0841754390, LMI=0.0055315332, MPI=0.0590515119)
sigma <- matrix(c(0.015899554, -0.01274142,  0.009803865, -0.01588837,-0.012741418,  0.58461212, -0.014074691,  0.41159843,0.009803865, -0.01407469,  0.014951108, -0.02332223,-0.015888368,  0.41159843, -0.023322233,  0.53503263), 4, 4, dimnames=list(names(mu), names(mu))) 
myLppData <- myPortfolioData(mu, sigma, lppAssets, defaultSpec)
myPort <- efficientPortfolio(myLppData, defaultSpec, constraints = "LongOnly")

all.equal(port@portfolio, myPort@portfolio)

现在用你的号码:

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")

希望有帮助!

【讨论】:

  • 很好的解决方案。但有一件事,我试图运行代码,但它说找不到对象'covar',我认为你需要更正函数;西格玛 = 西格玛。或者您应该将对象 sigma 更改为 covar。对吗?
【解决方案3】:

还有另一种方法可以编写您自己的协方差估计器。这在 Portfolio Optimization with R/Rmetrics Update 2015,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")

这也会产生相同的答案。

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 

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

【讨论】:

    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 2018-03-06
    • 2020-10-15
    • 2016-03-12
    • 1970-01-01
    • 2019-09-08
    • 2016-07-07
    • 2022-11-18
    相关资源
    最近更新 更多