コード例 #1
0
ファイル: relaxer.py プロジェクト: sn0wfree/QuantOPT
    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
コード例 #2
0
ファイル: test_main_func.py プロジェクト: sn0wfree/QuantOPT
 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)
コード例 #3
0
ファイル: test_main_func.py プロジェクト: sn0wfree/QuantOPT
 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)
コード例 #4
0
ファイル: test_main_func.py プロジェクト: sn0wfree/QuantOPT
 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)
コード例 #5
0
ファイル: relaxer.py プロジェクト: sn0wfree/QuantOPT
    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
コード例 #6
0
ファイル: test_main_func.py プロジェクト: sn0wfree/QuantOPT
 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)
コード例 #7
0
ファイル: test_main_func.py プロジェクト: sn0wfree/QuantOPT
 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)
コード例 #8
0
ファイル: test_main_func.py プロジェクト: sn0wfree/QuantOPT
 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)
コード例 #9
0
ファイル: relaxer.py プロジェクト: sn0wfree/QuantOPT
    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