Estoy tratando de resolver una cartera con el máximo ratio de sharpe en el espacio de la renta fija. Para ello, utilizo CVXPY en python. Utilizo lo siguiente Papel como referencia.
Este es mi "montaje":
## SET UP PROBLEM
C = np.asmatrix(new_cov)
mu = np.asmatrix(s['E(r) after FXh']/100)
mu0 = np.asmatrix(cleared_swaps.iloc[z]['CHF1']/100)
## INITIATE WEIGHT VARIABLE
y = cp.Variable(len(framework))
# DEFINE CONSTRAINTS AND MODIFY FOR QUADRATIC PROBLEM
A_mod = A - b.T
## CREATE CONSTRAINTS
constraints = [(mu-mu0)@y==1,
0 <= y,
A_mod@y.T >= 0]
## FORM OBJECTIVE
obj = cp.Minimize(cp.quad_form(y,C))
## FORM AND SOLVE PROBLEM
prob = cp.Problem(obj, constraints)
try:
prob.solve()
w = y.value/sum(y.value)
w[w<=0] = 0
w = w/sum(w)*1
except:
print('Exception. Using Market weights')
w = np.repeat(df_mkt_val_pct.iloc[z][live_currencies.index.tolist()].values,2)/2
w = w/sum(w)*1
Donde A contiene básicamente la duración de la subcartera (por ejemplo, diferentes duraciones del EUR):
y b mantiene los límites del DV01:
Ahora bien, cuando ejecuto este script las carteras que obtengo están "inversamente optimizadas", lo que significa que estoy constantemente por debajo del índice. Si entonces invierto el peso óptimo (por ejemplo, añado la infraponderación de una divisa al peso de la BM para terminar con una sobreponderación) entonces los rendimientos son los esperados.
Pero este comportamiento es extraño en mi opinión. ¿Hay alguna forma de "invertir" la optimización para obtener los valores optimizados y poder utilizarlos sin tener que "invertirlos"?