带scipy.optimize.minimize()的Ineq和eq约束

2024-04-30 06:14:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图了解scipy.optimize.minimize中约束的行为:

首先,我创建了4个资产和100个返回场景。平均回报率是从好到坏的

#seed first 
np.random.seed(1)

df_returns = pd.DataFrame(np.random.rand(100,4) - 0.25, columns =list('ABCD'))
df_returns.head()

    A           B           C           D
0   0.167022    0.470324    -0.249886   0.052333
1   -0.103244   -0.157661   -0.063740   0.095561
2   0.146767    0.288817    0.169195    0.435220
3   -0.045548   0.628117    -0.222612   0.420468
4   0.167305    0.308690    -0.109613   -0.051899

还有一组砝码

weights = pd.Series([0.25, 0.25, 0.25, 0.25], index=list('ABCD'))

    0
A   0.25
B   0.25
C   0.25
D   0.25

我们创建一个目标函数:

def returns_objective_function(weights, df_returns):
    result = -1. * (df_returns * weights).mean().sum()
    return result

以及约束和界限

cons = ({'type': 'eq', 'fun': lambda weights: np.sum(weights) -1  })
bnds = ((0.01, .8), (0.01, .8), (0.01, .8), (0.01, .75))

让我们优化

optimize.minimize(returns_objective_function, weights, (df_returns),
                              bounds=bnds, constraints=cons, method= 'SLSQP')

And we get success.
  status: 0
 success: True
    njev: 8
    nfev: 48
     fun: -0.2885398923185326
       x: array([ 0.01,  0.23,  0.01,  0.75])
 message: 'Optimization terminated successfully.'
     jac: array([-0.24384782, -0.2789166 , -0.21977262, -0.29300382,  0.        ])
     nit: 8

现在我想从一个基本不等式开始添加约束:

scipy.optimize.minimize文档状态

Equality constraint means that the constraint function result is to be zero whereas inequality means that it is to be non-negative.

cons = ( 
        {'type': 'eq', 'fun': lambda weights: np.sum(weights) -1  }
        ,{'type': 'ineq', 'fun': lambda weights: np.sum(weights) + x}
)

取决于x,我会有意想不到的行为。

x = -100

根据界限,权重可以是最大值3.15,当然,必须通过第一个等式约束np.sum(weights) - 1求和为1,但是,结果np.sum(weights) + x将始终为负。我认为不应该找到解决方案,但是scipy.optimize.minimize会返回成功。


Tags: lambdadftypenpfunctionscipyresultreturns