mirror of
https://github.com/microsoft/qlib.git
synced 2026-06-06 05:51:17 +08:00
* update python version * fix: Correct selector handling and add time filtering in storage.py * fix: convert index and columns to list in repr methods * feat: Add Makefile for managing project prerequisites * feat: Add Cython extensions for rolling and expanding operations * resolve install error * fix lint error * fix lint error * fix lint error * fix lint error * fix lint error * update build package * update makefile * update ci yaml * fix docs build error * fix ubuntu install error * fix docs build error * fix install error * fix install error * fix install error * fix install error * fix pylint error * fix pylint error * fix pylint error * fix pylint error * fix pylint error E1123 * fix pylint error R0917 * fix pytest error * fix pytest error * fix pytest error * update code * update code * fix ci error * fix pylint error * fix black error * fix pytest error * fix CI error * fix CI error * add python version to CI * add python version to CI * add python version to CI * fix pylint error * fix pytest general nn error * fix CI error * optimize code * add coments * Extended macos version * remove build package --------- Co-authored-by: Young <afe.young@gmail.com>
158 lines
5.0 KiB
Python
158 lines
5.0 KiB
Python
# Copyright (c) Microsoft Corporation.
|
|
# Licensed under the MIT License.
|
|
|
|
from qlib.contrib.data.loader import Alpha158DL, Alpha360DL
|
|
from ...data.dataset.handler import DataHandlerLP
|
|
from ...data.dataset.processor import Processor
|
|
from ...utils import get_callable_kwargs
|
|
from ...data.dataset import processor as processor_module
|
|
from inspect import getfullargspec
|
|
|
|
|
|
def check_transform_proc(proc_l, fit_start_time, fit_end_time):
|
|
new_l = []
|
|
for p in proc_l:
|
|
if not isinstance(p, Processor):
|
|
klass, pkwargs = get_callable_kwargs(p, processor_module)
|
|
args = getfullargspec(klass).args
|
|
if "fit_start_time" in args and "fit_end_time" in args:
|
|
assert (
|
|
fit_start_time is not None and fit_end_time is not None
|
|
), "Make sure `fit_start_time` and `fit_end_time` are not None."
|
|
pkwargs.update(
|
|
{
|
|
"fit_start_time": fit_start_time,
|
|
"fit_end_time": fit_end_time,
|
|
}
|
|
)
|
|
proc_config = {"class": klass.__name__, "kwargs": pkwargs}
|
|
if isinstance(p, dict) and "module_path" in p:
|
|
proc_config["module_path"] = p["module_path"]
|
|
new_l.append(proc_config)
|
|
else:
|
|
new_l.append(p)
|
|
return new_l
|
|
|
|
|
|
_DEFAULT_LEARN_PROCESSORS = [
|
|
{"class": "DropnaLabel"},
|
|
{"class": "CSZScoreNorm", "kwargs": {"fields_group": "label"}},
|
|
]
|
|
_DEFAULT_INFER_PROCESSORS = [
|
|
{"class": "ProcessInf", "kwargs": {}},
|
|
{"class": "ZScoreNorm", "kwargs": {}},
|
|
{"class": "Fillna", "kwargs": {}},
|
|
]
|
|
|
|
|
|
class Alpha360(DataHandlerLP):
|
|
def __init__(
|
|
self,
|
|
instruments="csi500",
|
|
start_time=None,
|
|
end_time=None,
|
|
freq="day",
|
|
infer_processors=_DEFAULT_INFER_PROCESSORS,
|
|
learn_processors=_DEFAULT_LEARN_PROCESSORS,
|
|
fit_start_time=None,
|
|
fit_end_time=None,
|
|
filter_pipe=None,
|
|
inst_processors=None,
|
|
**kwargs,
|
|
):
|
|
infer_processors = check_transform_proc(infer_processors, fit_start_time, fit_end_time)
|
|
learn_processors = check_transform_proc(learn_processors, fit_start_time, fit_end_time)
|
|
|
|
data_loader = {
|
|
"class": "QlibDataLoader",
|
|
"kwargs": {
|
|
"config": {
|
|
"feature": Alpha360DL.get_feature_config(),
|
|
"label": kwargs.pop("label", self.get_label_config()),
|
|
},
|
|
"filter_pipe": filter_pipe,
|
|
"freq": freq,
|
|
"inst_processors": inst_processors,
|
|
},
|
|
}
|
|
|
|
super().__init__(
|
|
instruments=instruments,
|
|
start_time=start_time,
|
|
end_time=end_time,
|
|
data_loader=data_loader,
|
|
learn_processors=learn_processors,
|
|
infer_processors=infer_processors,
|
|
**kwargs,
|
|
)
|
|
|
|
def get_label_config(self):
|
|
return ["Ref($close, -2)/Ref($close, -1) - 1"], ["LABEL0"]
|
|
|
|
|
|
class Alpha360vwap(Alpha360):
|
|
def get_label_config(self):
|
|
return ["Ref($vwap, -2)/Ref($vwap, -1) - 1"], ["LABEL0"]
|
|
|
|
|
|
class Alpha158(DataHandlerLP):
|
|
def __init__(
|
|
self,
|
|
instruments="csi500",
|
|
start_time=None,
|
|
end_time=None,
|
|
freq="day",
|
|
infer_processors=[],
|
|
learn_processors=_DEFAULT_LEARN_PROCESSORS,
|
|
fit_start_time=None,
|
|
fit_end_time=None,
|
|
process_type=DataHandlerLP.PTYPE_A,
|
|
filter_pipe=None,
|
|
inst_processors=None,
|
|
**kwargs,
|
|
):
|
|
infer_processors = check_transform_proc(infer_processors, fit_start_time, fit_end_time)
|
|
learn_processors = check_transform_proc(learn_processors, fit_start_time, fit_end_time)
|
|
|
|
data_loader = {
|
|
"class": "QlibDataLoader",
|
|
"kwargs": {
|
|
"config": {
|
|
"feature": self.get_feature_config(),
|
|
"label": kwargs.pop("label", self.get_label_config()),
|
|
},
|
|
"filter_pipe": filter_pipe,
|
|
"freq": freq,
|
|
"inst_processors": inst_processors,
|
|
},
|
|
}
|
|
super().__init__(
|
|
instruments=instruments,
|
|
start_time=start_time,
|
|
end_time=end_time,
|
|
data_loader=data_loader,
|
|
infer_processors=infer_processors,
|
|
learn_processors=learn_processors,
|
|
process_type=process_type,
|
|
**kwargs,
|
|
)
|
|
|
|
def get_feature_config(self):
|
|
conf = {
|
|
"kbar": {},
|
|
"price": {
|
|
"windows": [0],
|
|
"feature": ["OPEN", "HIGH", "LOW", "VWAP"],
|
|
},
|
|
"rolling": {},
|
|
}
|
|
return Alpha158DL.get_feature_config(conf)
|
|
|
|
def get_label_config(self):
|
|
return ["Ref($close, -2)/Ref($close, -1) - 1"], ["LABEL0"]
|
|
|
|
|
|
class Alpha158vwap(Alpha158):
|
|
def get_label_config(self):
|
|
return ["Ref($vwap, -2)/Ref($vwap, -1) - 1"], ["LABEL0"]
|