【问题标题】:Python Scipy Optimizer: Constraints are not working as expectedPython Scipy Optimizer:约束未按预期工作
【发布时间】:2016-09-15 23:30:15
【问题描述】:

我正在通过两个约束来最小化股票投资组合波动率:

  1. 库存权重总和必须 = 1,这样可以正常工作。
  2. 权重平方和必须小于 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


【解决方案1】:

如果你没有绑定 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

【讨论】:

  • 我认为这可行并且是一个很好的解决方案,但问题是专门询问 SciPy 以及为什么可能会忽略约束。这没有回答。
猜你喜欢
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-28
  • 2015-10-07
相关资源
最近更新 更多