均值方差优化
Mean variance optimisation
我正在进行均值方差优化来解决投资组合优化问题。我想做的是最小化两个约束的方差:
- x1m1+x2m2+...+xnmn=m
- x1+x2+...+xn=1
所以这是我做的代码:
################ Simulation for n=3 ################
################ Parameters ################
mu<-50 ## Mean of the portfolio
n<-3 ## Number of asset
m1<-30000 ## Size of the simulation
########### 3 Assets ############
x<- rnorm(m1,2,1)
y<- rnorm(m1,0.5,1.5)
z<- rnorm(m1,3.75,1)
d<-data.frame(x,y,z)
################ Solution Directe ################
Sol<-function(m1) {
A = matrix(nrow=n+2, ncol=n+2)
for (i in 1:n){
for (j in 1:n)
if(i==j) {
A[i,j] <- (2*var(d[,i]))
} else {
A[i,j] <- cov(d[,i],d[,j])
}
}
for (i in 1:n){
A[i,n+1] <- -mean(d[,i])
A[i,n+2] <- -1
}
for (j in 1:n){
A[n+1,j] <- mean(d[,j])
A[n+2,j] <- 1
}
for (i in 2:n+2){
for (j in 2:n+2)
if(i==j) {
A[i,j] <- 0
} else {
A[i,j] <- 0
}
}
A
Inv=solve(A)
Sol=Inv%*%c(0,0,0,m1,1)
result=list(x=Sol,A=A,Inv=Inv)
return(result)
}
Sol(mu)
Sol(mu)$x ## The solution
Sol(mu)$A
我知道,我对 R 使用了很多不好的东西,但我想不出更好的解决方案。所以我的问题是正确的吗?
任何改进此过程的更正和建议!请随时在 R 中分享您现有的代码。
非常感谢!
一种方法是通过 Rsolnp
包中的 solnp()
在数值上最小化。这也提供了一种添加更多限制(杠杆约束等)的方法:
muVec <- colMeans(d) #mean-vector of assets
Sigma <- cov(d) #covariance-matrix
fmin <- function(x) as.numeric(t(x) %*% Sigma %*% x) #variance of portfolio to min.
eqn <- function(x) c(t(x) %*% muVec, sum(x)) #equality restriction
sol <- function(mu) Rsolnp::solnp(rep(0.5, 3), fun=fmin, eqfun=eqn, eqB=c(mu,1))
x <- sol(50)
求解后我们现在可以打印参数和投资组合方差:
> x$par
[1] -5.490106 -11.270906 17.761012
> x$vscale[1]
[1] 630.4916
在您的简单情况下,存在一个封闭的解决方案,可以归结为:
S <- solve(Sigma)
A <- matrix( c(t(muVec) %*% S %*% muVec,
rep( t(muVec) %*% S %*% rep(1,3), 2),
t(rep(1,3)) %*% S %*% rep(1,3)), ncol=2
)
sol2 <- function(mu) S %*% cbind(muVec,1) %*% solve(A) %*% c(mu,1)
其中 "luckily" 给出了相同的结果:
> sol2(50)
[,1]
x -5.490106
y -11.270906
z 17.761012
> fmin(sol2(50))
[1] 630.4916
我正在进行均值方差优化来解决投资组合优化问题。我想做的是最小化两个约束的方差:
- x1m1+x2m2+...+xnmn=m
- x1+x2+...+xn=1
所以这是我做的代码:
################ Simulation for n=3 ################
################ Parameters ################
mu<-50 ## Mean of the portfolio
n<-3 ## Number of asset
m1<-30000 ## Size of the simulation
########### 3 Assets ############
x<- rnorm(m1,2,1)
y<- rnorm(m1,0.5,1.5)
z<- rnorm(m1,3.75,1)
d<-data.frame(x,y,z)
################ Solution Directe ################
Sol<-function(m1) {
A = matrix(nrow=n+2, ncol=n+2)
for (i in 1:n){
for (j in 1:n)
if(i==j) {
A[i,j] <- (2*var(d[,i]))
} else {
A[i,j] <- cov(d[,i],d[,j])
}
}
for (i in 1:n){
A[i,n+1] <- -mean(d[,i])
A[i,n+2] <- -1
}
for (j in 1:n){
A[n+1,j] <- mean(d[,j])
A[n+2,j] <- 1
}
for (i in 2:n+2){
for (j in 2:n+2)
if(i==j) {
A[i,j] <- 0
} else {
A[i,j] <- 0
}
}
A
Inv=solve(A)
Sol=Inv%*%c(0,0,0,m1,1)
result=list(x=Sol,A=A,Inv=Inv)
return(result)
}
Sol(mu)
Sol(mu)$x ## The solution
Sol(mu)$A
我知道,我对 R 使用了很多不好的东西,但我想不出更好的解决方案。所以我的问题是正确的吗?
任何改进此过程的更正和建议!请随时在 R 中分享您现有的代码。
非常感谢!
一种方法是通过 Rsolnp
包中的 solnp()
在数值上最小化。这也提供了一种添加更多限制(杠杆约束等)的方法:
muVec <- colMeans(d) #mean-vector of assets
Sigma <- cov(d) #covariance-matrix
fmin <- function(x) as.numeric(t(x) %*% Sigma %*% x) #variance of portfolio to min.
eqn <- function(x) c(t(x) %*% muVec, sum(x)) #equality restriction
sol <- function(mu) Rsolnp::solnp(rep(0.5, 3), fun=fmin, eqfun=eqn, eqB=c(mu,1))
x <- sol(50)
求解后我们现在可以打印参数和投资组合方差:
> x$par
[1] -5.490106 -11.270906 17.761012
> x$vscale[1]
[1] 630.4916
在您的简单情况下,存在一个封闭的解决方案,可以归结为:
S <- solve(Sigma)
A <- matrix( c(t(muVec) %*% S %*% muVec,
rep( t(muVec) %*% S %*% rep(1,3), 2),
t(rep(1,3)) %*% S %*% rep(1,3)), ncol=2
)
sol2 <- function(mu) S %*% cbind(muVec,1) %*% solve(A) %*% c(mu,1)
其中 "luckily" 给出了相同的结果:
> sol2(50)
[,1]
x -5.490106
y -11.270906
z 17.761012
> fmin(sol2(50))
[1] 630.4916