Qlib Meta Controller 深度解析:用 Meta-Task、Meta-Dataset 与 Meta-Model 引导预测模型工作流
Qlib Meta Controller 深度解析用 Meta-Task、Meta-Dataset 与 Meta-Model 引导预测模型工作流【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib本文围绕 Qlib 的Meta Controller组件文档见 meta.rst展开先讲清 Meta-Task、Meta-Dataset、Meta-Model 三类抽象的职责边界与 API 契约再结合仓库中自带的 DDG-DA 完整实现剖析元信息生产 → 元模型训练 → 推理引导 → 改写基座任务的端到端调用链并给出运行基准样例所需的配置与命令帮助你理解如何基于 Meta Controller 自定义自己的元学习模型来适应市场动态变化。1. Meta Controller 的定位给预测模型导学Meta Controller的核心目标是学习一系列预测任务forecasting tasks之间的规律性模式并利用学到的模式去引导后续的预测任务。文档原文将其描述为provides guidance to Forecast Model。在 Qlib 的常规工作流中一个任务task由数据集dataset与模型model配置组成由 Trainer 串行训练。而Meta Controller在任务之上加了一层元层meta-level元模型不直接预测股票收益而是观察多个基座任务各自学得怎么样从中提炼出可迁移的知识再反过来影响基座预测模型的工作流。从源码结构看这一组件的抽象骨架位于qlib/model/meta/包包含三个文件抽象源码位置职责MetaTaskqlib/model/meta/task.py元学习框架的基本元素保存可喂给元模型的数据MetaTaskDatasetqlib/model/meta/dataset.py控制元信息meta-information的生成过程负责为元模型提供训练数据MetaModel及子类qlib/model/meta/model.py控制工作流用fit训练、用inference给出引导信息三者构成一条清晰的数据流MetaTaskDataset.prepare_tasks()产出若干MetaTask→ 元模型fit()消费这些元任务完成训练 → 元模型inference()输出引导信息如改写后的任务定义、样本权重等→ 引导信息被应用回基座预测模型。2. MetaTask元学习的基本数据单元文档指出一个Meta Task实例保存了可供Meta Model使用的数据多个Meta Task实例可以共享同一个Data Handler这一共享关系由Meta Dataset控制。从 qlib/model/meta/task.py 的源码看MetaTask的构造签名是MetaTask(task: dict, meta_info: object, mode: str PROC_MODE_FULL)task被元模型增强的 Qlib 任务定义dict 配置meta_info喂给元模型的原始输入信息初始化时会保存原始值后续再做处理mode数据处理模式源码定义了三种模式常量取值含义源码注释PROC_MODE_FULLfull训练用训练任务需要 X、y、X_test、y_test 齐全PROC_MODE_TESTtest测试用测试任务不需要完整的训练/测试对PROC_MODE_TRANSFERtransfer元模型可迁移到其他数据集时只需要 meta_info源码中还提供了两个关键方法get_dataset()通过init_instance_by_config(self.task[dataset])从任务配置中初始化出Dataset实例这就是多个 MetaTask 共享 Data Handler的实现入口——数据集配置相同即可复用get_meta_input()返回处理后的meta_info供元模型直接消费文档中提到的prepare_task_data()在现行源码中对应的就是这条取出可直接喂入元模型的数据的语义。3. MetaDataset元信息的生成器Meta Dataset负责元信息的生成流程为训练 Meta Model 提供数据。用户应通过prepare_tasks获取一组MetaTask实例。看 qlib/model/meta/dataset.py 中MetaTaskDataset的契约构造参数segmentsDict[Text, Tuple]或float指示数据如何切分初始化时元数据集就已维护好 meta-tasks 列表prepare_tasks(segments)传入单个 segment 名或 segment 列表返回对应的一批 meta-task多 segment 时返回嵌套列表[[tasks in seg1], ...]源码中内置了如下调用示例# get the train segment and the test segment, both of them are lists train_meta_tasks, test_meta_tasks meta_dataset.prepare_tasks([train, test])抽象方法_prepare_seg(segment)留给具体实现负责为单个 segment 准备好训练数据。值得注意的是源码类注释中明确写出的迁移性设计意图A meta-model trained on meta-dataset A and then applied to meta-dataset B——即在元数据集 A 上训练的元模型其输入特征应当能在元数据集 B 上复用因此实现_prepare_seg时必须保证 meta 输入的结构在数据集之间是可对齐的。仓库自带的完整实现是 qlib/contrib/meta/data_selection/dataset.py 中的MetaDatasetDS它把任务模板如何展开成滚动任务序列、每个任务的元输入如何计算全部落地task_tpl可以是单个任务模板 dict此时用RollingGen按step/trunc_days滚动生成任务序列也可以是已排好时间顺序的任务 list直接使用step滚动步长trunc_days基于测试起点截断的天数源码注释特别强调 trunc_days is very important用于屏蔽与未来信息重叠的数据exp_name元信息来源可以是实验名str自动用InternalData.setup()训练一批代理模型并统计其表现或已准备好的InternalData实例segmentsfloat 表示用于训练的 meta-task 比例str 则保证该日期落在测试集中hist_step_n元信息的历史步数数据相似性信息的回溯长度task_mode/fill_method分别控制元任务的数据处理模式对应MetaTask的三种模式与元信息缺失值的填充策略max、maxseg、zero。其中元输入的核心数据结构是MetaTaskDS.processed_meta_input包含time_perf形状hist_step_n * step, data pieces的时间表现矩阵刻画各数据段上历史代理模型的表现time_belongsample, data pieces的 0/1 归属矩阵标记每个训练样本属于哪个时间数据段见 MetaTaskDS 的 docstringFULL模式下还会附带X / y / X_test / y_test / test_idx即该基座任务的训练/测试特征标签数据。4. MetaModel三种引导基座工作流的方式文档将Meta Model的使用归纳为两步用fit训练元模型元模型实例通过inference给出有用信息来引导工作流。抽象基类 qlib/model/meta/model.py 只有两个抽象方法abc.abstractmethod def fit(self, *args, **kwargs): ... abc.abstractmethod def inference(self, *args, **kwargs) - object: ...基类注释进一步按干预基座学习流程的阶段把引导分成两类对应两个子类4.1 MetaTaskModel直接改写任务定义This type of meta-model may interact with task definitions directly... They guide the base tasks by modifying the base task definitions.MetaTaskModel约定了签名fit(meta_dataset)从 meta-dataset 取出准备好的 meta-task 并学习知识inference(meta_dataset) - List[dict]在推理时输出一批修改后的任务定义这些任务可以直接被 Qlib trainer 执行。也就是说这一类元模型的作用方式是任务级的——它把学到的知识物化成对基座任务的修改例如给样本加权、调整数据范围而不是在训练循环内部插入逻辑。DDG-DA 正是这一类。4.2 MetaGuideModel参与基座模型的训练过程This type of meta-model participates in the training process of the base forecasting model... guide the base forecasting models during their training to improve their performances.MetaGuideModel与MetaTaskModel同样继承MetaModel的fit/inference抽象但从源码结构看它的定位是让元模型在基座预测模型的训练期间持续互动例如在训练循环中提供正则项、损失调制等属于训练过程级的引导。用户实现自定义元模型时可按需选择继承哪一个子类。4.3 自定义元模型的实现要点综合以上契约实现一个自己的元模型大致是三步继承MetaTaskDataset实现_prepare_seg(segment)返回一批构造好的MetaTask(task, meta_info, mode)继承MetaModel或MetaTaskModel/MetaGuideModel实现fit与inference在滚动/在线工作流中把元模型的inference输出接回基座任务或基座训练循环。5. 完整示例DDG-DA 自适应市场动态文档给出 Qlib 内置的元模型实现DDG-DAData Distribution Generation for Predictable Concept Drift Adaptation它adapts to the market dynamics。文档描述的四个步骤与源码 qlib/contrib/rolling/ddgda.py 中DDGDA.run()的调用一一对应文档步骤源码方法产出1. 计算 meta-information 并封装为MetaTask实例所有 meta-task 组成MetaDatasetDS_dump_data_for_proxy_model()、_dump_meta_ipt()、MetaDatasetDS.__init__文件handler_proxy.pkl、internal_data_s{step}.pklmlflow 实验data_sim_s{step}2. 基于元数据集的训练数据训练 DDG-DA_train_meta_model()mlflow 实验DDG-DA中保存的MetaModelDS3. 对 DDG-DA 做推理得到 guide informationget_task_list()中meta_model.inference(mds)文件tasks_s{step}.pkl每个任务被加上了reweighter4. 将 guide information 应用到预测模型继承自Rolling的super().run()训练滚动预测模型并汇总预测几个值得注意的实现细节代理模型proxy model机制DDG-DA 先用一个简化代理模型默认 LightGBM 计算特征重要性、按sim_task_model选择 linear/gbdt 统计相似性在历史数据上滚动训练再用InternalData.setup()把每个代理模型在不同日期上的日频 Spearman 相关性IC表现整理成data_ic_df这就是 meta-information 的原始形态见 qlib/contrib/meta/data_selection/dataset.py。_prepare_meta_ipt()随后用mask_overlap()掩掉与自身训练期重叠含 horizon 泄漏窗口的列防止信息穿越。元模型本体MetaModelDSqlib/contrib/meta/data_selection/model.py内部是PredNetnet.py——一个时间权重网络 加权岭回归闭式解的组合TimeWeightMeta从time_perf序列预测每个数据段的时间权重preds_to_weight_with_clamp用tanh/clamp/sigmoid方式裁剪权重损失函数ICLossutils.py对每个交易日计算预测与标签的相关性并取负 IC 均值loss_skip_thresh参数用于跳过样本数过少的交易日。引导的落地形式MetaModelDS._prepare_task()对每个基座任务浅拷贝后挂上一个TimeReweighter即改写任务定义具体体现为按时间分布对训练样本加权。这与MetaTaskModel.inference返回List[dict]的契约完全吻合。知识迁移get_task_list()中训练侧与推理侧的MetaDatasetDS参数step、trunc_days、hist_step_n、fill_method刻意保持一致推理侧则设置segments0.0与task_modeMetaTask.PROC_MODE_TRANSFER正好呼应了第 2 节中元模型可迁移到其他数据集只需要 meta_info的设计。运行 DDG-DA 基准入口脚本是 examples/benchmarks_dynamic/DDG-DA/workflow.py它定义DDGDABench(DDGDA)默认使用 baseline/workflow_config_linear_Alpha158.yamlLinear 基座效率优先也支持 LightGBM 配置。按 examples/benchmarks_dynamic/DDG-DA/README.md 的说明运行命令为python workflow.py run # 换用 LightGBM 基座模型 python workflow.py --conf_path../baseline/workflow_config_lightgbm_Alpha158.yaml run运行前提与限制需要先准备 Qlib 数据脚本中在未设置PROVIDER_URI时会通过GetData().qlib_data(exists_skipTrue)自动下载设置PROVIDER_URI环境变量可指向已有数据硬件最低要求约 45G 内存、4G 磁盘CPU 版 PyTorch 即可基类的Rolling初始化参数conf_path、horizon20、step20、train_start、test_end等见 qlib/contrib/rolling/base.py与 DDG-DA 特有参数sim_task_model、alpha、loss_skip_thresh、fea_imp_n30、segments0.62、hist_step_n30、meta_data_procV01等见 DDGDA 构造器均可通过fire命令行覆盖注意源码中的提示由于 mlflow 实验难以彻底删除同名实验会移入 .trash 导致创建失败运行示例前建议清理旧结果删除mlruns目录。6. 小结与延伸阅读回到文档的主线Meta Controller用三个最小抽象把元层与基座层解耦——MetaTask定义一个元任务长什么样FULL/TEST/TRANSFER 三态MetaTaskDataset定义如何批量生产元任务prepare_tasks_prepare_segMetaModel定义元模型如何被训练与如何使用fit/inference并在MetaTaskModel改任务定义与MetaGuideModel介入训练过程之间给出两条落地路径。仓库中 DDG-DA 的 qlib/contrib/meta/ 与 qlib/contrib/rolling/ddgda.py 提供了从元信息构造、元模型训练到任务级加权的完整参考实现是自定义元模型时最值得对照阅读的代码路径配套的滚动基类 qlib/contrib/rolling/base.py 则说明了RollingGen/task_generator这一层在 Meta 模块与滚动重训之间共享的基础设施。【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考