首页
/ 使用Microsoft Qlib构建量化投资工作流实战指南

使用Microsoft Qlib构建量化投资工作流实战指南

2026-02-04 04:18:11作者:郁楠烈Hubert

前言

Microsoft Qlib是一个面向量化投资的开源AI平台,它提供了一套完整的工具链,从数据处理、模型训练到回测分析。本文将基于Qlib的代码示例,详细介绍如何构建一个完整的量化投资工作流。

环境准备与数据获取

在开始之前,我们需要确保环境配置正确并获取必要的数据:

import qlib
import pandas as pd
from qlib.constant import REG_CN
from qlib.utils import exists_qlib_data, init_instance_by_config
from qlib.workflow import R
from qlib.workflow.record_temp import SignalRecord, PortAnaRecord
from qlib.utils import flatten_dict

Qlib使用特定的数据格式,我们需要下载并初始化数据:

provider_uri = "~/.qlib/qlib_data/cn_data"  # 数据存储路径
if not exists_qlib_data(provider_uri):
    print(f"Qlib数据未在{provider_uri}找到")
    # 下载数据脚本并执行
    ...
qlib.init(provider_uri=provider_uri, region=REG_CN)

这里我们使用的是中国市场(REG_CN)的数据,数据将存储在用户目录下的.qlib/qlib_data/cn_data文件夹中。

模型训练

数据准备与模型配置

Qlib使用配置字典来定义数据处理和模型参数:

data_handler_config = {
    "start_time": "2008-01-01",
    "end_time": "2020-08-01",
    "fit_start_time": "2008-01-01",
    "fit_end_time": "2014-12-31",
    "instruments": "csi300",  # 使用沪深300成分股
}

task = {
    "model": {
        "class": "LGBModel",  # 使用LightGBM模型
        "module_path": "qlib.contrib.model.gbdt",
        "kwargs": {  # 模型超参数
            "loss": "mse",
            "colsample_bytree": 0.8879,
            "learning_rate": 0.0421,
            ...
        }
    },
    "dataset": {
        "class": "DatasetH",
        "module_path": "qlib.data.dataset",
        "kwargs": {
            "handler": {
                "class": "Alpha158",  # 使用Alpha158特征集
                "module_path": "qlib.contrib.data.handler",
                "kwargs": data_handler_config,
            },
            "segments": {  # 划分训练集、验证集和测试集
                "train": ("2008-01-01", "2014-12-31"),
                "valid": ("2015-01-01", "2016-12-31"),
                "test": ("2017-01-01", "2020-08-01"),
            },
        },
    },
}

模型训练与保存

Qlib提供了简洁的API来初始化和训练模型:

model = init_instance_by_config(task["model"])
dataset = init_instance_by_config(task["dataset"])

with R.start(experiment_name="train_model"):
    R.log_params(**flatten_dict(task))  # 记录实验参数
    model.fit(dataset)  # 训练模型
    R.save_objects(trained_model=model)  # 保存模型
    rid = R.get_recorder().id  # 获取实验记录ID

这里使用了Qlib的实验记录系统(R)来跟踪模型训练过程,这在后续的分析和比较中非常有用。

回测与分析

回测配置

回测配置定义了交易策略、执行方式和分析参数:

port_analysis_config = {
    "executor": {
        "class": "SimulatorExecutor",  # 使用模拟执行器
        "module_path": "qlib.backtest.executor",
        "kwargs": {
            "time_per_step": "day",  # 按天执行
            "generate_portfolio_metrics": True,
        },
    },
    "strategy": {
        "class": "TopkDropoutStrategy",  # 使用TopK剔除策略
        "module_path": "qlib.contrib.strategy.signal_strategy",
        "kwargs": {
            "model": model,
            "dataset": dataset,
            "topk": 50,  # 选择前50只股票
            "n_drop": 5,  # 剔除5只表现最差的
        },
    },
    "backtest": {
        "start_time": "2017-01-01",
        "end_time": "2020-08-01",
        "account": 100000000,  # 初始资金1亿元
        "benchmark": "SH000300",  # 基准为沪深300指数
        "exchange_kwargs": {  # 交易成本设置
            "freq": "day",
            "limit_threshold": 0.095,
            "deal_price": "close",
            "open_cost": 0.0005,
            "close_cost": 0.0015,
            "min_cost": 5,
        },
    },
}

执行回测

with R.start(experiment_name="backtest_analysis"):
    # 加载之前训练的模型
    recorder = R.get_recorder(recorder_id=rid, experiment_name="train_model")
    model = recorder.load_object("trained_model")
    
    # 生成预测信号
    recorder = R.get_recorder()
    ba_rid = recorder.id
    sr = SignalRecord(model, dataset, recorder)
    sr.generate()
    
    # 执行回测和分析
    par = PortAnaRecord(recorder, port_analysis_config, "day")
    par.generate()

结果分析

Qlib提供了丰富的分析工具来评估策略表现:

持仓分析

from qlib.contrib.report import analysis_model, analysis_position

recorder = R.get_recorder(recorder_id=ba_rid, experiment_name="backtest_analysis")
pred_df = recorder.load_object("pred.pkl")
report_normal_df = recorder.load_object("portfolio_analysis/report_normal_1day.pkl")
positions = recorder.load_object("portfolio_analysis/positions_normal_1day.pkl")
analysis_df = recorder.load_object("portfolio_analysis/port_analysis_1day.pkl")

# 生成报告图表
analysis_position.report_graph(report_normal_df)
analysis_position.risk_analysis_graph(analysis_df, report_normal_df)

模型评估

# 准备标签数据
label_df = dataset.prepare("test", col_set="label")
label_df.columns = ["label"]

# 合并预测和标签
pred_label = pd.concat([label_df, pred_df], axis=1, sort=True).reindex(label_df.index)

# 评估模型表现
analysis_position.score_ic_graph(pred_label)  # IC分数分析
analysis_model.model_performance_graph(pred_label)  # 模型性能分析

总结

通过本文,我们学习了如何使用Microsoft Qlib构建完整的量化投资工作流:

  1. 数据准备:下载并初始化Qlib格式的市场数据
  2. 模型训练:配置和训练LightGBM模型
  3. 回测分析:定义交易策略并执行回测
  4. 结果评估:使用内置工具分析策略和模型表现

Qlib的强大之处在于它提供了一站式的解决方案,从数据处理到策略回测,所有环节都可以通过Python代码流畅地衔接。其模块化设计也使得我们可以轻松替换各个组件(如模型、策略等),快速验证不同想法。

对于想要进一步探索的读者,可以尝试:

  • 使用不同的特征集(如Alpha360)
  • 尝试其他模型(如神经网络)
  • 调整策略参数(如持仓数量、调仓频率)
  • 添加自定义的风险控制模块

Qlib为量化研究提供了坚实的基础设施,让研究人员可以更专注于策略和模型本身的开发。

登录后查看全文
热门项目推荐
相关项目推荐