运用scipy计算投资组合的最佳权重,出现 'Iteration limit reached'错误

import numpy as np
import  scipy.optimize as sco
P=np.array([590.01,5.29,26.67,6.50])
#输入四个股票的股价
R=np.array([0.349032,0.155143,0.132796,0.055905])
#输入四个股票的年华收益率
b=np.array([1.64,1.41,1.21,1.06])
#输入四个股票的beta值
def f(w):
    w=np.array(w)
    return -np.sum(R*w)
#投资组合收益率表达式
cons=({'type':'eq','fun':lambda w:-np.sum(w)-1},{'type':'ineq','fun':lambda w:1.4-np.sum(w*b)})
#输入两个约束条件,权重总和为1,整体组合的beta值不超过1.4
bnds=((0,1),(0,1),(0,1),(0,1))
#通过元组的方式生成边界条件
result=sco.minimize(f,[0.25,0.25,0.25,0.25],method='SLSQP',bounds=bnds,constraints=cons)
#基本形式 sco.minimize(fun,x0,method,bounds,constraints)
#print(result['x'].round(3))
print(result)

代码如上,结果如下:

     fun: -1.3464795410850456e-17
     jac: array([-0.349032, -0.155143, -0.132796, -0.055905])
 message: 'Iteration limit reached'
    nfev: 1448
     nit: 100
    njev: 100
  status: 9
 success: False
       x: array([4.53834454e-18, 7.26695090e-17, 4.36019116e-18, 4.93450600e-19])

Process finished with exit code 0

新手上路,按照书上写的,请问各位大佬哪里有问题?

是约束条件有问题,不等式约束1.4-np.sum(w*b)>=0,这使得整体组合的beta值不超过1.4,是对的,但是等式约束条件应该是np.sum(w)-1而不应该是-np.sum(w)-1,代码中两个约束条件不兼容,因此得不到正确结果。改成lambda w: np.sum(w)-1后优化成功,运行结果:

fun: -0.22804894822767985
     jac: array([-0.349032, -0.155143, -0.132796, -0.055905])
 message: 'Optimization terminated successfully.'
    nfev: 24
     nit: 4
    njev: 4
  status: 0
 success: True
       x: array([5.11920517e-01, 2.22044605e-16, 2.87240675e-01, 2.00838808e-01])

 

迭代次数不够,对于sco.minimize方法来说,有一个参数options,可以设置迭代次数,options为字典格式,格式为:options={'maxiter': 1000, 'disp': False},这里设置迭代1000次。

不过设置了迭代次数之后,可能会有新的问题,可以换其他method尝试一下,例如BFGS, L-BFGS-B等

 

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632