優化
優化 ETF 投資組合
我知道如何使用以下約束進行均值變異數或最小變異數投資組合優化
- 權重必須加到 1.0
- 沒有賣空
- 任何股票的最大重量
使用基本的二次規劃技術。但是,我被以下內容難住了:
我的股票程式碼世界由 ETF 組成。假設我想要形式的約束:
- 債券基金不超過投資組合的20%(有很多可能的債券基金)
- 一種資產類別(如房地產)的基金不超過投資組合的 30%
我怎樣才能執行這樣的投資組合優化?
在 R 中使用solve.QP,一種簡單的方法是為您要約束的每個組添加一個二元曝光向量作為不等式約束到您的Amat矩陣。
唯一的問題是曝光和b_0向量中的值應該是負數,因為該函式確實滿足約束:A^T b >= b_0。
對於我們要約束的兩個組的簡單均值變異數範例:
library(quadprog) library(MASS) # Generate some returns set.seed(100) n <- 100 # number of assets m <- 200 # number of states of the world rho <- 0.7 sigma <- 0.2 mu <- .1 Cov <- matrix(rho*sigma*sigma, ncol=n, nrow=n) diag(Cov) <- rep(sigma*sigma, n) S <- 1 + matrix(mvrnorm(m, rep(mu, n), Sigma=Cov), ncol=n) # Calculate a covariance matrix Cov <- var(S) # Setup quadratic problem mu <- apply(S, 2, mean) mu.target <- mean(mu) bLo <- rep(0, n) # Define group membership (arbitrary example) group1 <- matrix(0,100) group2 <- matrix(0,100) group3 <- matrix(0,100) group1[mu <= mean(mu) - .005] <- -1 group2[mu > (mean(mu) - .005) & mu <= (mean(mu) + .005)] <- -1 group3[mu > mean(mu) + .005] <- -1 Amat <- rbind(1, mu) dim(bLo) <- c(n,1) bvec <- t(rbind(1, mu.target, bLo)) zMat <- diag(n) Amat <- t(rbind(Amat, zMat)) Dmat <- Cov dvec <- rep(0, nrow(Amat)) meq <- 2 # the first two columns are equality constraints sol <- solve.QP(Dmat=Dmat, dvec=dvec, Amat=Amat, bvec=bvec, meq) cat(paste("Without group constraints:\n")) data.frame(Group1=sum(sol$solution * -group1), Group2=sum(sol$solution * -group2), Group3=sum(sol$solution * -group3)) # Add group constraints: # Group1 <= 20% # Group2 <= 30% Amat <- rbind(1, mu, t(group1), t(group2)) dim(bLo) <- c(n,1) bvec <- t(rbind(1, mu.target, -.20, -.30, bLo)) zMat <- diag(n) Amat <- t(rbind(Amat, zMat)) Dmat <- Cov dvec <- rep(0, nrow(Amat)) sol <- solve.QP(Dmat=Dmat, dvec=dvec, Amat=Amat, bvec=bvec, meq) cat(paste("With group constraints:\n")) data.frame(Group1=sum(sol$solution * -group1), Group2=sum(sol$solution * -group2), Group3=sum(sol$solution * -group3))
組權重:
1 2 3 Without constraints 26.4% 53.1% 20.4% With constraints 20.0% 30.0% 50.0%