1
0
mirror of https://github.com/microsoft/qlib.git synced 2026-07-16 01:06:56 +08:00
Charles Young
2021-03-08 19:07:28 +08:00
parent 2f9af1af8f
commit 7022675d00
2 changed files with 31 additions and 34 deletions

View File

@@ -21,15 +21,15 @@ class EnhancedIndexingOptimizer(BaseOptimizer):
START_FROM_BENCH = "benchmark" START_FROM_BENCH = "benchmark"
def __init__( def __init__(
self, self,
lamb: float = 10, lamb: float = 10,
delta: float = 0.4, delta: float = 0.4,
bench_dev: float = 0.01, bench_dev: float = 0.01,
inds_dev: float = None, inds_dev: float = None,
scale_alpha: bool = True, scale_alpha: bool = True,
verbose: bool = False, verbose: bool = False,
warm_start: str = None, warm_start: str = None,
max_iters: int = 10000, max_iters: int = 10000,
): ):
""" """
Args: Args:
@@ -56,11 +56,7 @@ class EnhancedIndexingOptimizer(BaseOptimizer):
assert inds_dev is None or inds_dev >= 0, "industry deviation limit `inds_dev` should be positive or None." assert inds_dev is None or inds_dev >= 0, "industry deviation limit `inds_dev` should be positive or None."
self.inds_dev = inds_dev self.inds_dev = inds_dev
assert warm_start in [ assert warm_start in [None, self.START_FROM_W0, self.START_FROM_BENCH,], "illegal warm start option"
None,
self.START_FROM_W0,
self.START_FROM_BENCH,
], "illegal warm start option"
self.start_from_w0 = warm_start == self.START_FROM_W0 self.start_from_w0 = warm_start == self.START_FROM_W0
self.start_from_bench = warm_start == self.START_FROM_BENCH self.start_from_bench = warm_start == self.START_FROM_BENCH
@@ -69,14 +65,14 @@ class EnhancedIndexingOptimizer(BaseOptimizer):
self.max_iters = max_iters self.max_iters = max_iters
def __call__( def __call__(
self, self,
u: Union[np.ndarray, pd.Series], u: Union[np.ndarray, pd.Series],
F: np.ndarray, F: np.ndarray,
covB: np.ndarray, covB: np.ndarray,
varU: np.ndarray, varU: np.ndarray,
w0: np.ndarray, w0: np.ndarray,
w_bench: np.ndarray, w_bench: np.ndarray,
inds_onehot: np.ndarray = None, inds_onehot: np.ndarray = None,
) -> Union[np.ndarray, pd.Series]: ) -> Union[np.ndarray, pd.Series]:
""" """
Args: Args:

View File

@@ -30,13 +30,13 @@ class PortfolioOptimizer(BaseOptimizer):
OPT_INV = "inv" OPT_INV = "inv"
def __init__( def __init__(
self, self,
method: str = "inv", method: str = "inv",
lamb: float = 0, lamb: float = 0,
delta: float = 0, delta: float = 0,
alpha: float = 0.0, alpha: float = 0.0,
scale_alpha: bool = True, scale_alpha: bool = True,
tol: float = 1e-8, tol: float = 1e-8,
): ):
""" """
Args: Args:
@@ -63,10 +63,10 @@ class PortfolioOptimizer(BaseOptimizer):
self.scale_alpha = scale_alpha self.scale_alpha = scale_alpha
def __call__( def __call__(
self, self,
S: Union[np.ndarray, pd.DataFrame], S: Union[np.ndarray, pd.DataFrame],
u: Optional[Union[np.ndarray, pd.Series]] = None, u: Optional[Union[np.ndarray, pd.Series]] = None,
w0: Optional[Union[np.ndarray, pd.Series]] = None, w0: Optional[Union[np.ndarray, pd.Series]] = None,
) -> Union[np.ndarray, pd.Series]: ) -> Union[np.ndarray, pd.Series]:
""" """
Args: Args:
@@ -155,7 +155,7 @@ class PortfolioOptimizer(BaseOptimizer):
return self._solve(len(S), self._get_objective_gmv(S), *self._get_constrains(w0)) return self._solve(len(S), self._get_objective_gmv(S), *self._get_constrains(w0))
def _optimize_mvo( def _optimize_mvo(
self, S: np.ndarray, u: Optional[np.ndarray] = None, w0: Optional[np.ndarray] = None self, S: np.ndarray, u: Optional[np.ndarray] = None, w0: Optional[np.ndarray] = None
) -> np.ndarray: ) -> np.ndarray:
"""optimize mean-variance portfolio """optimize mean-variance portfolio
@@ -251,6 +251,7 @@ class PortfolioOptimizer(BaseOptimizer):
# add l2 regularization # add l2 regularization
wrapped_obj = obj wrapped_obj = obj
if self.alpha > 0: if self.alpha > 0:
def opt_obj(x): def opt_obj(x):
return obj(x) + self.alpha * np.sum(np.square(x)) return obj(x) + self.alpha * np.sum(np.square(x))