.. _recorder: ==================================== Qlib 记录器:实验管理 ==================================== .. currentmodule:: qlib 简介 ============ ``Qlib`` 包含一个名为 ``QlibRecorder`` 的实验管理系统,旨在帮助用户高效地处理实验和分析结果。 该系统包含三个组件: - `ExperimentManager` 管理实验的类。 - `Experiment` 实验类,每个实例负责单个实验。 - `Recorder` 记录器类,每个实例负责单个运行记录。 以下是系统结构的概览: .. code-block:: ExperimentManager - Experiment 1 - Recorder 1 - Recorder 2 - ... - Experiment 2 - Recorder 1 - Recorder 2 - ... - ... 此实验管理系统定义了一组接口,并提供了基于机器学习平台 ``MLFlow`` 的具体实现 ``MLflowExpManager`` (`链接 `_)。 如果用户将 ``ExpManager`` 的实现设置为 ``MLflowExpManager``,则可以使用命令 `mlflow ui` 可视化和检查实验结果。有关更多信息,请参阅 `此处 `_ 的相关文档。 Qlib 记录器 ============= ``QlibRecorder`` 为用户提供了使用实验管理系统的高级 API。这些接口封装在 ``Qlib`` 中的变量 ``R`` 中,用户可以直接使用 ``R`` 与系统交互。以下命令展示了如何在 Python 中导入 ``R``: .. code-block:: Python from qlib.workflow import R ``QlibRecorder`` 包含多个常用 API,用于在工作流中管理 `实验` 和 `记录器`。有关更多可用 API,请参阅以下关于 `实验管理器`、`实验` 和 `记录器` 的部分。 以下是 ``QlibRecorder`` 的可用接口: .. autoclass:: qlib.workflow.__init__.QlibRecorder :members: 实验管理器 ================== ``Qlib`` 中的 ``ExpManager`` 模块负责管理不同的实验。``ExpManager`` 的大多数 API 与 ``QlibRecorder`` 相似,其中最重要的 API 是 ``get_exp`` 方法。用户可以直接参考上文文档了解如何使用 ``get_exp`` 方法的详细信息。 .. autoclass:: qlib.workflow.expm.ExpManager :members: get_exp, list_experiments :noindex: 有关其他接口(如 `create_exp`、`delete_exp`),请参阅 `实验管理器 API <../reference/api.html#experiment-manager>`_。 实验 ========== ``Experiment`` 类专门负责单个实验,它将处理与实验相关的所有操作。包括 `开始`、`结束` 实验等基本方法。此外,还提供与 `记录器` 相关的方法:如 `get_recorder` 和 `list_recorders`。 .. autoclass:: qlib.workflow.exp.Experiment :members: get_recorder, list_recorders :noindex: 有关其他接口(如 `search_records`、`delete_recorder`),请参阅 `实验 API <../reference/api.html#experiment>`_。 ``Qlib`` 还提供了一个默认的 ``Experiment``,当用户使用 `log_metrics` 或 `get_exp` 等 API 时,会在特定情况下创建和使用该默认实验。如果使用默认 ``Experiment``,运行 ``Qlib`` 时会记录相关信息。用户可以在 ``Qlib`` 的配置文件中或 ``Qlib`` 的 `初始化 <../start/initialization.html#parameters>`_ 过程中更改默认 ``Experiment`` 的名称,默认名称为 '`Experiment`'。 记录器 ======== ``Recorder`` 类负责单个记录器。它将处理单个运行的详细操作,如 ``log_metrics``、``log_params``。它旨在帮助用户轻松跟踪运行过程中生成的结果和内容 以下是一些未包含在 ``QlibRecorder`` 中的重要 API: .. autoclass:: qlib.workflow.recorder.Recorder :members: list_artifacts, list_metrics, list_params, list_tags :noindex: 有关其他接口(如 `save_objects`、`load_object`),请参阅 `记录器 API <../reference/api.html#recorder>`_。 记录模板 =============== ``RecordTemp`` 类用于以特定格式生成实验结果,如 IC 和回测结果。我们提供了三种不同的 `记录模板` 类: - ``SignalRecord``:此类生成模型的 `预测` 结果。 - ``SigAnaRecord``:此类生成模型的 `IC`、`ICIR`、`Rank IC` 和 `Rank ICIR`。 以下是 ``SigAnaRecord`` 中实现的简单示例,用户如果想使用自己的预测和标签计算 IC、Rank IC、多空收益,可以参考此示例。 .. code-block:: Python from qlib.contrib.eva.alpha import calc_ic, calc_long_short_return ic, ric = calc_ic(pred.iloc[:, 0], label.iloc[:, 0]) long_short_r, long_avg_r = calc_long_short_return(pred.iloc[:, 0], label.iloc[:, 0]) - ``PortAnaRecord``:此类生成 `回测` 结果。有关 `回测` 以及可用 `策略` 的详细信息,用户可以参考 `策略 <../component/strategy.html>`_ 和 `回测 <../component/backtest.html>`_。 以下是 ``PortAnaRecord`` 中实现的简单示例,用户如果想基于自己的预测和标签进行回测,可以参考此示例。 .. code-block:: Python from qlib.contrib.strategy.strategy import TopkDropoutStrategy from qlib.contrib.evaluate import ( backtest as normal_backtest, risk_analysis, ) # 回测 STRATEGY_CONFIG = { "topk": 50, "n_drop": 5, } BACKTEST_CONFIG = { "limit_threshold": 0.095, "account": 100000000, "benchmark": BENCHMARK, "deal_price": "close", "open_cost": 0.0005, "close_cost": 0.0015, "min_cost": 5, } strategy = TopkDropoutStrategy(**STRATEGY_CONFIG) report_normal, positions_normal = normal_backtest(pred_score, strategy=strategy,** BACKTEST_CONFIG) # 分析 analysis = dict() analysis["excess_return_without_cost"] = risk_analysis(report_normal["return"] - report_normal["bench"]) analysis["excess_return_with_cost"] = risk_analysis(report_normal["return"] - report_normal["bench"] - report_normal["cost"]) analysis_df = pd.concat(analysis) # type: pd.DataFrame print(analysis_df) 有关 API 的更多信息,请参阅 `记录模板 API <../reference/api.html#module-qlib.workflow.record_temp>`_。 已知限制 ================= - Python 对象基于 pickle 保存,当转储对象和加载对象的环境不同时可能会导致问题。