使用gurobipy中的重新平衡问题建模投资组合优化

问题描述

我想通过Gurobi的Python API解决以下投资组合优化问题:

enter image description here

我已在以下代码中实现了该问题:

subassets = ptf_optimization.ptf.index
max_rebalancing = 0.50
max_number_rebalancing = 10
rebalancing_threshold = 0.02
J = np.array(Chosen_new.tolist())

# Define model and set parameters
m2 = gp.Model('eff_ret_portfolio')
m2.setParam("NonConvex",2)
m2.setParam("MIPGapAbs",5e-3)
m2.setParam("TimeLimit",100.0)

# Define variables
vars = pd.Series(m2.addVars(subassets),index=subassets)
vars_diff = pd.Series(m2.addVars(subassets,lb=(-1)*np.ones(len(subassets)),ub=2*np.ones(len(subassets))),index=subassets)
vars_abs = pd.Series(m2.addVars(subassets,lb=np.zeros(len(subassets)),index=subassets)
vars_ind = pd.Series(m2.addVars(subassets,vtype=GRB.BINARY),index=subassets)
m2.update()

# Set objective
m2.setobjective(vars.T.dot(BL_returns),GRB.MAXIMIZE)

## Set constraints
portfolio_variance = vars.T.dot(ptf_optimization.cov.dot(vars))
m2.addConstr(portfolio_variance == target_std**2)
m2.addConstr(vars.sum() == 1-cash,'budget')
m2.addConstrs((vars[j] == 0 for j in range(len(J)) if J[j] == True),name='c1')     #J defined in min vol optimization
m2.addConstrs((vars_diff[item] == vars[item]-w_start[item] for item in subassets),name='diff')
m2.addConstrs((vars_abs[item] == gp.abs_(vars_diff[item]) for item in subassets),name='abs')
for item in subassets:
    m2.addConstr((vars_ind[item]==1) >> (vars_abs[item] >= 1e-5))
    m2.addConstr((vars_ind[item]==0) >> (vars_abs[item] <= 1e-5))
m2.addConstr(quicksum(vars_ind) <= max_number_rebalancing,'max_number_rebalancing')
m2.addConstrs((vars_abs[item]*vars_ind[item] >= rebalancing_threshold for item in subassets),name='rebalancing_threshold')
m2.addConstr(quicksum(vars_abs) <= max_rebalancing,'max_rebalancing')

# Add absolute constraints
for item in subassets:
    l = ptf_optimization.absolute_constraints[item]['Min']
    u = ptf_optimization.absolute_constraints[item]['Max']
    m2.addConstr(l <= vars[item],f'constraint_abs_{item}_lower')
    m2.addConstr(vars[item] <= u,f'constraint_abs_{item}_upper')
# Add group constraints
for j,item in enumerate(ptf_optimization.group_constraints):
    constraint = ptf_optimization.group_constraints[item]
    l = constraint['Min']
    u = constraint['Max']
    vars_list = (vars[item] for item in constraint['Group'])
    m2.addConstr(l <= quicksum(vars_list),f'constraint_group_{j}_lower')
    m2.addConstr(quicksum(vars_list) <= u,f'constraint_group_{j}_upper')
m2.setParam('OutputFlag',1)    
m2.optimize()

但是,通过插入重新平衡必须高于某个阈值的约束,我获得了该问题变得不可行的方法。我计算了一个IIS并获得了以下.ilp文件

\ Model eff_ret_portfolio_copy 

\ LP format - for model browsing. Use MPS format to capture full model detail.
Maximize

Subject To 

max_number_rebalancing: C96 + C97 + C98 + C99 + C100 + C101 + C102 + C103
+ C104 + C105 + C106 + C107 + C108 + C109 + C110 + C111 + C112 + C113
+ C114 + C115 + C116 + C117 + C118 + C119 + C120 + C121 + C122 + C123
+ C124 + C125 + C126 + C127 <= 10
rebalancing_threshold[Obbligazionari_Governativi_Dollari]: [ C64 * C96 ]
>= 0.02
rebalancing_threshold[Obbligazionari_High_Yield_Euro]: [ C70 * C102 ]
>= 0.02
rebalancing_threshold[Obbligazionari_Emergenti_Hard_Currency]: [
C71 * C103 ] >= 0.02
rebalancing_threshold[Azionari_Euro]: [ C73 * C105 ] >= 0.02
rebalancing_threshold[Obbligazionari_Governativi_Breve_Termine_Europe_ex_Euro]:
[ C84 * C116 ] >= 0.02
rebalancing_threshold[Obbligazionari_Governativi_Breve_Termine_Yen]: [
C85 * C117 ] >= 0.02
rebalancing_threshold[Obbligazionari_Inflation_Linked_Dollari]: [
C87 * C119 ] >= 0.02
rebalancing_threshold[Obbligazionari_Corporate_Finanziari]: [ C89 * C121 ]
>= 0.02
rebalancing_threshold[Obbligazionari_Corporate_Dollari_Breve_Termine]: [
C91 * C123 ] >= 0.02
rebalancing_threshold[Obbligazionari_ABS]: [ C92 * C124 ] >= 0.02
rebalancing_threshold[Obbligazionari_Convertible_Euro]: [ C94 * C126 ]
>= 0.02
Bounds
C64 free
C70 free
C71 free
C73 free
C84 free
C85 free
C87 free
C89 free
C91 free
C92 free
C94 free
Binaries
C96 C97 C98 C99 C100 C101 C102 C103 C104 C105 C106 C107 C108 C109 C110
C111 C112 C113 C114 C115 C116 C117 C118 C119 C120 C121 C122 C123 C124 C125
C126 C127
End

能否请您告诉我我是否正确编码了模型以及不可行的根源在哪里?提前谢谢。

保罗

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)