首页 > 解决方案 > 有没有办法优化 n 个变量中的 m 个?

问题描述

我有一个(投资组合优化)python 程序,它使用 scipy 使用约束来优化 n 个变量。但是,我想知道是否可以告诉程序从这 n 个变量中选择 m 来最大化目标?

这是我当前的代码:

def obj(x):
    return (-np.sum(array_weights.t*x))
def con_vol(x):
    return np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights))

其中 array_returns 是从 Bloomberg 导入的所有股票的回报列表,cov_matrix 是使用回报数据构建的协方差矩阵。

cons = [{'type':'eq','fun':lambda x: np.sum(x)-1}, {'type':'ineq','fun':lambda x: con_vol}\

bnds = tuple(0.02, 0.1) for x in range(20)

opts = sco.minimize(obj, list_final_weights, bounds = bnds, method = 'SLQSP', constraints = cons)

在这个程序中,权重分配给所有资产。我想要一种可以选择的方式(比如 20 个中最好的 10 个)

标签: pythonscipy

解决方案


一种选择是迭代地解决这个问题(scipy多次运行求解器):

第一次迭代:运行scipy求解器,获取解决方案,并丢弃所有n系数低于某个(最初相当小)阈值的变量t

下一次迭代:scipy再次运行求解器,现在不再在先前丢弃的变量的空间内搜索。随着 的(轻微)增加值t,现在丢弃更多变量。

重复此操作,直到只剩下m变量。

还有更复杂的方法涉及例如遗传编程技术来识别相关参数甚至函数形式(在后一种情况下所谓的稀疏符号回归,请参见python此处的实现:https ://github.com/snagcliffs/PDE-FIND .


推荐阅读