Use add_constraint

This commit is contained in:
phschiele
2021-05-19 00:04:01 +02:00
parent e0370d4dbe
commit 6d6df0897b
4 changed files with 25 additions and 34 deletions

View File

@@ -221,8 +221,8 @@ class BaseConvexOptimizer(BaseOptimizer):
self._lower_bounds = np.nan_to_num(lower, nan=-1)
self._upper_bounds = np.nan_to_num(upper, nan=1)
self.add_constraint(lambda x: x >= self._lower_bounds)
self.add_constraint(lambda x: x <= self._upper_bounds)
self.add_constraint(lambda w: w >= self._lower_bounds)
self.add_constraint(lambda w: w <= self._upper_bounds)
def is_parameter_defined(self, parameter_name: str) -> bool:
is_defined = False
@@ -354,10 +354,10 @@ class BaseConvexOptimizer(BaseOptimizer):
)
for sector in sector_upper:
is_sector = [sector_mapper[t] == sector for t in self.tickers]
self.add_constraint(lambda x: cp.sum(x[is_sector]) <= sector_upper[sector])
self.add_constraint(lambda w: cp.sum(w[is_sector]) <= sector_upper[sector])
for sector in sector_lower:
is_sector = [sector_mapper[t] == sector for t in self.tickers]
self.add_constraint(lambda x: cp.sum(x[is_sector]) >= sector_lower[sector])
self.add_constraint(lambda w: cp.sum(w[is_sector]) >= sector_lower[sector])
def convex_objective(self, custom_objective, weights_sum_to_one=True, **kwargs):
"""
@@ -387,7 +387,7 @@ class BaseConvexOptimizer(BaseOptimizer):
self._objective += obj
if weights_sum_to_one:
self.add_constraint(lambda x: cp.sum(x) == 1)
self.add_constraint(lambda w: cp.sum(w) == 1)
return self._solve_cvxpy_opt_problem()
@@ -451,7 +451,7 @@ class BaseConvexOptimizer(BaseOptimizer):
# Construct constraints
final_constraints = []
if weights_sum_to_one:
final_constraints.append({"type": "eq", "fun": lambda x: np.sum(x) - 1})
final_constraints.append({"type": "eq", "fun": lambda w: np.sum(w) - 1})
if constraints is not None:
final_constraints += constraints

View File

@@ -126,10 +126,8 @@ class EfficientCVaR(EfficientFrontier):
for obj in self._additional_objectives:
self._objective += obj
self._constraints += [
self._u >= 0.0,
self.returns.values @ self._w + self._alpha + self._u >= 0.0,
]
self.add_constraint(lambda _: self._u >= 0.0)
self.add_constraint(lambda w: self.returns.values @ w + self._alpha + self._u >= 0.0)
self._make_weight_sum_constraint(market_neutral)
return self._solve_cvxpy_opt_problem()
@@ -159,14 +157,12 @@ class EfficientCVaR(EfficientFrontier):
for obj in self._additional_objectives:
self._objective += obj
self._constraints += [
self._u >= 0.0,
self.returns.values @ self._w + self._alpha + self._u >= 0.0,
]
self.add_constraint(lambda _: self._u >= 0.0)
self.add_constraint(lambda w: self.returns.values @ w + self._alpha + self._u >= 0.0)
ret = self.expected_returns.T @ self._w
target_return_par = cp.Parameter(name='target_return', value=target_return)
self._constraints.append(ret >= target_return_par)
self.add_constraint(lambda _: ret >= target_return_par)
self._make_weight_sum_constraint(market_neutral)
return self._solve_cvxpy_opt_problem()
@@ -199,11 +195,10 @@ class EfficientCVaR(EfficientFrontier):
self._u
)
target_cvar_par = cp.Parameter(value=target_cvar, name='target_cvar', nonneg=True)
self._constraints += [
cvar <= target_cvar_par,
self._u >= 0.0,
self.returns.values @ self._w + self._alpha + self._u >= 0.0,
]
self.add_constraint(lambda _: cvar <= target_cvar_par)
self.add_constraint(lambda _: self._u >= 0.0)
self.add_constraint(lambda w: self.returns.values @ w + self._alpha + self._u >= 0.0)
self._make_weight_sum_constraint(market_neutral)
return self._solve_cvxpy_opt_problem()

View File

@@ -175,9 +175,9 @@ class EfficientFrontier(base_optimizer.BaseConvexOptimizer):
del self._constraints[0]
del self._constraints[0]
self.add_constraint(lambda x: cp.sum(x) == 0)
self.add_constraint(lambda w: cp.sum(w) == 0)
else:
self.add_constraint(lambda x: cp.sum(x) == 1)
self.add_constraint(lambda w: cp.sum(w) == 1)
def min_volatility(self):
"""
@@ -192,7 +192,7 @@ class EfficientFrontier(base_optimizer.BaseConvexOptimizer):
for obj in self._additional_objectives:
self._objective += obj
self.add_constraint(lambda x: cp.sum(x) == 1)
self.add_constraint(lambda w: cp.sum(w) == 1)
return self._solve_cvxpy_opt_problem()
def _max_return(self, return_value=True):
@@ -206,7 +206,7 @@ class EfficientFrontier(base_optimizer.BaseConvexOptimizer):
self._w, self.expected_returns
)
self.add_constraint(lambda x: cp.sum(x) == 1)
self.add_constraint(lambda w: cp.sum(w) == 1)
res = self._solve_cvxpy_opt_problem()

View File

@@ -125,7 +125,7 @@ class EfficientSemivariance(EfficientFrontier):
self._objective += obj
B = (self.returns.values - self.benchmark) / np.sqrt(self._T)
self._constraints.append(B @ self._w - p + n == 0)
self.add_constraint(lambda w: B @ w - p + n == 0)
self._make_weight_sum_constraint(market_neutral)
return self._solve_cvxpy_opt_problem()
@@ -160,7 +160,7 @@ class EfficientSemivariance(EfficientFrontier):
self._objective += obj
B = (self.returns.values - self.benchmark) / np.sqrt(self._T)
self._constraints.append(B @ self._w - p + n == 0)
self.add_constraint(lambda w: B @ w - p + n == 0)
self._make_weight_sum_constraint(market_neutral)
return self._solve_cvxpy_opt_problem()
@@ -192,11 +192,9 @@ class EfficientSemivariance(EfficientFrontier):
n = cp.Variable(self._T, nonneg=True)
target_semivariance = cp.Parameter(value=target_semideviation**2, name='target_semivariance', nonneg=True)
self._constraints.append(
self.frequency * cp.sum(cp.square(n)) <= target_semivariance
)
self.add_constraint(lambda _: self.frequency * cp.sum(cp.square(n)) <= target_semivariance)
B = (self.returns.values - self.benchmark) / np.sqrt(self._T)
self._constraints.append(B @ self._w - p + n == 0)
self.add_constraint(lambda w: B @ w - p + n == 0)
self._make_weight_sum_constraint(market_neutral)
return self._solve_cvxpy_opt_problem()
@@ -233,11 +231,9 @@ class EfficientSemivariance(EfficientFrontier):
self._objective += obj
target_return_par = cp.Parameter(name='target_return', value=target_return)
self._constraints.append(
cp.sum(self._w @ self.expected_returns) >= target_return_par
)
self.add_constraint(lambda w: cp.sum(w @ self.expected_returns) >= target_return_par)
B = (self.returns.values - self.benchmark) / np.sqrt(self._T)
self._constraints.append(B @ self._w - p + n == 0)
self.add_constraint(lambda w: B @ w - p + n == 0)
self._make_weight_sum_constraint(market_neutral)
return self._solve_cvxpy_opt_problem()