我有一个(Portfolio Optimization)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)
在此程序中,权重分配给所有资产。我想要一种选择的方式(例如,最好的10个分配给20个)
答案 0 :(得分:0)
一种选择是迭代解决此问题(多次运行scipy
求解器):
第一次迭代:运行scipy
求解器,求解,并丢弃所有n
变量,这些变量的系数都低于某个(最初很小)的阈值t
。
下一次迭代:再次运行scipy
求解器,现在不再在以前丢弃的变量的空间中搜索。随着t
的(slighlty)增加值,现在丢弃其他变量。
重复此操作,直到只剩下m
个变量。
还有一些更复杂的方法,例如基因编程技术来识别相关参数甚至功能形式(在后一种情况下称为稀疏符号回归,请参见此处的python
实现:https://github.com/snagcliffs/PDE-FIND。