Qlib 简介
Qlib 是一个面向 AI 的量化投资平台,旨在实现 AI 技术在量化投资中的潜力,赋能研究,创造价值。
借助 Qlib,用户可以轻松尝试自己的想法,创建更好的量化投资策略。该平台提供了一个完整的量化投资研究工作流,从数据处理到模型训练,从策略回测到实盘交易。
✨ 核心特点
- 完整的量化工作流:覆盖数据处理、特征工程、模型训练、回测分析等全流程
- 模块化设计:各组件松耦合,可独立使用或组合使用
- 丰富的模型库:内置 LightGBM、MLP、LSTM 等多种机器学习模型
- 灵活的框架:支持监督学习和强化学习等多种范式
- 实验管理:完善的实验跟踪和版本管理
框架架构
Qlib 在模块层面是一个由多个组件组成的平台。这些组件被设计为松耦合的模块,每个组件都可以独立使用。
对于新用户来说,这个框架可能看起来有些复杂。建议初学者先跳过此部分,熟悉基本功能后再阅读。
架构层次
| 层次 | 描述 |
|---|---|
| 基础设施层 | 为量化研究提供底层支持。DataServer 提供高性能的基础设施来管理和检索原始数据。Trainer 提供灵活的接口来控制模型的训练过程。 |
| 学习框架层 | 预测模型和交易代理是可训练的。它们基于学习框架层训练,然后应用于工作流层的多个场景。支持强化学习和监督学习。 |
| 工作流层 | 覆盖量化投资的整个工作流。支持基于监督学习的策略和基于强化学习的策略。包括信息提取、预测模型、决策生成和执行环境。 |
| 接口层 | 为底层系统呈现用户友好的界面。分析模块为用户提供关于预测信号、投资组合和执行结果的详细分析报告。 |
快速入门
本快速入门指南将向您展示:
- 使用 Qlib 构建完整的量化研究工作流非常简单
- 即使使用公开数据和简单模型,机器学习技术在量化投资中也能表现优异
1️⃣ 安装 Qlib
在安装 Qlib 之前,需要安装一些依赖项:
pip install numpy pip install --upgrade cython
克隆仓库并安装 Qlib:
git clone https://github.com/microsoft/qlib.git && cd qlib python setup.py install
推荐使用 pip 直接安装:pip install pyqlib
2️⃣ 准备数据
运行以下代码加载和准备数据:
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
此数据集收集自 Yahoo Finance,可能不够完美。如果您有高质量数据集,建议准备自己的数据。
3️⃣ 运行自动量化研究工作流
Qlib 提供了一个名为 qrun 的工具来自动运行整个工作流(包括构建数据集、训练模型、回测和评估):
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 安装(推荐)
pip install pyqlib
方式二:从源码安装
1. 进入 Qlib 根目录(包含 setup.py 文件)
2. 执行以下命令安装环境依赖和 Qlib:
$ 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 安装它们。
验证安装
使用以下代码验证安装是否成功:
>>> import qlib >>> qlib.__version__ '0.9.8.dev11'
初始化配置
下载和准备数据
执行以下命令下载股票数据:
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
初始化 Qlib
在调用其他 API 之前,需要先初始化 Qlib:
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_uri 和 region,qlib.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。
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 设置,用于某些功能(如任务管理),具有高性能和集群处理能力。
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。
>>> import qlib >>> qlib.init(provider_uri='~/.qlib/qlib_data/cn_data')
加载交易日历
>>> 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')]
加载股票池
>>> 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']
加载特征数据
>>> 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()
使用过滤器
按名称过滤
>>> 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']
按表达式过滤
>>> from qlib.data.filter import ExpressionDFilter >>> expressionDFilter = ExpressionDFilter(rule_expression='$close>2000') >>> instruments = D.instruments(market='csi300', filter_pipe=[expressionDFilter])
表达式编程方式
在构建复杂表达式时,使用单个字符串可能不太方便。您也可以通过代码实现表达式:
>>> 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 更新数据集缓存(服务端)。