Wang's blog

基础 - 实验管理系统

Published on

简介

Qlib包含一个实验管理系统,名为QlibRecorder,它可以帮助用户高效地管理实验与分析结果。该系统有三个组件:

  • 实验管理器:用于管理实验
  • 实验:每个实例代表一个实验
  • 记录器:每个实例负责记录一次实验运行

该系统定义了一系列接口,还提供了一个具体的实现MLflowExpManager,该实现基于机器学习平台MLFlow。如果用户使用了该实现,则可以使用命令mlflow ui来可视化与检查实验结果。

QlibRecorder

QlibRecorder为用户提供了一套高级API来使用实验管理系统,该接口被封装为R,用户可以直接使用R与系统交互。导入R的代码如下:

from qlib.workflow import R

QlibRecorder还包括一些公用API用来在工作流中管理实验与记录器。

实验管理器 ExpManager

ExpManager模块负责管理不同的实验,大部分API与QlibRecorder相同,其中最重要的API是get_exp方法。

实验 Experiment

Experiment类负责处理与一个实验相关的所有操作,其中包括开始、结束实验等基本方法,以及与记录器相关的方法,如get_recorderlist_recorders

Qlib提供了一个默认的实验,在某些特定情况下,如用户调用log_metricsget_exp等API时,该实验被自动创建并使用。如果使用默认实验,则会产生相关的日志信息。用户可以在配置文件中或初始化时修改默认实验的名称。

记录器 Recorder

Recorder类负责在一次实验运行中帮助用户方便地跟踪实验结果以及生成的其它信息。

记录模板 RecordTemp

RecordTemp类用于按照指定格式生成实验结果。Qlib提供了三个记录模板类:

  • SignalRecord:生成模型的预测结果
  • SigAnaRecord:生成模型的IC/ICIR/Rank IC/Rank ICIR
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:生成回测结果
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)  # 类型: pd.DataFrame
print(analysis_df)