最小化投资组合差异,限制为与基准投资组合充分相似

时间:2017-06-30 09:19:24

标签: r mathematical-optimization quantitative-finance quadratic-programming quadprog

我正在执行投资组合优化,我想将讨论here扩展为以下内容:

我有一个权重w_bench的向量,用作基准。我想优化满足

的投资组合权重向量w_pf
sum(pmin(w_bench, w_pf)) > 0.7

pmin这里是成对最小值。这会强制优化的投资组合权重w_pf与基准权重w_bench相似,而右手尺寸(本例中为0.7)则控制它们需要匹配的程度。随着价值变大,我们要求投资组合更加相似。

最初我以为我可以轻松地使用fPortfolio包(仍在尝试)。但到目前为止还没有骰子。我也认为用quadprog解决这个问题会更加直观,但我不知道如何将所述功能纳入流程。

Excel实施:

协方差矩阵:

0.003015254   -0.000235924  0.000242836
-0.000235924  0.002910845   0.000411308
0.000242836   0.000411308   0.002027183

重量:

    w_pf    w_bench min
V1   0.32    0.40    0.32 
V2   0.31    0.50    0.31 
V3   0.38    0.10    0.10 
Ss   1.00    1.00    0.72 

使用=MMULT(TRANSPOSE(H8:H10),MMULT(H3:J5,H8:H10))Ss(w_pf) = 1

的约束最小化差异(Ss(min) > 0.7

1 个答案:

答案 0 :(得分:2)

正如您所指出的,棘手的约束是sum(pmin(w_bench, w_pf)) > 0.7(实际上,严格的不等式非常难以实现,所以我将>=代替>;你当然可以用>= 0.7+epsilon重新解决一些小epsilon)。为了解决这个问题,我们将为我们的投资组合中的每个元素y_i创建一个新变量i,我们将添加约束y_i <= wpf_i(又名wpf_i - y_i >= 0)和{{1} }(又名y_i <= wbench_i),其中-y_i >= -wbench_i是我们所选投资组合中wpf_i的比例(决策变量),iwbench_i的比例基准投资组合(输入数据)。这会将i约束为不大于这两个值的最小值。最后,我们将添加约束y_i,要求这些最小值总和至少为0.7。

剩下的就是在\sum_i y_i >= 0.7包中实现这一点。设置问题数据:

quadprog

由于我们正在添加新变量,我们将填充协方差矩阵(将放置在优化目标中),其中0和#在与这些新变量对应的行和列中。我们可以这样做:

cov.mat <- rbind(c(0.003015254, -0.000235924, 0.000242836), c(-0.000235924, 0.002910845, 0.000411308), c(0.000242836, 0.000411308, 0.002027183))
w.bench <- c(.4, .5, .1)
n <- length(w.bench)

现在我们要为所有约束创建一个约束矩阵:

(cov.mat.exp <- cbind(rbind(cov.mat, matrix(0, n, n)), matrix(0, 2*n, n)))
#              [,1]         [,2]        [,3] [,4] [,5] [,6]
# [1,]  0.003015254 -0.000235924 0.000242836    0    0    0
# [2,] -0.000235924  0.002910845 0.000411308    0    0    0
# [3,]  0.000242836  0.000411308 0.002027183    0    0    0
# [4,]  0.000000000  0.000000000 0.000000000    0    0    0
# [5,]  0.000000000  0.000000000 0.000000000    0    0    0
# [6,]  0.000000000  0.000000000 0.000000000    0    0    0

第一行将强制将投资组合权重加总为1,下一个将强制执行(consts <- rbind(rep(c(1, 0), c(n, n)), rep(c(0, 1), c(n, n)), cbind(matrix(0, n, n), -diag(n)), cbind(diag(n), -diag(n)))) # [,1] [,2] [,3] [,4] [,5] [,6] # [1,] 1 1 1 0 0 0 # [2,] 0 0 0 1 1 1 # [3,] 0 0 0 -1 0 0 # [4,] 0 0 0 0 -1 0 # [5,] 0 0 0 0 0 -1 # [6,] 1 0 0 -1 0 0 # [7,] 0 1 0 0 -1 0 # [8,] 0 0 1 0 0 -1 (rhs <- c(1, 0.7, -w.bench, rep(0, n))) # [1] 1.0 0.7 -0.4 -0.5 -0.1 0.0 0.0 0.0 ,接下来的三个是\sum_i y_i >= 0.7约束,最后三个是-y_i >= -wbench_i约束。

剩下的就是将这些符合ypf_i-y_i >= 0函数所期望的格式:

solve.QP

喝!因为我们为新变量用协方差矩阵填充额外的0,所以它是正半定的但不是正定的。让我们在主对角线上添加一个小的正常数,然后再试一次:

library(quadprog)
mod <- solve.QP(cov.mat.exp, rep(0, 2*n), t(consts), rhs, 1)
# Error in solve.QP(cov.mat.exp, rep(0, 2 * n), t(consts), rhs, 1) : 
#   matrix D in quadratic function is not positive definite!

我们可以看到,这不是一个特别有趣的案例,因为我们努力添加的约束不是绑定。让我们将右侧从0.7增加到0.9以查看行动中的约束:

library(quadprog)
mod <- solve.QP(cov.mat.exp + 1e-8*diag(2*n), rep(0, 2*n), t(consts), rhs, 1)
(w.pf <- head(mod$solution, n))
# [1] 0.3153442 0.3055084 0.3791474
(y <- tail(mod$solution, n))
# [1] 0.3 0.3 0.1
(opt.variance <- as.vector(t(w.pf) %*% cov.mat %*% w.pf))
# [1] 0.0009708365

在这种情况下,约束具有约束力; (rhs <- c(1, 0.9, -w.bench, rep(0, n))) # [1] 1.0 0.9 -0.4 -0.5 -0.1 0.0 0.0 0.0 mod <- solve.QP(cov.mat.exp + 1e-8*diag(2*n), rep(0, 2*n), t(consts), rhs, 1) (w.pf <- head(mod$solution, n)) # [1] 0.3987388 0.4012612 0.2000000 (y <- tail(mod$solution, n)) # [1] 0.3987388 0.4012612 0.1000000 (opt.variance <- as.vector(t(w.pf) %*% cov.mat %*% w.pf)) # [1] 0.00105842 y_1采用的最小值来自我们的新投资组合,y_2采用的最小值来自基准投资组合。由于约束,我们看到最优投资组合的方差相对增加了9.0%。