2016-05-19 4 views
1

期待通りに制約が働いていない私は2つの制約との株式ポートフォリオのボラティリティの最小化をやってる:株価重みののPython scipyのダウンロードオプティマイザ:

  1. 合計は= 1でなければならない、これは正常に動作します。
  2. 二乗重みの合計は0.02未満でなければなりません。これはポートフォリオに少なくとも50の株式を保有するために行われます。組成に十分な株式があります(約100)ので、これを満たす問題はありません制約。

ただし、2番目の制約は何らかの理由で機能しません。誰かが私にこの境界を正しく設定する方法を教えてもらえますか?

import scipy.optimize as spo 

def portfolio_vol(w): 

    #compute porfolio volatility 
    portfolio_volatility = np.sqrt(w.T.dot(cov_matrix).dot(w)) 
    return portfolio_volatility 


def find_optimal_allocations(): 
    bnds = tuple((0.00, 0.02) for x in weights) 
    cons = ({'type': 'eq', 'fun': lambda x: 1 - sum(x)}, {'type': 'ineq', 'fun': lambda x: sum(x**2) - 0.02}) 
    result = spo.minimize(portfolio_vol, weights, method='SLSQP', bounds = bnds, constraints = cons) 
    return result.x 
+0

あなたの不等式制約が正しく定義されていません。参照:http://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.minimize.html - ブール値ではなく、 'g_i(x)'を指定する必要があります。 – cel

+1

どうすればよいですか?制約が「>」または「<」の形である例は見つかりません –

+0

2番目の制約をこの合計(x ** 2)-0.02に変更することでわかりましたが、それでも正しく動作しない場合、@celはあなたがそれを修正する方法を提案できますか? –

答えて

0

scipyにバインドされていない場合は、cvxpyを使用できます。 このコードはあなたのために働くはずです。 (私は重みが非負あると仮定した。そうでなければ、単に制約からx >= 0を削除。)

import cvxpy as cvx 
import numpy as np 

n = 100 
M = np.random.random((n,n)) 
cov_matrix = np.cov(M) 

x = cvx.Variable(n) 
constraints = [x >= 0, cvx.sum_entries(x) == 1, cvx.sum_squares(x) <= 0.02] 

objective = cvx.Minimize(cvx.quad_form(x,cov_matrix)) 
prob = cvx.Problem(objective,constraints) 
prob.solve() 

print(prob.value) 
print(prob.variables()[0].value 
関連する問題