2015-01-15 6 views
5

Ich mache eine mittlere Varianz-Optimierung, um das Problem der Portfolio-Optimierung zu lösen. Was ich versuche zu tun, um die Varianz hinsichtlich beiden Einschränkungen zu minimieren:Mittlere Varianz-Optimierung

  1. x1m1 + x2m2 + ... + xnmn = m
  2. x1 + x2 + ... + xn = 1

das ist also der Code, den ich tat:

################ 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 

ich bekannt, ich bin eine Menge schlechter Dinge für R, aber ich konnte nicht eine bessere Lösung herauszufinden. Also meine Frage ist es richtig?

Alle Korrekturen und Vorschläge zur Verbesserung dieses Prozesses! Fühlen Sie sich frei, Ihren vorhandenen Code in R zu teilen.

Riesiger Dank!

+0

Sie können Ihre Kovarianzmatrix der Assets erhalten durch: 'cov (d)' und bedeutet durch 'colMeans (d)'. –

+0

Welche Rolle spielt 'mu' hier? – Khashaa

Antwort

3

Ein Weg ist, numerisch zu solnp() aus dem Rsolnp Paket zu minimieren. Dies bietet auch eine Möglichkeit, mehr Einschränkungen hinzufügen (Leverage Einschränkungen etc.):

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) 

nach Lösen wir nun die Parameter und Portfoliovarianz drucken:

> x$par 
[1] -5.490106 -11.270906 17.761012 
> x$vscale[1] 
[1] 630.4916 

In Ihrem einfachen Fall eine geschlossene Lösung existiert und

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) 

, die "zum Glück" gibt die gleichen Ergebnisse: kann bis zu gekocht werden

> sol2(50) 
     [,1] 
x -5.490106 
y -11.270906 
z 17.761012 
> fmin(sol2(50)) 
[1] 630.4916