Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SciPy最小化与SLSQP能否在多个非线性约束下工作?_Python_Scipy_Mathematical Optimization_Minimize_Scipy Optimize - Fatal编程技术网

Python SciPy最小化与SLSQP能否在多个非线性约束下工作?

Python SciPy最小化与SLSQP能否在多个非线性约束下工作?,python,scipy,mathematical-optimization,minimize,scipy-optimize,Python,Scipy,Mathematical Optimization,Minimize,Scipy Optimize,我试图在约束条件下找到一个最优解,并将SciPy最小化与SLSQP结合使用。它完美地工作,没有任何问题,只有一个约束。 一旦我添加了另一个约束,它将成功完成,但没有达到优化目标 我假设我的问题在于约束函数定义(约束2有点棘手),并决定学习如何正确使用最小化 我切换到一个简单的第二个约束,但又得到了一个未优化的解决方案 将要优化的功能: 年样本数=246.5 def get_portfolio_ann_risk(权重、资产回报率、年度样本): 样本数据=len(资产每天返回) cov\u矩阵=np

我试图在约束条件下找到一个最优解,并将SciPy最小化与SLSQP结合使用。它完美地工作,没有任何问题,只有一个约束。 一旦我添加了另一个约束,它将成功完成,但没有达到优化目标

我假设我的问题在于约束函数定义(约束2有点棘手),并决定学习如何正确使用最小化

我切换到一个简单的第二个约束,但又得到了一个未优化的解决方案

将要优化的功能: 年样本数=246.5

def get_portfolio_ann_risk(权重、资产回报率、年度样本):
样本数据=len(资产每天返回)
cov\u矩阵=np.cov(资产每天返回,rowvar=False,ddof=0)
权重=np.数组([权重])
重量=np点(重量T,重量)
每日变量=np.和(权重矩阵*cov矩阵)*(样本数据/(样本数据-1))
每日风险=np.sqrt(每日风险值)
返回每日风险*np.sqrt(年内样本)
函数优化输入:

最小风险优化数据=(资产每天返回,样本每年)
资产重量最大值=1
资产重量最小值=0
界限=((资产重量最小值,资产重量最大值),)*资产数量
制约因素:

两个约束选项=(
{'type':'eq','fun':lambda权重:0.5-np.max(权重)},
{'type':'eq','fun':lambda权重:1.0-np.sum(权重)}
)
优化函数

two\u constraint\u opt=最小化(获取投资组合风险、市场权重、方法='SLSQP',
args=最小风险优化数据,
约束=两个约束选项,
界限=界限,
选项={'maxiter':250,'ftol':1e-09}
)
这些约束中的每一个都是单独的,它可以很好地工作,我不能让它同时工作。 我相信,如果我能解决“更简单”的问题,我就能优化真正的问题

每个约束优化的结果都是正确的,两个约束问题的结果是默认使用的权重(初始猜测)

已解决: 显然,问题在于最初的猜测。它满足了以下要求:

{'type':'eq','fun':lambda权重:1.0-np.sum(权重)}
约束

我更改了初始猜测,使其不符合约束条件(将其乘以0.85),它的工作方式就像一个符咒

解决方案:

two\u constraint\u opt=minimize(获取投资组合风险,市场权重*0.85,方法='SLSQP',
args=最小风险优化数据,
约束=con,
界限=界限,
选项={'maxiter':250,'ftol':1e-09}
)

max约束有问题。它是不可微的,因此违反了SLSQP的假设。违反了什么样的SLSQP假设?SLSQP期望光滑函数(比如两次连续可微)。此外,非凸性可能需要良好的起点。