2015-01-15 26 views
5

Robię średnią optymalizację wariancji, aby rozwiązać problem optymalizacji portfeli. Co staram się robić to, aby zminimalizować zmienność zarówno pod względem ograniczenia:Średnia optymalizacja wariancji

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

Więc to jest kod zrobiłem:

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

mi wiadomo, jestem przy użyciu dużo złych rzeczy dla R, ale nie mogłem wymyślić lepszego rozwiązania. Więc moje pytanie jest poprawne?

Każda korekta i sugestia poprawy tego procesu! prosimy o udostępnienie swojego dotychczasowego kodu w R.

Ogromne dzięki!

+0

Możesz otrzymać macierz kowariancji aktywów przez: "cov (d)" i oznacza "colMeans (d)". –

+0

Jaką rolę odgrywa tu 'mu'? – Khashaa

Odpowiedz

3

Jednym ze sposobów jest minimalizacja numeryczna przez z pakietu Rsolnp. Daje to również sposób dodać więcej ograniczeń (ograniczeń dźwigni itp):

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) 

po rozwiązaniu możemy wydrukować parametry i wariancji portfela:

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

w twojej prostym przypadku zamkniętego rozwiązanie istnieje i można sprowadzić do:

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) 

której "na szczęście" daje te same wyniki:

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