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:
@@ -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
|
||||||
========================
|
========================
|
||||||
|
|
||||||
|
|||||||
10
qlib/log.py
10
qlib/log.py
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user