问题描述
我一直在听一门讲授投资组合优化的课程,在马科维茨优化器中,我注意到其中一个约束
def minimize_vol(target_return,er,cov):
"""
target_ret ---> W (weight vector)
"""
n = er.shape[0]
init_guess = np.repeat(1/n,n)
bounds = ((0.0,1.0),) * n
return_is_target = {
"type":"eq","args": (er,),"fun": lambda weights,er: target_return - portfolio_return(weights,er)
}
weights_sum_to_1 = {
"type": "eq","fun": lambda weights: np.sum(weights) - 1
}
results = minimize(portfolio_vol,init_guess,args=(cov,method="SLSQP",options={"disp":False},constraints=(return_is_target,weights_sum_to_1),bounds=bounds)
return results.x
第一个约束字典中的“args”究竟是做什么的?我无法清楚地了解文档。 对不起,如果这是一个愚蠢的问题,我对 python 这些库真的很陌生
解决方法
除了参数/权重之外,您还可以向目标函数以及定义约束的函数传递其他参数。
在
return_is_target = {
"type":"eq","args": (er,),"fun": lambda weights,er: target_return - portfolio_return(weights,er)
}
定义约束的函数是lambda weights,er)
。它需要一个额外的参数,即 er
。使用 args
键,您可以将此附加参数传递给该函数。
但是,在这种特殊情况下,您可以将函数定义中的 er
固定如下:
return_is_target = {
"type":"eq","fun": lambda weights: target_return - portfolio_return(weights,er)
}
现在 er
不再是约束的参数,因此不需要通过 args
传递。