Tengo la siguiente función en Python. Mi objetivo es deshacer los retornos esperados asociados con ciertos pesos de cartera dados una serie de suposiciones.
A partir de esto quiero generar los retornos esperados que obtendría con una cartera que tiene una serie de restricciones. Mi expectativa es que debería obtener el mismo resultado de una función que no está restringida y esta, siempre y cuando los pesos dados a ambas funciones estén dentro de las mismas restricciones y todos los otros inputs sean los mismos. Pero hasta ahora ese no es el caso. ¿Alguien puede iluminarme sobre dónde estoy yendo mal?
Función con restricciones (no funciona del todo bien):
def reverse_optimze_expected_return(weights, asset_covariance, weight_limits, risk_aversion):
n_assets = len(weights)
expected_return = cp.Variable(n_assets)
objective = cp.Minimize(cp.quad_form(weights, asset_covariance))
constraints = [
cp.sum(weights) == 1,
cp.quad_form(weights, asset_covariance) <= risk_aversion,
]
for i in range(n_assets):
constraints.append(weights[i] >= weight_limits[i][0] / 100)
constraints.append(weights[i] <= weight_limits[i][1] / 100)
problem = cp.Problem(objective, constraints)
problem.solve()
optimize_expected_returns = expected_return.value
return optimize_expected_returns
Aquí está la función sin restricciones:
def get_expected_return(weight, asset_covariance, risk_aversion):
w = weight
S = asset_covariance
L = risk_aversion
return L * S @ w
Los pesos son los siguientes [0.55, 0.45, 0.0]
La covarianza de los activos es esta matriz
La aversión al riesgo es 3.1880326818259768
Y los límites de peso son [(42.5, 67.5), (32.5, 57.5), (0, 25)]