mirror of
https://github.com/robertmartin8/PyPortfolioOpt.git
synced 2022-11-27 18:02:41 +03:00
Use add_constraint
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user