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

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

如何解决使用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 举报,一经查实,本站将立刻删除。