2015-01-15 24 views
5

Tôi đang thực hiện tối ưu hóa phương sai trung bình để giải quyết vấn đề tối ưu hóa danh mục đầu tư. Những gì tôi đang cố gắng làm là để giảm thiểu phương sai đối với cả hai hạn chế:Tối ưu hóa phương sai trung bình

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

vì vậy, đây là đoạn code tôi đã làm:

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

tôi biết, tôi đang sử dụng rất nhiều điều xấu cho R, nhưng tôi không thể tìm ra một giải pháp tốt hơn. Vì vậy, câu hỏi của tôi là nó đúng?

Bất kỳ sửa chữa và đề xuất nào để cải thiện quy trình này! vui lòng chia sẻ mã mở rộng của bạn trong R.

Rất cám ơn!

+0

Bạn có thể nhận ma trận hiệp phương sai của các tài sản bằng cách: 'cov (d)' và có nghĩa là 'colMeans (d)'. –

+0

'Mu' chơi gì ở đây? – Khashaa

Trả lời

3

Một cách là giảm thiểu số lượng theo solnp() từ gói Rsolnp. Điều này cũng cung cấp một cách để thêm các hạn chế (hạn chế đòn bẩy vv):

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) 

sau khi giải quyết bây giờ chúng ta có thể in các thông số và phương sai danh mục đầu tư:

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

Trong trường hợp đơn giản của bạn một giải pháp khép kín tồn tại và có thể được luộc xuống:

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) 

mà "may mắn" cho kết quả tương tự:

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