mirror of
https://github.com/microsoft/qlib.git
synced 2026-07-16 01:06:56 +08:00
This commit is contained in:
@@ -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:
|
||||||
|
|||||||
@@ -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))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user