2015-01-15 17 views
5

Sto facendo un'ottimizzazione della varianza media per risolvere il problema di ottimizzazione dei portafogli. Quello che sto cercando di fare è di ridurre al minimo la varianza rispetto sia dei vincoli:Ottimizzazione media della varianza

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

Quindi questo è il codice che ho fatto:

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

ho conosciuto, sto usando un sacco di cose cattive per R, ma non riuscivo a capire una soluzione migliore. Quindi la mia domanda è corretta?

Qualsiasi correzione e suggerimento per migliorare questo processo! Non esitate a condividere il codice esistente in R.

Enorme, grazie!

+0

È possibile ottenere la matrice di covarianza delle risorse per: 'cov (d)' e significa per 'moliMeans (d)'. –

+0

Quale ruolo gioca 'mu' qui? – Khashaa

risposta

3

Un modo è ridurre al minimo numericamente da solnp() dal pacchetto Rsolnp. Questo offre anche un modo per aggiungere ulteriori restrizioni (vincoli leva 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) 

dopo aver risolto ora siamo in grado di stampare i parametri e portafoglio varianza:

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

nel tuo caso semplice esiste una soluzione chiusa e può essere riassunta in:

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) 

che "per fortuna" dà gli stessi risultati:

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