def __init__(self, method: str = None, check: bool = False, **kwargs): """ :param method: :param check: :param kwargs: """ # self.model_holder = model_holder if check: getattr(opt3, method) self.method = method self.kwargs_data = kwargs # add custom constraints if 'constr_cls' in kwargs.keys(): if isinstance(kwargs['constr_cls'], str) and os.path.exists( kwargs['constr_cls']): self.custom_constr_cls = create_constraints_holder( kwargs['constr_cls']) elif isinstance(kwargs['constr_cls'], MetaConstraints) or issubclass( kwargs['constr_cls'], MetaConstraints): self.custom_constr_cls = kwargs['constr_cls'] else: raise ValueError( 'constr_cls got wrong type! only accept constr_cls.yaml or constraints class' ) else: self.custom_constr_cls = None
def test_main_entry_no_instance_test_constr_cls_create_instance(self): from QuantOPT.conf.conf import setting_yaml_path from QuantOPT.constraints.constraints import create_constraints_holder constr_cls = create_constraints_holder(setting_yaml_path) result = RunOpt.run_opt_single(self.kwargs_data, [], self.method, constr_cls=constr_cls) self.assertEqual(result.success, True)
def test_main_entry_instance_test_constr_cls_create_instance(self): from QuantOPT.conf.conf import setting_yaml_path from QuantOPT.constraints.constraints import create_constraints_holder constr_cls = create_constraints_holder(setting_yaml_path) constraint_param_list = [] Ro = RunOpt(method=self.method, constr_cls=constr_cls, **self.kwargs_data) result = Ro.run_opt(constraint_param_list, slack=False) self.assertEqual(result.success, True)
def test_main_entry_no_instance_test_constr_cls_create_instance(self): kwargs_data = {'stockpool': stock_pool, 'sigma2': cov_price} constraint_param_list = [] from QuantOPT.conf.conf import setting_yaml_path from QuantOPT.constraints.constraints import create_constraints_holder constr_cls = create_constraints_holder(setting_yaml_path) result = RunOpt.run_opt_single(kwargs_data, constraint_param_list, self.method, constr_cls=constr_cls) self.assertEqual(result.success, True)
def run_opt_single(cls, kwargs_data: dict, constraint_param_list: list, method: str, step_length: float = 0.01, bounds=None, default_lower: float = 0, default_upper: float = 1, constr_cls=Constraints, if_exists: str = 'update', **kwargs): """ run optimization :param kwargs_data: :param constraint_param_list: :param method: :param step_length: :param bounds: :param default_lower: :param default_upper: :param constr_cls: :return: """ if isinstance(constr_cls, str) and os.path.exists(constr_cls): constr_cls = create_constraints_holder(constr_cls) for k, v in kwargs.items(): if k in kwargs_data.keys(): if if_exists == 'update': kwargs_data[k] = v elif if_exists == 'ignore': pass else: raise ValueError('kwargs conflict!') else: kwargs_data[k] = v # parse constraint parameters to constraint objects len_pool = len(kwargs_data['stockpool']) bounds = _SimpleOpt.create_bounds(len_pool, bounds, default_lower, default_upper) constraints = list( cls.param2constraints(constraint_param_list, step_length=step_length, constr_cls=constr_cls)) # run optimization res = getattr(opt3, method).run_opt(bounds=bounds, constraints=constraints, **kwargs_data) return res
def test_main_entry_instance_test_constr_cls_create_instance(self): from QuantOPT.conf.conf import setting_yaml_path from QuantOPT.constraints.constraints import create_constraints_holder constr_cls = create_constraints_holder(setting_yaml_path) constraint_param_list = [] Ro = RunOpt(method=self.method, stockpool=stock_pool, sigma2=cov_price, lambda_r=2, portfolio_returns=return_matrix, constr_cls=constr_cls) result = Ro.run_opt(constraint_param_list, slack=False) self.assertEqual(result.success, True)
def test_instance_constraint_slack_test_constr_cls_create_instance(self): from QuantOPT.conf.conf import setting_yaml_path from QuantOPT.constraints.constraints import create_constraints_holder constr_cls = create_constraints_holder(setting_yaml_path) constraint_param_list = [('general_count_lower_rc', { 'bound_value': 10.02 }, 1, 'ineq')] Ro = RunOpt(method=self.method, stockpool=stock_pool, sigma2=cov_price, constr_cls=constr_cls) result = Ro.run_opt(constraint_param_list, slack=True) self.assertEqual(result.success, True)
def test_instance_constraint_slack_test_constr_cls2_create_instance_test_step_length( self): from QuantOPT.conf.conf import setting_yaml_path from QuantOPT.constraints.constraints import create_constraints_holder constr_cls = create_constraints_holder(setting_yaml_path) # add the count of weight value which is greater than 0 should be 5 or more constraints! constraint_param_list = [('general_count_lower_rc', { 'bound_value': 10.5 }, 1, 'ineq')] Ro = RunOpt(method=self.method, stockpool=stock_pool, sigma2=cov_price) result = Ro.run_opt(constraint_param_list, slack=True, step_length=0.1, constr_cls=constr_cls) self.assertEqual(result.success, True)
def run_opt_slack(cls, kwargs_data, constraint_param_list: list, method: str, step_length: float = 0.01, default_lower: float = 0, default_upper: float = 1, max_try_count: int = 10, bounds=None, constr_cls=Constraints, show_constraints: bool = False, if_exists: str = 'update', **kwargs): """ run_opt_slack, run optimization with slack 给定优化参数方法,使用opt3模块中的对应的优化方法进行优化,如果不成功,则使用slack方法进行优化,直到达到指定的最大尝试次数或者最大优先等级 :param if_exists: :param kwargs_data: :param constraint_param_list: :param method: :param step_length: :param default_lower: :param default_upper: :param max_try_count: :param bounds: :param constr_cls: :param show_constraints: :return: """ global __current_priority__ # __first_time__ = True __current_priority__ = 1 _funcs, _kwargs, priorities, _constraint_types = zip( *constraint_param_list) max_priority = max(priorities) active_slack = max_priority != 0 if isinstance(constr_cls, str) and os.path.exists(constr_cls): constr_cls = create_constraints_holder(constr_cls) res = cls.run_opt_single(kwargs_data, constraint_param_list, method, step_length=step_length, bounds=bounds, default_lower=default_lower, default_upper=default_upper, constr_cls=constr_cls, if_exists=if_exists, **kwargs) cls.switch_first_time() if active_slack: count = 0 while not res.success and count < max_try_count: # cls.increase_max_try_count() res = cls.run_opt_single(kwargs_data, constraint_param_list, method, step_length=step_length, bounds=bounds, default_lower=default_lower, default_upper=default_upper, constr_cls=constr_cls, if_exists=if_exists, **kwargs) if count >= max_try_count: warnings.warn( 'max try count reached! will improve priority level') count = 0 if cls.get_current_priority() > max_priority: warnings.warn( 'max priority reach! will end automatically!') break else: cls.increase_priority_level() else: count += 1 if show_constraints: return res, constraint_param_list else: return res else: return res