Python 试图用#gekko最大化这个简单的非线性问题,但是得到了这个错误

Python 试图用#gekko最大化这个简单的非线性问题,但是得到了这个错误,python,optimization,gekko,Python,Optimization,Gekko,(@错误:未找到解决方案) positions=[“AAPL”、“NVDA”、“MS”、“CI”、“HON”] cov=df_ret.cov() ret=df_ret.mean()值 权重=np.数组(np.随机.随机(len(位置))) def最大化(重量): 标准=np.sqrt(np.dot(重量T,cov,重量)) p_ret=np.点(ret.T,重量) 夏普=p_-ret/std 返回夏普 a=壁虎() w1=a.Var(值=0.2,磅=0,磅=1) w2=a.Var(值=0.2,磅

(@错误:未找到解决方案)

positions=[“AAPL”、“NVDA”、“MS”、“CI”、“HON”]
cov=df_ret.cov()
ret=df_ret.mean()值
权重=np.数组(np.随机.随机(len(位置)))
def最大化(重量):
标准=np.sqrt(np.dot(重量T,cov,重量))
p_ret=np.点(ret.T,重量)
夏普=p_-ret/std
返回夏普
a=壁虎()
w1=a.Var(值=0.2,磅=0,磅=1)
w2=a.Var(值=0.2,磅=0,磅=1)
w3=a.Var(值=0.2,磅=0,磅=1)
w4=a.Var(值=0.2,磅=0,磅=1)
w5=a.Var(值=0.2,磅=0,磅=1)

a、 方程式(w1+w2+w3+w4+w5我不熟悉
GEKKO
,因此我无法真正帮助使用该软件包,但如果有人不回答如何使用
GEKKO
,这里有一个使用
scipy.optimize.minimize
的潜在解决方案:

from scipy.optimize import minimize
import numpy as np
import pandas as pd



def OF(weights, cov, ret, sign = 1.0):
  std = np.sqrt(np.dot(np.dot(weights.T,cov),weights))
  p_ret = np.dot(ret.T,weights)
  sharpe = p_ret/std
  return sign*sharpe


if __name__ == '__main__':

  x0 = np.array([0.2,0.2,0.2,0.2,0.2])
  df_ret = pd.DataFrame(np.array([[.001729, .014603, .036558, .016772, .001983],
[-0.015906, .006396, .012796, -.002163, 0],
[-0.001849, -.019598, .014484, .036856, .019292],
[.006648, .002161, -.020352, -.007580, 0.022083],
[-.008821, -.014016, -.006512, -.015802, .012583]]))
  cov = df_ret.cov()
  ret = df_ret.mean().values


  minx0 = np.repeat(0, [len(x0)] , axis = 0)
  maxx0 = np.repeat(1, [len(x0)] , axis = 0)
  bounds = tuple(zip(minx0, maxx0))

  cons = {'type':'ineq', 
  'fun':lambda weights: 1 - sum(weights)}
  res_cons = minimize(OF, x0, (cov, ret, -1), bounds = bounds, constraints=cons, method='SLSQP')



  print(res_cons)
  print('Current value of objective function: ' + str(res_cons['fun']))
  print('Current value of controls:')
  print(res_cons['x'])
哪些产出:

     fun: -2.1048843911794486
     jac: array([ 5.17067784e+00, -2.36839056e-04, -6.24716282e-04,  6.56819057e+00,
        2.45392323e-04])
 message: 'Optimization terminated successfully.'
    nfev: 69
     nit: 9
    njev: 9
  status: 0
 success: True
       x: array([5.47832097e-14, 1.52927443e-01, 1.87864415e-01, 5.32258098e-14,
       6.26433468e-01])
Current value of objective function: -2.1048843911794486
Current value of controls:
[5.47832097e-14 1.52927443e-01 1.87864415e-01 5.32258098e-14
 6.26433468e-01]

在此处添加符号参数是因为为了最大化目标函数,您只需最小化*(-1)。我将默认值设置为1(最小化),但我在args中传递-1来更改它。

这里是gekko的解决方案:

从gekko导入gekko
将numpy作为np导入
作为pd进口熊猫
a=壁虎()
职位=[“AAPL”、“NVDA”、“MS”、“CI”、“HON”]
df_ret=pd.DataFrame(np.array([[001729、.014603、.036558、.016772、.001983]),
[-0.015906, .006396, .012796, -.002163, 0],
[-0.001849, -.019598, .014484, .036856, .019292],
[.006648, .002161, -.020352, -.007580, 0.022083],
[-.008821, -.014016, -.006512, -.015802, .012583]]))
cov=df_ret.cov()值
ret=df_ret.mean()值
def obj(重量):
标准=a.sqrt(np.dot(重量T,cov,重量))
p_ret=np.点(ret.T,重量)
夏普=p_-ret/std
返回夏普
a=壁虎()
w=a.Array(a.Var,len(位置),值=0.2,lb=1e-5,ub=1)

a、 方程式(a.和(w)考虑重新设定你的问题,更确切地说你有什么问题需要理解,以便我们能更好地帮助你。你需要使用Geko或者你能使用SICPY吗?同样,你能发布什么<代码> DFYRET 看起来吗?我加了DFYRET。我试图把我的头围在Geko上,因为我需要移动到一个复杂的和动态的。问题,而且scipy对非线性不太管用。不过我可能错了。希望有人能回答如何使用Gekko实现它。不过,感谢这一点,它对我的
scipy
解决方案起到了作用,它使用
[round(x,8)for x in res_cons['x']]
给出的权重为
[0.0,0.15292744,0.18786442,0.0.0,0.62334647]
与此几乎相同,因此这应该是正确的答案,因为这是
gekko
表格op要求的-投票结果!谢谢。感谢。
     fun: -2.1048843911794486
     jac: array([ 5.17067784e+00, -2.36839056e-04, -6.24716282e-04,  6.56819057e+00,
        2.45392323e-04])
 message: 'Optimization terminated successfully.'
    nfev: 69
     nit: 9
    njev: 9
  status: 0
 success: True
       x: array([5.47832097e-14, 1.52927443e-01, 1.87864415e-01, 5.32258098e-14,
       6.26433468e-01])
Current value of objective function: -2.1048843911794486
Current value of controls:
[5.47832097e-14 1.52927443e-01 1.87864415e-01 5.32258098e-14
 6.26433468e-01]
[[1e-05] [0.15810629919] [0.19423029287] [1e-05] [0.6476428726]]