【发布时间】:2016-09-15 23:30:15
【问题描述】:
我正在通过两个约束来最小化股票投资组合波动率:
- 库存权重总和必须 = 1,这样可以正常工作。
- 权重平方和必须小于 0.02,这样做是为了在投资组合中至少有 50 只股票。组合中有足够的股票(大约 100 只),所以应该没有任何问题可以满足这个要求约束。
但是,由于某种原因,第二个约束不起作用。有人可以解释一下如何正确设置这些界限吗?
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
【问题讨论】:
-
您的不等式约束定义不正确。请参阅:docs.scipy.org/doc/scipy-0.17.0/reference/generated/… - 您必须提供
g_i(x),而不是布尔值。 -
你能告诉我怎么做吗?我找不到任何约束形式为“>”或“的示例
-
认为我已经通过将第二个约束更改为
sum(x**2) - 0.02来解决这个问题,但它仍然无法正常工作,@cel 你能建议如何纠正它吗? -
你的
weights来自哪里?初始权重是否满足不等式约束? -
嗯好的,解决了,应该是这样的
-sum(x**2) + 0.02
标签: python scipy mathematical-optimization