【教程】2024.09.03 Qlib数据加载器以及数据集加载器 Alpha158 Aplha360详细的讲解,以及源码
前言
也不说那么多了,要用到qlib,肯定也知道他是干嘛的,不懂得去看文档,给博主点点关注点点赞!!!这样博主才能更新更多免费的教程,不然就直接丢付费专栏里了
# 导入必要的模块和类
from qlib.contrib.data.loader import Alpha158DL, Alpha360DL # 导入Qlib提供的Alpha158和Alpha360数据加载器
from ...data.dataset.handler import DataHandlerLP # 导入DataHandlerLP基类
from ...data.dataset.processor import Processor # 导入Processor基类
from ...utils import get_callable_kwargs # 导入获取可调用对象的工具函数
from ...data.dataset import processor as processor_module # 导入processor模块
from inspect import getfullargspec # 导入获取函数参数的库
# 函数:检查并转换数据处理器
def check_transform_proc(proc_l, fit_start_time, fit_end_time):
"""
将处理器配置转换为符合标准的配置,确保如果处理器需要fit_start_time和fit_end_time参数,这些参数不为None。
参数:
- proc_l: 处理器配置列表。
- fit_start_time: 训练开始时间。
- fit_end_time: 训练结束时间。
返回:
- new_l: 新的处理器配置列表。
"""
new_l = []
for p in proc_l:
if not isinstance(p, Processor): # 如果不是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: # 如果有module_path,则添加到配置中
proc_config["module_path"] = p["module_path"]
new_l.append(proc_config)
else:
new_l.append(p) # 如果已经是Processor实例,则直接添加
return new_l
# 默认的数据处理器配置列表
_DEFAULT_LEARN_PROCESSORS = [
{"class": "DropnaLabel"}, # 去掉标签中的NaN值
{"class": "CSZScoreNorm", "kwargs": {"fields_group": "label"}}, # 对标签进行CS标准化处理
]
_DEFAULT_INFER_PROCESSORS = [
{"class": "ProcessInf", "kwargs": {}}, # 处理无穷值
{"class": "ZScoreNorm", "kwargs": {}}, # 标准化处理
{"class": "Fillna", "kwargs": {}}, # 填充NaN值
]
# 类:Alpha360,继承自DataHandlerLP
class Alpha360(DataHandlerLP):
"""
Alpha360数据处理器,使用Qlib数据加载器加载数据,并执行预处理、特征工程和标签生成。
"""
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"]
# 类:Alpha360vwap,继承自Alpha360
class Alpha360vwap(Alpha360):
"""
使用VWAP(加权平均价格)作为标签的Alpha360数据处理器。
"""
def get_label_config(self):
return ["Ref($vwap, -2)/Ref($vwap, -1) - 1"], ["LABEL0"]
# 类:Alpha158,继承自DataHandlerLP
class Alpha158(DataHandlerLP):
"""
Alpha158数据处理器,使用Qlib数据加载器加载数据,并执行预处理、特征工程和标签生成。
"""
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"]
# 类:Alpha158vwap,继承自Alpha158
class Alpha158vwap(Alpha158):
"""
使用VWAP(加权平均价格)作为标签的Alpha158数据处理器。
"""
def get_label_config(self):
return ["Ref($vwap, -2)/Ref($vwap, -1) - 1"], ["LABEL0"]
- 该代码定义了多个数据处理器类,如
Alpha360
和Alpha158
,它们通过继承DataHandlerLP
类来实现。 - 使用了数据加载器(如
Alpha158DL
和Alpha360DL
)来配置特征和标签的加载过程。 - 提供了用于特征工程的默认数据处理器,并使用
check_transform_proc
函数对这些处理器进行转换和检查。 - 这些类支持通过不同的标签(如
close
或VWAP
)来创建不同的因子数据处理器(如Alpha360vwap
和Alpha158vwap
)。