微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scipy 最小化函数约束声明问题

如何解决Scipy 最小化函数约束声明问题

我在使用 scipy 的最小化功能时肯定有困难。 这里的目标是绘制一条曲线,反映给定回报值可能的最小波动率。

我怀疑未按预期声明的约束集。事实上,“约束”通过以下注释突出显示

'预期类型'Optional[dict]',得到'tuple[dict[str,Union[str,dict[str,(w: Any) -> Union[int,Any]]]]],(w: Any) -> Union[Union[ndarray[unsignedinteger],ndarray[signedinteger],ndarray[floating],ndarray[complexfloating],ndarray[timedelta64],ndarray[datetime64]],Any]]]]' 代替'

def get_ret_vol_sr(w):
w = np.array(w)
log_ret = np.log(stocks/stocks.shift(1))
ret = np.sum(log_ret.mean() * 252 * w)
vol = np.sqrt(np.dot(w,np.dot(log_ret.cov() * 252,w.reshape(4,1))))
sr = ret/vol
return np.array([ret,vol,sr])
def constraint1(w):
return np.sum(w) - 1

def objective_function1(w):
return get_ret_vol_sr(w)[2] * (-1)
cons_1 = {'type': 'eq','fun': constraint1}
bounds = ((0,1),(0,1))
init_guess = np.array([0.25,0.25,0.25])
result1 = minimize(objective_function1,init_guess,method='SLSQP',bounds=bounds,`constraints=cons_1)`
def objective_function_2(w):
return get_ret_vol_sr(w)[1]


segment_ret = np.linspace(0,1.3,100)
min_vol_list = []

for possible_return in segment_ret:
    cons = {'type': 'eq','fun': cons_1},{'type': 'eq','fun': lambda w: get_ret_vol_sr(w)[0] - possible_return}
init_guess = np.array([0.25,0.25])
bounds = ((0,1))

min_vol = minimize(objective_function_2,constraints=cons)

min_vol_list.append(min_vol['fun'])

谢谢您的建议,

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。