2014-05-23 19 views
4

我能夠使用cvxopt計算的有效邊界,每個文檔:如何使用cvxopt進行帶有約束的均值方差優化?

http://cvxopt.org/examples/book/portfolio.html

但是,我無法弄清楚如何添加一個約束,以便有在某一特定資產的最高上限允許體重。這可能使用cvxopt?

這是我的代碼到目前爲止產生一個有效的邊界沒有約束,除非我相信b,它將權重的最大總和設置爲1.我不確定G,h,A和mus做什麼,而這些文檔並沒有真正解釋。 mus的公式中的10 **(5.0 * t/N-1.0)來自哪裏?

from math import sqrt 
from cvxopt import matrix 
from cvxopt.blas import dot 
from cvxopt.solvers import qp, options 

# Number of assets 
n = 4 
# Convariance matrix 
S = matrix([[ 4e-2, 6e-3, -4e-3, 0.0 ], 
      [ 6e-3, 1e-2, 0.0, 0.0 ], 
      [-4e-3, 0.0, 2.5e-3, 0.0 ], 
      [ 0.0, 0.0, 0.0, 0.0 ]]) 
# Expected return 
pbar = matrix([.12, .10, .07, .03]) 

# nxn matrix of 0s 
G = matrix(0.0, (n,n)) 
# Convert G to negative identity matrix 
G[::n+1] = -1.0 
# nx1 matrix of 0s 
h = matrix(0.0, (n,1)) 
# 1xn matrix of 1s 
A = matrix(1.0, (1,n)) 
# scalar of 1.0 
b = matrix(1.0) 

N = 100 
mus = [ 10**(5.0*t/N-1.0) for t in range(N) ] 
options['show_progress'] = False 
xs = [ qp(mu*S, -pbar, G, h, A, b)['x'] for mu in mus ] 
returns = [ dot(pbar,x) for x in xs ] 
risks = [ sqrt(dot(x, S*x)) for x in xs ] 

#Efficient frontier 
plt.plot(risks, returns) 

回答

3

您正在使用cvxopt包的二次規劃求解,檢查出documentation

正如您從公式中看到的那樣,Gx <= h是不等式約束,Ax = b是等式約束。 GA是矩陣,而hb是矢量。

讓我們假設你想限制你第一次資產爲2%和5%之間的權重,你會提出這個如下:

G = matrix([[-1, 0, 0, 0], 
      [ 1, 0, 0, 0]]) 

h = matrix([[-0.02], 
      [0.05]]) 

注意,第一行是打開的不平等條件爲Gx >= h乘以-1。

您上面的條件將所有資產設置爲介於0%和100%之間的範圍,通常沒有賣空條件。

您使用的公式是:here:您的muq在維基百科的文章,因此是一個風險承受能力參數。將它附加到目標函數的協方差或返回部分並不重要。這只是表示您要麼從右上角走到左下角,要麼對應mu的每個值。所以這只是一個功能,可以爲您提供從非常小到非常大的風險承受能力。我認爲有一個錯誤,雖然該系列從0.1開始,但應該從0開始。

0

主要是組織您的ineq和eq約束,例如,如果您想允許賣出2資產,則-1 < = x(i)< = 1且sum(x(i))= 1。因此,解決ineq,一個有4個ineq,所以G必須是4x2,h是4x1。檢查它... G = [I/-I]其中I是一個,即G = [[1,0],[0,1],[ - 1,0],[0,-1]] xs [x1 ,x2]和h = [1,1,1,1]如果您使用Gx < = h您將得到x1 < = 1,x2 < = 1 x1> = - 1且x2> = - 1 /。平等時間爲Ax = b,b = 1且A = [1,1] .. aagin檢查它,x1 + x2 = 1與約束匹配。 P和Q你已經擁有。你現在已經準備好解決了。