diff --git a/.gitignore b/.gitignore index 0af365d7b..5b3745a02 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ __pycache__/ *.pyc +*.pyd *.so *.ipynb .ipynb_checkpoints diff --git a/README.md b/README.md index 735e080a0..d3f8170bc 100644 --- a/README.md +++ b/README.md @@ -312,6 +312,7 @@ Qlib data are stored in a compact format, which is efficient to be combined into # Related Reports +- [Guide To Qlib: Microsoft’s AI Investment Platform](https://analyticsindiamag.com/qlib/) - [【华泰金工林晓明团队】微软AI量化投资平台Qlib体验——华泰人工智能系列之四十](https://mp.weixin.qq.com/s/Brcd7im4NibJOJzZfMn6tQ) - [微软也搞AI量化平台?还是开源的!](https://mp.weixin.qq.com/s/47bP5YwxfTp2uTHjUBzJQQ) - [微矿Qlib:业内首个AI量化投资开源平台](https://mp.weixin.qq.com/s/vsJv7lsgjEi-ALYUz4CvtQ) diff --git a/examples/workflow_by_code.py b/examples/workflow_by_code.py index b8cf3f935..ea9c70083 100644 --- a/examples/workflow_by_code.py +++ b/examples/workflow_by_code.py @@ -106,6 +106,11 @@ if __name__ == "__main__": model = init_instance_by_config(task["model"]) dataset = init_instance_by_config(task["dataset"]) + # NOTE: This line is optional + # It demonstrates that the dataset can be used standalone. + example_df = dataset.prepare("train") + print(example_df.head()) + # start exp with R.start(experiment_name="workflow"): R.log_params(**flatten_dict(task)) diff --git a/qlib/data/data.py b/qlib/data/data.py index 020cc1c3e..cfb6db1dc 100644 --- a/qlib/data/data.py +++ b/qlib/data/data.py @@ -221,7 +221,11 @@ class InstrumentProvider(abc.ABC): _df_list = [] # FIXME: each process will read these files for _path in Path(C.get_data_path()).joinpath("instruments").glob("*.txt"): - _df = pd.read_csv(_path, sep="\t", names=["inst", "start_datetime", "end_datetime", "save_inst"]) + _df = pd.read_csv( + _path, + sep="\t", + names=["inst", "start_datetime", "end_datetime", "save_inst"], + ) _df_list.append(_df.iloc[:, [0, -1]]) df = pd.concat(_df_list, sort=False).sort_values("save_inst") df = df.drop_duplicates(subset=["save_inst"], keep="first").fillna(axis=1, method="ffill") @@ -587,7 +591,11 @@ class LocalInstrumentProvider(InstrumentProvider): if not os.path.exists(fname): raise ValueError("instruments not exists for market " + market) _instruments = dict() - df = pd.read_csv(fname, sep="\t", names=["inst", "start_datetime", "end_datetime", "save_inst"]) + df = pd.read_csv( + fname, + sep="\t", + names=["inst", "start_datetime", "end_datetime", "save_inst"], + ) df["start_datetime"] = pd.to_datetime(df["start_datetime"]) df["end_datetime"] = pd.to_datetime(df["end_datetime"]) for row in df.itertuples(index=False): @@ -1034,12 +1042,31 @@ class ClientProvider(BaseProvider): DatasetD.set_conn(self.client) -Cal = Wrapper() -Inst = Wrapper() -FeatureD = Wrapper() -ExpressionD = Wrapper() -DatasetD = Wrapper() -D = Wrapper() +import sys + +if sys.version_info >= (3, 9): + from typing import Annotated + + CalendarProviderWrapper = Annotated[CalendarProvider, Wrapper] + InstrumentProviderWrapper = Annotated[InstrumentProvider, Wrapper] + FeatureProviderWrapper = Annotated[FeatureProvider, Wrapper] + ExpressionProviderWrapper = Annotated[ExpressionProvider, Wrapper] + DatasetProviderWrapper = Annotated[DatasetProvider, Wrapper] + BaseProviderWrapper = Annotated[BaseProvider, Wrapper] +else: + CalendarProviderWrapper = CalendarProvider + InstrumentProviderWrapper = InstrumentProvider + FeatureProviderWrapper = FeatureProvider + ExpressionProviderWrapper = ExpressionProvider + DatasetProviderWrapper = DatasetProvider + BaseProviderWrapper = BaseProvider + +Cal: CalendarProviderWrapper = Wrapper() +Inst: InstrumentProviderWrapper = Wrapper() +FeatureD: FeatureProviderWrapper = Wrapper() +ExpressionD: ExpressionProviderWrapper = Wrapper() +DatasetD: DatasetProviderWrapper = Wrapper() +D: BaseProviderWrapper = Wrapper() def register_all_wrappers(C): diff --git a/qlib/workflow/__init__.py b/qlib/workflow/__init__.py index e65bfb03f..15faa0da1 100644 --- a/qlib/workflow/__init__.py +++ b/qlib/workflow/__init__.py @@ -461,5 +461,14 @@ class QlibRecorder: self.get_exp().get_recorder().set_tags(**kwargs) +import sys + +if sys.version_info >= (3, 9): + from typing import Annotated + + QlibRecorderWrapper = Annotated[QlibRecorder, Wrapper] +else: + QlibRecorderWrapper = QlibRecorder + # global record -R = Wrapper() +R: QlibRecorderWrapper = Wrapper()