📖

Qlib 简介

Qlib 是一个面向 AI 的量化投资平台,旨在实现 AI 技术在量化投资中的潜力,赋能研究,创造价值。

借助 Qlib,用户可以轻松尝试自己的想法,创建更好的量化投资策略。该平台提供了一个完整的量化投资研究工作流,从数据处理到模型训练,从策略回测到实盘交易。

✨ 核心特点

  • 完整的量化工作流:覆盖数据处理、特征工程、模型训练、回测分析等全流程
  • 模块化设计:各组件松耦合,可独立使用或组合使用
  • 丰富的模型库:内置 LightGBM、MLP、LSTM 等多种机器学习模型
  • 灵活的框架:支持监督学习和强化学习等多种范式
  • 实验管理:完善的实验跟踪和版本管理
🏗️

框架架构

Qlib 在模块层面是一个由多个组件组成的平台。这些组件被设计为松耦合的模块,每个组件都可以独立使用。

💡
提示

对于新用户来说,这个框架可能看起来有些复杂。建议初学者先跳过此部分,熟悉基本功能后再阅读。

架构层次

层次 描述
基础设施层 为量化研究提供底层支持。DataServer 提供高性能的基础设施来管理和检索原始数据。Trainer 提供灵活的接口来控制模型的训练过程。
学习框架层 预测模型和交易代理是可训练的。它们基于学习框架层训练,然后应用于工作流层的多个场景。支持强化学习和监督学习。
工作流层 覆盖量化投资的整个工作流。支持基于监督学习的策略和基于强化学习的策略。包括信息提取、预测模型、决策生成和执行环境。
接口层 为底层系统呈现用户友好的界面。分析模块为用户提供关于预测信号、投资组合和执行结果的详细分析报告。
🚀

快速入门

本快速入门指南将向您展示:

  • 使用 Qlib 构建完整的量化研究工作流非常简单
  • 即使使用公开数据和简单模型,机器学习技术在量化投资中也能表现优异

1️⃣ 安装 Qlib

在安装 Qlib 之前,需要安装一些依赖项:

bash
pip install numpy
pip install --upgrade cython

克隆仓库并安装 Qlib:

bash
git clone https://github.com/microsoft/qlib.git && cd qlib
python setup.py install
💡
提示

推荐使用 pip 直接安装:pip install pyqlib

2️⃣ 准备数据

运行以下代码加载和准备数据:

bash
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
⚠️
注意

此数据集收集自 Yahoo Finance,可能不够完美。如果您有高质量数据集,建议准备自己的数据。

3️⃣ 运行自动量化研究工作流

Qlib 提供了一个名为 qrun 的工具来自动运行整个工作流(包括构建数据集、训练模型、回测和评估):

bash
cd examples  # 避免在包含 `qlib` 的目录下运行
qrun benchmarks/LightGBM/workflow_config_lightgbm.yaml

回测结果示例

指标 无成本超额收益 含成本超额收益
均值 (mean) 0.000605 0.000410
标准差 (std) 0.005481 0.005478
年化收益率 (annualized_return) 0.152373 0.103265
信息比率 (information_ratio) 1.751319 1.187411
最大回撤 (max_drawdown) -0.059055 -0.075024
📥

安装指南

系统要求

💡
提示

Qlib 支持 Windows 和 Linux。推荐在 Linux 环境下使用。Qlib 支持 Python3,最高支持到 Python 3.8。

安装方式

方式一:使用 pip 安装(推荐)

bash
pip install pyqlib

方式二:从源码安装

1. 进入 Qlib 根目录(包含 setup.py 文件)

2. 执行以下命令安装环境依赖和 Qlib:

bash
$ pip install numpy
$ pip install --upgrade cython
$ git clone https://github.com/microsoft/qlib.git && cd qlib
$ python setup.py install
💡
提示

推荐使用 Anaconda/Miniconda 设置环境。Qlib 需要 lightgbm 和 pytorch 包,使用 pip 安装它们。

验证安装

使用以下代码验证安装是否成功:

python
>>> import qlib
>>> qlib.__version__
'0.9.8.dev11'
⚙️

初始化配置

下载和准备数据

执行以下命令下载股票数据:

bash
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn

初始化 Qlib

在调用其他 API 之前,需要先初始化 Qlib:

python
import qlib
# region 在 [REG_CN, REG_US] 中选择
from qlib.constant import REG_CN

provider_uri = "~/.qlib/qlib_data/cn_data"  # 数据目录
qlib.init(provider_uri=provider_uri, region=REG_CN)
⚠️
注意

不要在 Qlib 的仓库目录中导入 qlib 包,否则可能会出错。

初始化参数

除了 provider_uriregionqlib.init 还有其他重要参数:

provider_uri

  • 类型:str
  • 说明:Qlib 数据的 URI。例如,可以是通过 get_data.py 加载的数据存储位置。

region

  • 类型:str,可选参数(默认:qlib.constant.REG_CN)
  • 支持值
    • qlib.constant.REG_US ('us'):美国股票市场
    • qlib.constant.REG_CN ('cn'):中国股票市场
  • 说明:不同的 region 值会导致不同的股票市场模式,包括不同的交易限制和成本。

redis_host

  • 类型:str,可选参数(默认:"127.0.0.1")
  • 说明:Redis 主机地址。锁定和缓存机制依赖于 Redis。

redis_port

  • 类型:int,可选参数(默认:6379)
  • 说明:Redis 端口
⚠️
注意

如果 Qlib 无法通过 redis_host 和 redis_port 连接到 Redis,将不会使用缓存机制!

exp_manager(实验管理器)

  • 类型:dict,可选参数
  • 说明:Qlib 中使用的实验管理器设置。用户可以指定实验管理器类以及所有实验的跟踪 URI。
python
qlib.init(provider_uri=provider_uri, region=REG_CN, exp_manager={
    "class": "MLflowExpManager",
    "module_path": "qlib.workflow.expm",
    "kwargs": {
        "uri": "python_execution_path/mlruns",
        "default_exp_name": "Experiment",
    }
})

mongo(MongoDB)

  • 类型:dict,可选参数
  • 说明:MongoDB 设置,用于某些功能(如任务管理),具有高性能和集群处理能力。
python
qlib.init(provider_uri=provider_uri, region=REG_CN, mongo={
    "task_url": "mongodb://localhost:27017/",  # mongo URI
    "task_db_name": "rolling_db",  # 任务管理的数据库名称
})
💾

数据获取

用户可以使用 Qlib 获取股票数据。以下示例演示了基本的用户界面。

Qlib 初始化

💡
提示

为了获取数据,用户需要先使用 qlib.init 初始化 Qlib。

python
>>> import qlib
>>> qlib.init(provider_uri='~/.qlib/qlib_data/cn_data')

加载交易日历

python
>>> from qlib.data import D
>>> D.calendar(start_time='2010-01-01', end_time='2017-12-31', freq='day')[:2>
[Timestamp('2010-01-04 00:00:00'), Timestamp('2010-01-05 00:00:00')]

加载股票池

python
>>> from qlib.data import D
>>> instruments = D.instruments(market='csi300')
>>> D.list_instruments(instruments=instruments, start_time='2010-01-01',
                       end_time='2017-12-31', as_list=True)[:6]
['SH600036', 'SH600110', 'SH600087', 'SH600900', 'SH600089', 'SZ000912']

加载特征数据

python
>>> from qlib.data import D
>>> instruments = ['SH600000']
>>> fields = ['$close', '$volume', 'Ref($close, 1)', 'Mean($close, 3)', '$high-$low']
>>> D.features(instruments, fields, start_time='2010-01-01',
               end_time='2017-12-31', freq='day').head()

使用过滤器

按名称过滤

python
>>> from qlib.data.filter import NameDFilter
>>> nameDFilter = NameDFilter(name_rule_re='SH[0-9]{4}55')
>>> instruments = D.instruments(market='csi300', filter_pipe=[nameDFilter])
>>> D.list_instruments(instruments=instruments, start_time='2015-01-01',
                       end_time='2016-02-15', as_list=True)
['SH600655', 'SH601555']

按表达式过滤

python
>>> from qlib.data.filter import ExpressionDFilter
>>> expressionDFilter = ExpressionDFilter(rule_expression='$close>2000')
>>> instruments = D.instruments(market='csi300', filter_pipe=[expressionDFilter])

表达式编程方式

在构建复杂表达式时,使用单个字符串可能不太方便。您也可以通过代码实现表达式:

python
>>> from qlib.data.ops import *
>>> f1 = Feature("high") / Feature("close")
>>> f2 = Feature("open") / Feature("close")
>>> f3 = f1 + f2
>>> f4 = f3 * f3 / f3
>>> data = D.features(["sh600519"], [f4], start_time="20200101")
💡
提示

调用 D.features() 时,使用参数 disk_cache=0 跳过数据集缓存,disk_cache=1 生成并使用数据集缓存,disk_cache=2 更新数据集缓存(服务端)。