当前位置: 首页 > article >正文

【教程】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)。

http://www.kler.cn/news/288394.html

相关文章:

  • JAVAEE初阶第二节——多线程基础(上)
  • golang关于slice map函数传参的小问题
  • 娱乐小项目-树莓派履带小车
  • 中兴-ZSRV2路由器-任意文件读取
  • arcgisjs4.0 内网部署字体不显示问题处理
  • 【技术详解】Java泛型:全面解析与实战应用(进阶版)
  • sqli-labs靶场通关攻略(六十一关到六十五关)
  • ARM/Linux嵌入式面经(三十):腾讯 C++开发工程师
  • 【Linux学习】Linux开发工具——vim
  • html+css+js网页设计 博物馆 亚历山大美术馆6个页面
  • Flask中的g的作用
  • Linux学习笔记(4)----Debian压力测试方法
  • 日本IT编程语言对比分析-Python /Ruby /C++ /Java
  • 【加密社】马后炮视角来看以太坊二层战略
  • LLM大模型:不要怪大模型回答质量不行了,那是你不会问~
  • 计算机视觉之 SE 注意力模块
  • 微信小程序接入客服功能
  • 逆向工程核心原理 Chapter23 | DLL注入
  • 【舍入,取整,取小数,取余数丨Excel 函数】
  • 探索四川财谷通信息技术有限公司抖音小店的独特魅力
  • 收银系统源码-收银台UI自定义
  • 51单片机-第九节-AT24C02存储器(I2C总线)
  • 代码随想录算法训练营第35天 | 416.分割等和子集
  • PLUTO: 推动基于模仿学习的自动驾驶规划的极限
  • AI智能电销机器人的优势是什么,有什么特点?
  • Python群发邮件:如何实现Python邮件群发?
  • 浅谈sizeof() 函数在Arduino中的使用
  • 代码随想录算法训练营_day35
  • ARM 异常处理(21)
  • dfs算法复习