1
0
mirror of https://github.com/microsoft/qlib.git synced 2026-07-16 01:06:56 +08:00

Merge remote-tracking branch 'microsoft/main' into online_srv

This commit is contained in:
lzh222333
2021-05-06 02:24:16 +00:00
5 changed files with 59 additions and 11 deletions

View File

@@ -182,6 +182,11 @@ The `trade unit` defines the unit number of stocks can be used in a trade, and t
qlib.init(provider_uri='~/.qlib/qlib_data/us_data', region=REG_US) qlib.init(provider_uri='~/.qlib/qlib_data/us_data', region=REG_US)
.. note::
PRs for new data source are highly welcome! Users could commit the code to crawl data as a PR like `the examples here <https://github.com/microsoft/qlib/tree/main/scripts>`_. And then we will use the code to create data cache on our server which other users could use directly.
Data API Data API
======================== ========================

View File

@@ -15,9 +15,10 @@ from .config import C
class MetaLogger(type): class MetaLogger(type):
def __new__(cls, name, bases, dict): def __new__(cls, name, bases, dict):
wrapper_dict = logging.Logger.__dict__.copy() wrapper_dict = logging.Logger.__dict__.copy()
wrapper_dict.update(dict) for key in wrapper_dict:
wrapper_dict["__doc__"] = logging.Logger.__doc__ if key not in dict and key != "__reduce__":
return type.__new__(cls, name, bases, wrapper_dict) dict[key] = wrapper_dict[key]
return type.__new__(cls, name, bases, dict)
class QlibLogger(metaclass=MetaLogger): class QlibLogger(metaclass=MetaLogger):
@@ -39,6 +40,9 @@ class QlibLogger(metaclass=MetaLogger):
self.level = level self.level = level
def __getattr__(self, name): def __getattr__(self, name):
# During unpickling, python will call __getattr__. Use this line to avoid maximum recursion error.
if name in {"__setstate__"}:
raise AttributeError
return self.logger.__getattribute__(name) return self.logger.__getattribute__(name)

View File

@@ -23,7 +23,10 @@ class QlibRecorder:
@contextmanager @contextmanager
def start( def start(
self, self,
*,
experiment_id: Optional[Text] = None,
experiment_name: Optional[Text] = None, experiment_name: Optional[Text] = None,
recorder_id: Optional[Text] = None,
recorder_name: Optional[Text] = None, recorder_name: Optional[Text] = None,
uri: Optional[Text] = None, uri: Optional[Text] = None,
resume: bool = False, resume: bool = False,
@@ -45,8 +48,12 @@ class QlibRecorder:
Parameters Parameters
---------- ----------
experiment_id : str
id of the experiment one wants to start.
experiment_name : str experiment_name : str
name of the experiment one wants to start. name of the experiment one wants to start.
recorder_id : str
id of the recorder under the experiment one wants to start.
recorder_name : str recorder_name : str
name of the recorder under the experiment one wants to start. name of the recorder under the experiment one wants to start.
uri : str uri : str
@@ -57,7 +64,14 @@ class QlibRecorder:
resume : bool resume : bool
whether to resume the specific recorder with given name under the given experiment. whether to resume the specific recorder with given name under the given experiment.
""" """
run = self.start_exp(experiment_name, recorder_name, uri, resume) run = self.start_exp(
experiment_id=experiment_id,
experiment_name=experiment_name,
recorder_id=recorder_id,
recorder_name=recorder_name,
uri=uri,
resume=resume,
)
try: try:
yield run yield run
except Exception as e: except Exception as e:
@@ -65,7 +79,9 @@ class QlibRecorder:
raise e raise e
self.end_exp(Recorder.STATUS_FI) self.end_exp(Recorder.STATUS_FI)
def start_exp(self, experiment_name=None, recorder_name=None, uri=None, resume=False): def start_exp(
self, *, experiment_id=None, experiment_name=None, recorder_id=None, recorder_name=None, uri=None, resume=False
):
""" """
Lower level method for starting an experiment. When use this method, one should end the experiment manually Lower level method for starting an experiment. When use this method, one should end the experiment manually
and the status of the recorder may not be handled properly. Here is the example code: and the status of the recorder may not be handled properly. Here is the example code:
@@ -79,8 +95,12 @@ class QlibRecorder:
Parameters Parameters
---------- ----------
experiment_id : str
id of the experiment one wants to start.
experiment_name : str experiment_name : str
the name of the experiment to be started the name of the experiment to be started
recorder_id : str
id of the recorder under the experiment one wants to start.
recorder_name : str recorder_name : str
name of the recorder under the experiment one wants to start. name of the recorder under the experiment one wants to start.
uri : str uri : str
@@ -93,7 +113,14 @@ class QlibRecorder:
------- -------
An experiment instance being started. An experiment instance being started.
""" """
return self.exp_manager.start_exp(experiment_name, recorder_name, uri, resume) return self.exp_manager.start_exp(
experiment_id=experiment_id,
experiment_name=experiment_name,
recorder_id=recorder_id,
recorder_name=recorder_name,
uri=uri,
resume=resume,
)
def end_exp(self, recorder_status=Recorder.STATUS_FI): def end_exp(self, recorder_status=Recorder.STATUS_FI):
""" """

View File

@@ -39,12 +39,14 @@ class Experiment:
output["recorders"] = list(recorders.keys()) output["recorders"] = list(recorders.keys())
return output return output
def start(self, recorder_name=None, resume=False): def start(self, *, recorder_id=None, recorder_name=None, resume=False):
""" """
Start the experiment and set it to be active. This method will also start a new recorder. Start the experiment and set it to be active. This method will also start a new recorder.
Parameters Parameters
---------- ----------
recorder_id : str
the id of the recorder to be created.
recorder_name : str recorder_name : str
the name of the recorder to be created. the name of the recorder to be created.
resume : bool resume : bool
@@ -238,14 +240,14 @@ class MLflowExperiment(Experiment):
def __repr__(self): def __repr__(self):
return "{name}(id={id}, info={info})".format(name=self.__class__.__name__, id=self.id, info=self.info) return "{name}(id={id}, info={info})".format(name=self.__class__.__name__, id=self.id, info=self.info)
def start(self, recorder_name=None, resume=False): def start(self, *, recorder_id=None, recorder_name=None, resume=False):
logger.info(f"Experiment {self.id} starts running ...") logger.info(f"Experiment {self.id} starts running ...")
# Get or create recorder # Get or create recorder
if recorder_name is None: if recorder_name is None:
recorder_name = self._default_rec_name recorder_name = self._default_rec_name
# resume the recorder # resume the recorder
if resume: if resume:
recorder, _ = self._get_or_create_rec(recorder_name=recorder_name) recorder, _ = self._get_or_create_rec(recorder_id=recorder_id, recorder_name=recorder_name)
# create a new recorder # create a new recorder
else: else:
recorder = self.create_recorder(recorder_name) recorder = self.create_recorder(recorder_name)

View File

@@ -33,7 +33,10 @@ class ExpManager:
def start_exp( def start_exp(
self, self,
*,
experiment_id: Optional[Text] = None,
experiment_name: Optional[Text] = None, experiment_name: Optional[Text] = None,
recorder_id: Optional[Text] = None,
recorder_name: Optional[Text] = None, recorder_name: Optional[Text] = None,
uri: Optional[Text] = None, uri: Optional[Text] = None,
resume: bool = False, resume: bool = False,
@@ -45,8 +48,12 @@ class ExpManager:
Parameters Parameters
---------- ----------
experiment_id : str
id of the active experiment.
experiment_name : str experiment_name : str
name of the active experiment. name of the active experiment.
recorder_id : str
id of the recorder to be started.
recorder_name : str recorder_name : str
name of the recorder to be started. name of the recorder to be started.
uri : str uri : str
@@ -298,7 +305,10 @@ class MLflowExpManager(ExpManager):
def start_exp( def start_exp(
self, self,
*,
experiment_id: Optional[Text] = None,
experiment_name: Optional[Text] = None, experiment_name: Optional[Text] = None,
recorder_id: Optional[Text] = None,
recorder_name: Optional[Text] = None, recorder_name: Optional[Text] = None,
uri: Optional[Text] = None, uri: Optional[Text] = None,
resume: bool = False, resume: bool = False,
@@ -308,11 +318,11 @@ class MLflowExpManager(ExpManager):
# Create experiment # Create experiment
if experiment_name is None: if experiment_name is None:
experiment_name = self._default_exp_name experiment_name = self._default_exp_name
experiment, _ = self._get_or_create_exp(experiment_name=experiment_name) experiment, _ = self._get_or_create_exp(experiment_id=experiment_id, experiment_name=experiment_name)
# Set up active experiment # Set up active experiment
self.active_experiment = experiment self.active_experiment = experiment
# Start the experiment # Start the experiment
self.active_experiment.start(recorder_name, resume) self.active_experiment.start(recorder_id=recorder_id, recorder_name=recorder_name, resume=resume)
return self.active_experiment return self.active_experiment