【发布时间】:2019-09-22 08:30:49
【问题描述】:
我正在尝试最小化一个基本上看起来像这样的函数:
实际上它有两个自变量,但由于 x1 + x2 = 1,它们并不是真正独立的。
现在是目标函数
def calculatePVar(w,covM):
w = np.matrix(w)
return (w*covM*w.T) [0,0]
wnere w 是每个资产的权重列表,covM 是 pandas 的 .cov() 返回的协方差矩阵
这里是调用优化函数的地方:
w0 = []
for sec in portList:
w0.append(1/len(portList))
bnds = tuple((0,1) for x in w0)
cons = ({'type': 'eq', 'fun': lambda x: np.sum(x)-1.0})
res= minimize(calculatePVar, w0, args=nCov, method='SLSQP',constraints=cons, bounds=bnds)
weights = res.x
现在函数有一个明确的最小值,但最小化只会吐出初始值作为结果,它确实说“优化成功终止”。有什么建议吗?
优化结果:
附:图片作为链接,因为我不符合要求!
【问题讨论】:
-
您可能想尝试不同的方法,例如
‘Nelder-Mead’。此外,您需要明确,您的变量是什么?它们是权重w_i还是x_i。此外,您还需要区分 * 乘法和点乘法,并确保哪一种能满足您的需求。 -
我很难找到其他接受约束的方法,我相信我得到了 Nelder-Mead 的错误。关于变量,权重(calculatePVar 函数中的 w0 和 w)是我的变量。至于乘法,我不确定有什么区别?发生的是矩阵乘法,但 * 正在解决问题(数学正在检查)
-
你能提供
portList和nCov的例子吗? -
portList 只是一个字符串列表,但这里有一个例子:
portList = ['ABEV3', 'BBDC4'],这里是 dfCov(必须先转换为 numpy 矩阵):covariance matrix
标签: python scipy scipy-optimize