关于 Scipy 的问题 - 最小化。添加额外的约束

数据挖掘 优化
2021-09-21 18:35:08

我正在尝试使用scipy minimize函数进行以下优化:

V = np.matrix(pd.read_csv('V.csv'))`

R = np.matrix(pd.read_csv('R.csv', index_col = 'Ticker'))`

w0= list()
for i in range(0, 84):
    w0.append(1/84)

def calculate_portfolio_var(w,V):
    w = np.matrix(w)
    return (w*V*w.T)[0,0]

cons = ({'type': 'eq', 'fun': lambda x:  np.sum(x)-1.0})
myBound = [(0, 1) for i in range(0, 84)]
res= minimize(calculate_portfolio_var, w0, args=V, method='SLSQP',constraints=cons, bounds = myBound)

其中V是方差-协方差矩阵,R是股票年化收益率的序列。

除了 2 个约束 (consmyBound) 之外,我还想要一个额外的约束,即结果投资组合收益(结果权重和股票收益的加权平均值)等于某个数量并且股票数量小于等于一定数。。

例如,它应该如下所示:

cons = ({'type': 'eq', 'fun': lambda x:  np.sum(x)-1.0},
        {'type': 'eq', PortfolioReturn = 10%,
        {'type': 'ineq', number of result stocks <= 40)

我对 Scipy 最小化不太熟悉,如果有人可以帮助我,我将不胜感激。

1个回答

我认为问题在于访问您的列,V 矩阵的元素,因为您说: “它应该看起来像:”

要真正写下这些约束,您只需要访问您在 cons 字典中定义的函数中的列。

假设你有你的数据 V

> array([[ 0.00749589,  0.01255155,  0.02396251,  0.04750988, 0.09495377]
>        [ 0.01255155,  0.02510441,  0.04794055,  0.09502834,  0.18996269],
>        [ 0.02396251,  0.04794055,  0.09631614,  0.19092151,  0.38165151],
>        [ 0.04750988,  0.09502834,  0.19092151,  0.38341252,  0.7664427 ],
>        [ 0.09495377,  0.18996269,  0.38165151,  0.7664427,   1.53713523]])

您应该按以下方式定义约束字典(例如):

> cons = ({'type': 'eq', 'fun': lambda x:  x[0] - 2 * x[1] + 2},  
> {'type': 'ineq', 'fun': lambda x: -x[0] - 2 * x[1] + 6},       
> {'type': 'ineq', 'fun': lambda x: -x[0] + 2 * x[1] + 2})

在 lambda 函数内部索引所需列时。