二次优化 - 投资组合最大化问题
Quadratic optimization - portfolio maximization problems
在投资组合分析中,给定期望,我们旨在找到每个资产的权重以最小化方差
这是代码
install.packages("quadprog")
library(quadprog)
#Denoting annualized risk as an vector sigma
sigma <- c(0.56, 7.77, 13.48, 16.64)
#Formulazing the correlation matrix proposed by question
m <- diag(0.5, nrow = 4, ncol = 4)
m[upper.tri(m)] <- c(-0.07, -0.095, 0.959, -0.095, 0.936, 0.997)
corr <- m + t(m)
sig <- corr * outer(sigma, sigma)
#Defining the mean
mu = matrix(c(1.73, 6.65, 9.11, 10.30), nrow = 4)
m0 = 8
Amat <- t(matrix(c(1, 1, 1, 1,
c(mu),
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1), 6, 4, byrow = TRUE))
bvec <- c(1, m0, 0, 0, 0, 0)
qp <- solve.QP(sig, rep(0, nrow(sig)), Amat, bvec, meq = 2)
qp
x = matrix(qp$solution)
x
(t(x) %*% sig %*% x)^0.5
我了解 mu 和协方差矩阵的公式,并且了解 quadprog
图
的用法
但是,我不明白为什么Amat
和bvec
是这样定义的,为什么是6×4矩阵。
$mu0$ 是我们对投资组合的期望值,固定为 8%
附上问题
您可能已经知道,Amat
有四列的原因是您要分配四种资产。它有六行,因为你的问题有六个约束:
- 分配总计 1 (100%)
- 预期 return = 8%
- 'Money market' 分配 >= 0
- 'Capital stable' 分配 >= 0
- 'Balance'分配>=0
- 'Growth' 分配 >= 0
查看定义每个约束的数字。这就是 bvec
是 [1, 8, 0, 0, 0, 0]
的原因。这六个中,前两个是等式约束,这就是为什么meq
设置为2(其他四个是大于等于约束)。
编辑添加:
约束的工作方式是这样的:Amat
的每一列定义一个约束,然后乘以资产分配,结果等于(或大于或等于) 在 bvec
中设置的一些目标。例如:
Amat
的第一列是[1, 1, 1, 1]
,bvec
的第一个条目是1。所以第一个约束是:
1 * money_market + 1 * capital_stable + 1 * balance + 1 * growth = 1
这是资产配置加起来为 1 的一种说法。
第二个约束表示预期的 return 加起来为 8:
1.73 * money_market + 6.65 * capital_stable + 9.11 * balance + 10.32 * growth = 8
现在考虑第三个约束,它表示 'Money market' 分配大于或等于零。那是因为 Amat
的第 3 列是 [1, 0, 0, 0]
而 bvec
的第三个条目是 0。所以这个约束看起来像:
1 * money_market + 0 * capital_stable + 0 * balance + 0 * growth >= 0
简化,等同于:
money_market >= 0
在投资组合分析中,给定期望,我们旨在找到每个资产的权重以最小化方差
这是代码
install.packages("quadprog")
library(quadprog)
#Denoting annualized risk as an vector sigma
sigma <- c(0.56, 7.77, 13.48, 16.64)
#Formulazing the correlation matrix proposed by question
m <- diag(0.5, nrow = 4, ncol = 4)
m[upper.tri(m)] <- c(-0.07, -0.095, 0.959, -0.095, 0.936, 0.997)
corr <- m + t(m)
sig <- corr * outer(sigma, sigma)
#Defining the mean
mu = matrix(c(1.73, 6.65, 9.11, 10.30), nrow = 4)
m0 = 8
Amat <- t(matrix(c(1, 1, 1, 1,
c(mu),
1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1), 6, 4, byrow = TRUE))
bvec <- c(1, m0, 0, 0, 0, 0)
qp <- solve.QP(sig, rep(0, nrow(sig)), Amat, bvec, meq = 2)
qp
x = matrix(qp$solution)
x
(t(x) %*% sig %*% x)^0.5
我了解 mu 和协方差矩阵的公式,并且了解 quadprog
图
但是,我不明白为什么Amat
和bvec
是这样定义的,为什么是6×4矩阵。
$mu0$ 是我们对投资组合的期望值,固定为 8%
附上问题
您可能已经知道,Amat
有四列的原因是您要分配四种资产。它有六行,因为你的问题有六个约束:
- 分配总计 1 (100%)
- 预期 return = 8%
- 'Money market' 分配 >= 0
- 'Capital stable' 分配 >= 0
- 'Balance'分配>=0
- 'Growth' 分配 >= 0
查看定义每个约束的数字。这就是 bvec
是 [1, 8, 0, 0, 0, 0]
的原因。这六个中,前两个是等式约束,这就是为什么meq
设置为2(其他四个是大于等于约束)。
编辑添加:
约束的工作方式是这样的:Amat
的每一列定义一个约束,然后乘以资产分配,结果等于(或大于或等于) 在 bvec
中设置的一些目标。例如:
Amat
的第一列是[1, 1, 1, 1]
,bvec
的第一个条目是1。所以第一个约束是:
1 * money_market + 1 * capital_stable + 1 * balance + 1 * growth = 1
这是资产配置加起来为 1 的一种说法。
第二个约束表示预期的 return 加起来为 8:
1.73 * money_market + 6.65 * capital_stable + 9.11 * balance + 10.32 * growth = 8
现在考虑第三个约束,它表示 'Money market' 分配大于或等于零。那是因为 Amat
的第 3 列是 [1, 0, 0, 0]
而 bvec
的第三个条目是 0。所以这个约束看起来像:
1 * money_market + 0 * capital_stable + 0 * balance + 0 * growth >= 0
简化,等同于:
money_market >= 0