【教程】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"]
  • 该代码定义了多个数据处理器类,如 Alpha360Alpha158,它们通过继承 DataHandlerLP 类来实现。
  • 使用了数据加载器(如 Alpha158DLAlpha360DL)来配置特征和标签的加载过程。
  • 提供了用于特征工程的默认数据处理器,并使用 check_transform_proc 函数对这些处理器进行转换和检查。
  • 这些类支持通过不同的标签(如 closeVWAP)来创建不同的因子数据处理器(如 Alpha360vwapAlpha158vwap)。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿雄不会写代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值