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 更新数据集缓存(服务端)。
工作流管理
Qlib 提供了完整的工作流管理系统,帮助用户构建、执行和管理量化投资策略。工作流是 Qlib 的核心概念,它将数据处理、模型训练、策略回测等环节串联起来。
工作流配置
Qlib 使用 YAML 格式来配置工作流。一个典型的工作流配置包含以下部分:
workflow: class: "qlib.workflow.workflow.TemporalWorkflow" module_path: "qlib.workflow.workflow" kwargs: start_time: "2010-01-01" end_time: "2017-12-31" fit_start_time: "2010-01-01" fit_end_time: "2016-12-31" executor: class: "qlib.backtest.executor.BacktestExecutor" module_path: "qlib.backtest.executor" kwargs: trade_exchange: class: "qlib.backtest.exchange.SimpleExchange" module_path: "qlib.backtest.exchange" kwargs: limit_threshold: 0.2 task: class: "qlib.workflow.task_management.TrainingTask" module_path: "qlib.workflow.task_management" kwargs: dataset: class: "qlib.data.dataset.DatasetH" module_path: "qlib.data.dataset" kwargs: segments: train: start_time: "2010-01-01" end_time: "2015-12-31" type: "train" model: class: "qlib.contrib.model.gbdt.LGBModel" module_path: "qlib.contrib.model.gbdt" kwargs: loss: "mse" col: "mse"
运行工作流
使用 qrun 命令运行工作流:
qrun workflow_config.yaml
工作流组件
- Workflow:工作流容器,定义任务执行的时间框架
- Executor:执行器,负责交易执行和模拟
- Task:任务,定义模型训练和预测
- Dataset:数据集,定义训练和测试数据
- Model:模型,定义预测模型
- Strategy:策略,定义交易信号生成
- Portfolio:投资组合,定义持仓管理
- Analyzer:分析器,定义性能指标计算
Qlib 提供了多种预定义的工作流模板,位于 examples/benchmarks 目录下。用户可以基于这些模板快速开始自己的研究。
模型训练
Qlib 提供了丰富的模型库和灵活的训练接口。用户可以使用内置模型,也可以自定义模型。
内置模型
LightGBM 模型
from qlib.contrib.model.gbdt import LGBModel model = LGBModel( loss="mse", col="mse", ) model.fit(dataset) pred = model.predict(dataset)
MLP 模型(多层感知机)
from qlib.contrib.model.pytorch_nn import DNNModelPytorch model = DNNModelPytorch( dnn_layers=(64, 32,), dropout=0.2, ) model.fit(dataset) pred = model.predict(dataset)
LSTM 模型
from qlib.contrib.model.pytorch_lstm import LSTMModel model = LSTMModel( dnn_layers=(64,), lstm_layers=(32,), dropout=0.2, ) model.fit(dataset) pred = model.predict(dataset)
模型训练接口
fit 方法
- 参数:dataset(数据集)
- 说明:训练模型
predict 方法
- 参数:dataset(数据集)
- 返回:预测结果
训练前确保数据集已正确准备,包括特征工程和数据分割。
- YAML vs Code: YAML配置适合快速原型和复现,Python代码提供更大灵活性。生产环境建议使用Python API
- 数据分片: 使用time-series cross-validation避免look-ahead bias,确保训练集早于验证集和测试集
- 版本管理: 将workflow配置文件纳入Git管理,每个实验记录配置快照
- 并行实验: 使用TaskManager并行运行多个模型配置,加速策略搜索
- 实验追踪: 集成MLflow或Weights & Biases记录超参数、指标和artifacts
🔥 社区推荐的Workflow结构
# 推荐的workflow文件组织结构 project/ ├── configs/ │ ├── base_config.yaml # 基础配置(数据、市场) │ ├── model_lgbm.yaml # 模型配置 │ ├── model_mlp.yaml # 模型配置 │ └── strategy_topk.yaml # 策略配置 ├── scripts/ │ ├── run_exp.py # 实验运行脚本 │ └── analyze_results.py # 结果分析脚本 └── notebooks/ └── visualize.ipynb # 可视化分析
📊 实战案例:多模型对比实验
社区常见的做法是同时训练多个模型进行对比:
from qlib.workflow import R from qlib.tests.config import TEST_CONFIG models = ['LGBModel', 'MLPModel', 'LSTMModel'] results = {} with R.start(experiment_name="model_comparison"): for model_name in models: # 运行每个模型 recorder = R.get_recorder() results[model_name] = recorder.list_metrics() # 对比结果 for model, metrics in results.items(): print(f"{model}: IC={metrics['IC']}, RankIC={metrics['Rank IC']}")
| 场景 | 推荐模型 | 原因 |
|---|---|---|
| 特征工程良好 | LightGBM/XGBoost | 树模型对表格数据效果最佳 |
| 时序特征重要 | LSTM/GRU/TCN | RNN架构捕捉时序依赖 |
| 市场微观结构 | Transformer/GAT | 注意力机制建模股票间关系 |
| 快速原型 | Linear Regression | 基线模型,快速验证特征 |
⚡ 性能优化技巧
# LightGBM并行化加速 model_config = { "class": "LGBModel", "module_path": "qlib.contrib.model.gbdt", "kwargs": { "num_threads": 20, # 利用多核 "learning_rate": 0.02, # 降低学习率提高精度 "num_leaves": 210, # 增加叶节点数提升拟合能力 "feature_fraction": 0.9, # 特征采样防止过拟合 "bagging_fraction": 0.8, # 数据采样 "early_stopping_rounds": 50 # 早停 } } # PyTorch GPU加速 mlp_config = { "class": "DNNModelPytorch", "module_path": "qlib.contrib.model.pytorch_nn", "kwargs": { "GPU": 0, # 使用GPU 0 "batch_size": 2048, # 增大批次提高GPU利用率 "lr": 0.002, "max_steps": 10000 } }
投资组合策略
Qlib 提供了多种投资组合策略实现,包括基于预测的策略和基于强化学习的策略。
Topk 策略
选择预测值最高的 k 只股票:
from qlib.contrib.strategy.topk import TopkStrategy strategy = TopkStrategy( topk=30, n_drop=5, method="weight", )
强化学习策略
基于强化学习的交易策略:
from qlib.contrib.strategy.rl_strategy import TwinFilterStrategy strategy = TwinFilterStrategy( transaction=0.0015, trade_exchange=exchange, )
策略接口
generate_pred 方法
- 参数:prediction(预测分数)
- 返回:目标投资组合
策略的核心是将预测分数转换为实际的投资组合权重。Qlib 提供了多种实现方式,用户也可以自定义策略。
- 换手率控制: 高换手率策略在实盘中会因交易成本严重损耗,建议控制在年化200%以内
- 风险分散: 单只股票权重不超过5%,行业集中度不超过30%
- 动态调仓: 根据市场波动率调整调仓频率,高波动期减少交易
- 成本建模: 回测时必须包含印花税、佣金、滑点等真实成本
- 流动性过滤: 剔除成交量过小的股票,避免实盘无法成交
🔧 自定义策略示例
继承TopkDropoutStrategy并添加风险约束:
from qlib.contrib.strategy.strategy import TopkDropoutStrategy import pandas as pd import numpy as np class RiskControlledStrategy(TopkDropoutStrategy): """ 带风险控制的Topk策略 - 限制单股权重 - 控制行业集中度 - 过滤低流动性股票 """ def __init__(self, **kwargs): super().__init__(**kwargs) self.max_weight_per_stock = 0.05 # 单股最大5% self.max_industry_concentration = 0.3 # 行业最大30% def generate_order_dir(self, pred_score, **kwargs): # 调用父类方法生成初始仓位 W = super().generate_order_dir(pred_score, **kwargs) # 应用风险约束 W = self._apply_weight_cap(W) W = self._apply_industry_cap(W) # 重新归一化 W = W / W.sum() return W def _apply_weight_cap(self, W): # 限制单股权重 W = W.clip(upper=self.max_weight_per_stock) return W def _apply_industry_cap(self, W): # 简化版本:假设已有行业分类数据 # 实际需要加载行业数据并计算集中度 return W # 使用自定义策略 strategy_config = { "class": "RiskControlledStrategy", "module_path": "your_module", "kwargs": { "topk": 50, "n_drop": 5 } }
- 性能优化:
- 使用ExpressionCache缓存计算结果
- 复杂表达式拆分为多个简单表达式
- 避免重复计算相同特征
- 因子组合:
- 先构建基础因子(动量、反转、波动)
- 再构建复合因子(因子之间的交互)
- 最后进行因子降维(PCA、IC加权)
- 常见Alpha因子:
- 动量: Ref($close, 20) / $close - 1
- 反转: -Ref($close, 5) / $close + 1
- 波动: Std($close, 20) / Mean($close, 20)
- 成交额换手: $volume * $close / Mean($volume * $close, 20)
🔥 经典Alpha因子库(Alpha158、Alpha360)
Qlib内置了两个强大的因子库:
| 因子库 | 因子数量 | 特点 | 适用场景 |
|---|---|---|---|
| Alpha158 | 158个 | 基于量价的传统因子 | 日频、中低频交易 |
| Alpha360 | 360个 | 更长时间窗口、更多技术指标 | 深度学习模型 |
💻 自定义Alpha因子示例
# 自定义Alpha因子集合 from qlib.data.dataset.handler import DataHandlerLP # 定义自定义因子 custom_features = [ # 动量类 "Ref($close, 20) / $close - 1", # 20日收益率 "Ref($close, 60) / $close - 1", # 60日收益率 "($close - Ref($close, 5)) / Ref($close, 5)", # 5日收益率 # 反转类 "-Ref($close, 3) / $close + 1", # 3日反转 "-($high - $low) / $close", # 日内振幅 # 波动类 "Std($close, 20) / Mean($close, 20)", # 20日波动率 "Std($volume, 10) / Mean($volume, 10)", # 10日成交量波动 # 成交量相关 "$volume / Mean($volume, 20)", # 相对成交量 "($volume * $close) / Mean($volume * $close, 20)", # 相对成交额 # 技术指标 "($close - Mean($close, 20)) / Std($close, 20)", # Z-score "($close - Mean($close, 10)) / Mean($close, 10)", # 偏离度 # 跨截面特征 "Rank($close / Ref($close, 1))", # 当日收益率排名 "Rank($volume)", # 成交量排名 ] # 数据处理器配置 handler_config = { "class": "DataHandlerLP", "module_path": "qlib.data.dataset.handler", "kwargs": { "start_time": "2008-01-01", "end_time": "2020-08-01", "fit_start_time": "2008-01-01", "fit_end_time": "2014-12-31", "instruments": "csi300", "infer_processors": [ {"class": "RobustZScoreNorm", "kwargs": {"fields_group": "feature", "clip_outlier": True}}, {"class": "Fillna", "kwargs": {"fields_group": "feature"}}, ], "learn_processors": [ {"class": "DropnaLabel"}, {"class": "CSRankNorm", "kwargs": {"fields_group": "label"}}, ], } } # 标签定义:预测未来2天收益率 label = ["Ref($close, -2) / Ref($close, -1) - 1"]
构建因子后务必进行IC检验、换手率分析、因子正交性检验。只保留IC > 0.03 且换手率合理的因子。
数据框架
Qlib 的数据框架设计灵活且强大,支持多种数据源和表达式计算。
数据提供器
Qlib 支持多种数据提供器:
- LocalDataClient:本地数据提供器
- CalendarDataClient:交易日历数据
- InstrumentDataClient:股票数据
- FeatureDataClient:特征数据
数据表达式
Qlib 支持丰富的数据表达式:
基础运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| $ | 原始数据 | $close |
| Ref | 引用 | Ref($close, 1) |
| Mean | 均值 | Mean($close, 5) |
| Std | 标准差 | Std($close, 10) |
| Max | 最大值 | Max($high, 20) |
| Min | 最小值 | Min($low, 20) |
| Sum | 求和 | Sum($volume, 5) |
高级运算符
- Rank:排序
- Quantile:分位数
- ROC:变化率
- MA:移动平均
- EMA:指数移动平均
- MACD:移动平均收敛发散
- RSI:相对强弱指数
# 示例:复杂表达式 fields = [ "Ref($close, 1) / $close - 1", # 1日收益率 "Mean($close, 5) / $close - 1", # 5日均值收益率 "Std($close, 10) / Mean($close, 10)", # 变异系数 "Rank($close) / len($close)", # 价格排名 "$close > Ref($close, 1)", # 是否上涨 ]
表达式语法非常灵活,支持嵌套和组合。可以构建复杂的 Alpha 因子。
- 存储优化:
- 使用二进制格式(.bin)加速读取
- ExpressionCache缓存计算结果
- DatasetCache缓存完整数据集
- 数据质量:
- 检查缺失值比例(>30%需修复)
- 检查价格连续性(异常跳变)
- 检查复权处理
- 性能对比:
- HDF5: 184.4s(单核)
- MySQL: 365.3s(单核)
- Qlib+Cache: 7.4s(单核),4.2s(64核)
🔧 自定义数据源集成
# 集成自定义数据源(如Tushare、AKShare) import pandas as pd from qlib.data import D # 方案1:使用DataProvider接口 from qlib.data.base import BaseProvider class CustomDataProvider(BaseProvider): def __init__(self, api_token): self.api_token = api_token def get_data(self, instruments, start_time, end_time): # 调用外部API获取数据 df = self.fetch_from_api(instruments, start_time, end_time) # 转换为Qlib格式 return self.to_qlib_format(df) # 方案2:直接转换为Qlib格式 def convert_to_qlib(source_df): """ 将标准DataFrame转换为Qlib格式 Parameters ---------- source_df : pd.DataFrame columns = [datetime, instrument, open, high, low, close, volume] Returns ------- pd.DataFrame Qlib标准格式 """ df = source_df.copy() # 重命名列 df.columns = ['date', 'instrument', 'open', 'high', 'low', 'close', 'volume'] # 设置索引 df = df.set_index(['date', 'instrument']) # 保存为Qlib格式 df.to_pickle('custom_data.bin') return df # 使用自定义数据 qlib.init( provider_uri='custom_data/', region=REG_CN, custom_data_provider=CustomDataProvider(api_token='your_token') )
公式化 Alpha
公式化 Alpha 是指使用表达式语言定义的 Alpha 因子。这种方式简洁高效,是量化研究的核心工具。
Alpha 表达式
Alpha 表达式由运算符和数据组成:
# 动量因子 alpha1 = "($close - Ref($close, 20)) / Std($close, 20)" # 反转因子 alpha2 = "-Rank($close) / len($close)" # 波动因子 alpha3 = "($high - $low) / Mean($close, 10)"
Alpha 网格
Qlib 提供了 Alpha360 网格,包含大量预定义的 Alpha 因子:
from qlib.contrib.data.alpha import get_all_alpha # 获取所有 Alpha 表达式 alpha_dict = get_all_alpha() # 使用 Alpha alpha_expr = alpha_dict['alpha036']
Alpha360 包含 360+ 个经典的 Alpha 因子,是量化研究的宝贵资源。
强化学习
Qlib 提供了完整的强化学习框架,支持多种 RL 算法和交易环境。
RL 框架组件
- Environment:交易环境,模拟真实交易
- Agent:智能体,学习交易策略
- Reward:奖励函数,定义优化目标
- Trainer:训练器,协调训练过程
使用示例
from qlib.contrib.evaluate import backtest from qlib.contrib.strategy.rl_strategy import TwinFilterStrategy # 配置 RL 工作流 config = { "env": { "class": "qlib.contribute.simulator.ExchangeSimulator", "module_path": "qlib.contribute.simulator", }, "agent": { "class": "qlib.rl.agent.Agent", "module_path": "qlib.rl.agent", }, } # 运行 RL 训练 portfolio_result, indicator_result = backtest(strategy, exchange)
强化学习训练计算密集,需要较长时间和大量资源。建议先使用监督学习模型建立基线。
- 算法选择:
- PPO - 适合连续动作空间(订单执行、仓位调整)
- DQN - 适合离散动作空间(买入/卖出/持有)
- A3C/A2C - 多线程并行训练
- 奖励设计:
- 使用Sharpe Ratio作为奖励,平衡收益和风险
- 加入交易成本惩罚,避免过度交易
- 考虑最大回撤惩罚,控制下行风险
- 训练技巧:
- 从简单环境开始(单资产→多资产)
- 使用Curriculum Learning逐步增加难度
- 定期保存checkpoint,防止训练崩溃
- 监控训练曲线,及时发现不收敛
- 常见问题:
- 不收敛 → 检查奖励函数设计、调整学习率
- 过拟合 → 增加环境随机性、使用正则化
- 训练缓慢 → 考虑并行采样、优化经验回放
🔥 实战案例:PPO订单执行策略
基于Vadim's Blog的高频交易实战案例:
# PPO订单执行策略(简化版) from qlib.rl import RLOrderExecPolicy from qlib.contrib.strategy import TopkDropoutStrategy # 配置RL策略 rl_config = { "class": "RLOrderExecPolicy", "module_path": "qlib.rl.order_execution", "kwargs": { "observation_space": 30, # 状态维度(价格、成交量、订单簿等) "action_space": 10, # 动作空间(10个离散动作) "freq": "1min", # 1分钟级别决策 "total_steps": 10000, # 训练步数 "reward_scaler": 1e4, # 奖励缩放因子 } } # 使用RL策略作为执行器 executor_config = { "class": "NestedExecutor", "kwargs": { "outer_strategy": TopkDropoutStrategy, "inner_executor": rl_config } } # 关键要点: # 1. 外层策略决定买哪些股票(日频) # 2. 内层RL策略决定如何拆单执行(分钟级) # 3. 奖励函数考虑滑点、成交速度、交易成本
⚡ 嵌套决策框架(Nested Execution)
Qlib独特的多层决策架构:
- 外层(日频): 选股、配置权重(TopkDropout、等权等)
- 内层(高频): 订单拆分、执行时机选择(RL策略、TWAP、VWAP)
- 优势:
- 联合优化选股和执行
- 考虑真实交易成本和滑点
- 支持分钟级甚至秒级决策
高频交易对数据延迟、系统性能、网络速度要求极高。回测成功≠实盘可行,务必充分考虑实际环境限制。
在线服务
Qlib 支持模型在线部署和实时预测,方便将研究成果应用于生产环境。
模型部署
保存模型
# 训练完成后保存模型 model.save("my_model.pkl")
加载模型
# 加载已保存的模型 model.load("my_model.pkl")
在线预测
# 获取最新数据 latest_data = D.features(instruments, fields) # 执行预测 predictions = model.predict(latest_data)
在线服务需要定期更新模型和数据,建议建立自动化流程。
- 架构设计:
- 模型训练(离线)→ 模型仓库 → 在线推理服务
- 数据更新 → 特征计算 → 模型预测 → 交易信号
- 使用Redis缓存热点数据和预测结果
- 监控告警:
- 模型性能衰减监控(IC下降>10%告警)
- 数据质量监控(缺失率、异常值)
- 服务健康监控(延迟、错误率)
- 模型更新:
- 定期重训练(周度/月度)
- 增量训练(新数据加入)
- A/B测试验证新模型
🔧 部署架构示例
# 生产环境架构
┌─────────────────────────────────────────────────────┐
│ Data Layer │
│ ├─ Market Data (实时行情) │
│ ├─ Fundamental Data (财务数据) │
│ └─ Alternative Data (替代数据) │
└──────────────────┬──────────────────────────────────┘
│
┌──────────▼──────────┐
│ Feature Engine │ (计算特征)
│ - 特征计算 │
│ - 数据清洗 │
│ - 特征缓存 │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ Model Service │ (模型推理)
│ - 模型加载 │
│ - 批量预测 │
│ - 结果缓存 │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ Signal Generator │ (生成信号)
│ - 风险控制 │
│ - 组合优化 │
│ - 订单生成 │
└──────────┬──────────┘
│
┌──────────▼──────────┐
│ Execution Engine │ (执行交易)
│ - 订单路由 │
│ - 滑点控制 │
│ - 仓位管理 │
└─────────────────────┘
⚡ 性能优化建议
- 特征预计算: 提前计算并缓存常用特征
- 批量预测: 避免单次预测,批量处理提升吞吐量
- 模型量化: INT8量化减少内存占用,加速推理
- 异步处理: 数据更新、特征计算、模型预测异步执行
- 负载均衡: 多实例部署,水平扩展
在线服务需要考虑数据延迟、系统稳定性、异常处理、回滚机制等。建议充分测试后再上线。
实验管理
Qlib 提供了完善的实验管理功能,帮助用户跟踪和比较不同实验。
MLflow 集成
Qlib 默认使用 MLflow 作为实验管理器:
import qlib from qlib.workflow.expm import MLflowExpManager # 初始化 Qlib 并配置 MLflow qlib.init( provider_uri=provider_uri, region=REG_CN, exp_manager={ "class": "MLflowExpManager", "module_path": "qlib.workflow.expm", kwargs: { "uri": "mlruns", # MLflow 跟径 "default_exp_name": "qlib_experiment", } } )
记录指标
# 训练完成后,指标会自动记录到 MLflow # 也可以手动记录 with mlflow.start_run(): mlflow.log_metric("sharpe", 1.5) mlflow.log_metric("max_drawdown", -0.08)
比较实验
使用 MLflow UI 可视化实验结果:mlflow ui
自定义模型
用户可以通过继承模型基类来创建自定义模型,实现特定的预测逻辑。
模型基类
所有 Qlib 模型都继承自 Model 基类:
from qlib.contrib.model.pytorch_nn import DNNModelPytorch from qlib.contrib.model.base import Model from qlib.data.dataset import DatasetH class CustomModel(DNNModelPytorch): def __init__(self, **kwargs): super().__init__(**kwargs) def fit(self, dataset: DatasetH): # 自定义训练逻辑 super().fit(dataset) def predict(self, dataset: DatasetH): # 自定义预测逻辑 return super().predict(dataset)
模型配置
在 YAML 中配置自定义模型:
model: class: "path.to.CustomModel" module_path: "path.to.module" kwargs: dnn_layers: [128, 64, 32] dropout: 0.2
自定义模型需要实现 fit 和 predict 方法,并确保与 Qlib 数据集接口兼容。
API 参考
Qlib 提供了丰富的 API,涵盖数据处理、模型训练、策略执行等各个方面。
核心 API
qlib.init
- 功能:初始化 Qlib
- 参数:provider_uri, region, redis_host, redis_port 等
D.features
- 功能:获取特征数据
- 参数:instruments, fields, start_time, end_time, freq
D.calendar
- 功能:获取交易日历
- 参数:start_time, end_time, freq
D.instruments
- 功能:获取股票池
- 参数:market, filter_pipe
完整 API 文档
请访问 Qlib 官方文档 获取完整的 API 参考。
大多数 API 都支持灵活的参数配置和数据过滤,建议详细阅读文档以充分利用这些功能。
贡献指南
我们欢迎社区贡献!无论是 Bug 报告、功能建议还是代码贡献,都非常感谢。
报告问题
- 在 GitHub Issues 中搜索现有问题
- 创建新 Issue,详细描述问题
- 提供复现代码和环境信息
提交代码
贡献流程
- Fork Qlib 仓库
- 创建特性分支(
git checkout -b feature/AmazingFeature) - 提交更改(
git commit -m 'Add some AmazingFeature') - 推送分支(
git push origin feature/AmazingFeature) - 创建 Pull Request
代码规范
- 遵循 PEP 8 代码风格
- 添加单元测试
- 更新相关文档
- 确保所有测试通过
开发指南
- 阅读 贡献指南
- 查看 开发文档
- 加入 Discord 社区 讨论
任何大小的贡献都是有价值的。帮助改进文档、修复 Bug 或添加新功能,都是对社区的贡献!
许可证
通过贡献代码,您同意您的贡献将根据 MIT 许可证 进行许可。
- 数据需求:
- 分钟级数据(1min、5min)
- 订单簿数据(LOB)- 逐笔数据
- 使用Arctic或MongoDB高效存储
- 实时性要求:
- 数据延迟 < 100ms
- 模型推理 < 10ms
- 订单发送 < 50ms
- 过拟合风险:
- 日内噪声极多,容易过拟合
- 使用Walk-Forward验证
- 严格控制模型复杂度
- 成本考量:
- 高频交易成本占比极大
- 必须精确建模滑点和手续费
- 收益微薄,需要规模效应
🔧 高频数据准备
# 导入订单簿数据到Qlib cd examples/orderbook_data # 初始化数据库(Arctic或MongoDB) python create_dataset.py initialize_library # 导入数据 python create_dataset.py import_data \ --source_dir /path/to/lob_data \ --freq 1min \ --backend arctic # 数据格式要求: # - datetime: timestamp # - instrument: 股票代码 # - bid/ask: 买卖价格 # - bid_vol/ask_vol: 买卖量
📊 高频特征示例
# 高频特征工程(订单簿数据) from qlib.data import D # 1. 买卖价差(Spread) spread = "($ask - $bid) / (($ask + $bid) / 2)" # 2. 订单簿失衡(Imbalance) imbalance = "($bid_vol - $ask_vol) / ($bid_vol + $ask_vol)" # 3. 中点价格变动 midpoint_move = "Ref(($bid + $ask) / 2, 1) / Ref(($bid + $ask) / 2, 0) - 1" # 4. 加权平均价格(VWAP) vwap = "Mean(($bid * $ask_vol + $ask * $bid_vol) / ($bid_vol + $ask_vol), 60)" # 5. 波动率(Realized Volatility) realized_vol = "Std(Ref($close, 1) / Ref($close, 0) - 1, 60)" features = [spread, imbalance, midpoint_move, vwap, realized_vol] df = D.features(instruments='csi300', fields=features, freq='1min')
评估与结果分析
Qlib 提供了强大的分析和可视化工具,帮助用户评估投资组合表现并分析结果。
图形化报告
Qlib 支持多种图形化报告类型:
- analysis_position.report_graph - 投资组合报告图表
- analysis_position.score_ic_graph - IC(信息系数)分析图
- analysis_position.cumulative_return_graph - 累计收益图
- analysis_position.risk_analysis_graph - 风险分析图
- analysis_position.rank_label_graph - 排名标签图
- analysis_model.model_performance_graph - 模型性能图
使用示例
import qlib.contrib.report as qcr # 查看所有支持的报告 print(qcr.GRAPH_NAME_LIST) # 生成投资组合报告 qcr.analysis_position.report_graph( pred=prediction, return_array=returns, **config )
关键指标说明
- IC (Information Coefficient):预测值与真实值的相关系数
- Rank IC:预测值与真实值的秩相关系数
- 最大回撤:投资组合价值的最大下跌幅度
- 信息比率:超额收益与跟踪误差的比值
- 换手率:投资组合持仓的变化频率
所有累计收益指标通过求和计算,避免了指标随时间指数级偏差。
高频交易框架
Qlib 提供了嵌套决策执行框架,支持多层级联合交易的回测和研究。
设计理念
日频交易(如投资组合管理)和日内交易(如订单执行)通常是分开研究的。为了获得两者联合的交易表现,需要在一个框架中考虑它们的相互作用。
框架架构
嵌套决策执行框架包含:
- Trading Agent:包含数据处理、预测模型和决策生成器
- Execution Environment:执行交易决策并返回结果
- 嵌套结构:粗粒度决策可以细分为细粒度决策
应用场景
- 日频订单在日内细分为多个小订单执行
- 组合管理策略与订单执行策略的联合优化
- 多时间尺度策略的协同
# 嵌套决策执行示例 from qlib.contrib.strategy.hf_trading import NestedStrategy # 配置多层决策 strategy = NestedStrategy( outer_freq='day', inner_freq='5min', )
高频交易的优化可以结合 QlibRL 强化学习框架实现。
任务管理
任务管理模块提供了一套完整的流程,包括任务生成、存储、训练和收集,支持自动化批量实验。
完整流程
- 任务生成:基于模板生成多个任务
- 任务存储:存储到 MongoDB 数据库
- 任务训练:自动执行训练任务
- 任务收集:收集和分析训练结果
任务生成
TaskGen 用于根据模板生成不同的任务:
from qlib.workflow.task.gen import RollingGen # 生成滚动窗口任务 task_gen = RollingGen( step=60, # 60天滚动 task_template=task_config ) tasks = task_gen.generate(task_config)
任务存储
使用 MongoDB 存储和管理任务:
from qlib.workflow.task.manage import TaskManager # 配置 MongoDB task_manager = TaskManager(task_pool='my_tasks') # 插入任务 task_manager.insert_task(task_def)
任务状态
- WAITING:等待训练
- RUNNING:正在训练
- PART_DONE:部分完成
- DONE:全部完成
使用任务管理需要先配置 MongoDB 数据库。
Point-in-Time 数据库
Point-in-Time (PIT) 数据库解决了历史回测中的数据泄露问题,确保在任何历史时间点获取正确版本的数据。
为什么需要 PIT?
在金融数据(特别是财务报告)中,同一条数据可能被多次修正。如果在历史回测中只使用最新版本,会导致数据泄露,影响回测结果的准确性。
数据格式
每个特征包含 4 列:
- date:声明发布日期
- period:声明周期(季度或年度)
- value:数值
- _next:下一个匹配记录的字节索引
文件结构
XXX_q.data # 季度数据 XXX_a.data # 年度数据 XXX_q.index # 索引文件(加速查询)
数据准备
Qlib 提供了爬虫和转换器帮助下载和转换数据:
# 参考 scripts/data_collector/pit/README.md python scripts/data_collector/pit/crawler.py python scripts/data_collector/pit/converter.py
PIT 数据库目前支持季度和年度频率,适用于大多数市场的财务数据。
开发者指南
本节面向希望参与 Qlib 开发的贡献者,介绍代码规范和开发流程。
文档字符串规范
请使用 Numpydoc 风格的文档字符串:
def predict(self, dataset): """ 预测数据集。 Parameters ---------- dataset : Dataset 要预测的数据集 Returns ------- prediction : pd.DataFrame 预测结果 """ pass
代码格式检查
Qlib 使用以下工具检查代码质量:
Black(代码格式化)
pip install black python -m black . -l 120
Pylint(代码风格)
# 忽略特定错误
return -ICLoss()(pred, target, index) # pylint: disable=E1130
Flake8(代码检查)
flake8 --ignore E501,F541,E402,E741 qlib
Pre-commit
Qlib 集成了 pre-commit,自动格式化代码:
pip install -e .[dev] pre-commit install
可编辑安装
开发者可以使用可编辑模式安装,直接反映代码更改:
pip install -e ".[dev]"
提交 PR 时,CI 会自动运行代码检查。请确保所有检查通过。
元控制器
元控制器提供了对任务、数据集和模型的更高层抽象,支持更灵活的实验管理。
Meta Task
MetaTask 允许动态配置任务:
- 根据运行时条件修改任务
- 支持任务依赖和调度
- 自动管理任务生命周期
Meta Dataset
MetaTaskDataset 提供数据集的元视图:
- 动态特征选择
- 数据增强策略
- 多数据源融合
Meta Model
元模型支持模型的组合和优化:
- General Meta Model:通用元模型接口
- Meta Task Model:任务级别元模型
- Meta Guide Model:指导式元模型
from qlib.model.meta.task import MetaTask # 创建元任务 meta_task = MetaTask( task_list=task_config_list, dataset=meta_dataset )
元控制器特别适合大规模超参数调优和多策略实验。
在线/离线服务器模式
Qlib-Server 提供了服务器模式,支持客户端-服务器架构的数据访问。
Qlib-Server
Qlib-Server 充当数据提供者,客户端可以通过网络访问数据:
- 优势:数据集中管理,避免重复存储
- 适用场景:多机器共享数据、分布式训练
- 协议:基于 python-socketio 的通信
启动服务器
python -m qlib.server.server
客户端连接
客户端需要正确配置连接参数:
from qlib.config import C C["server_config"] = { "host": "localhost", "port": 9999, } qlib.init(...)
确保 python-socketio 和 python-engineio 版本兼容。推荐使用 python-socketio==5.3.0。
序列化
Qlib 提供了序列化功能,支持模型和对象的保存与加载。
可序列化类
继承自 Serializable 的类可以被序列化:
from qlib.utils.serial import Serializable class MyModel(Serializable): def __init__(self): super().__init__() self.model = None
保存和加载
# 保存模型 model.save("my_model.pkl") # 加载模型 model.load("my_model.pkl")
支持格式
- Pickle 格式(.pkl)
- Pytorch 模型格式(.pt)
- JSON 配置
序列化后可以轻松分享模型或在其他环境中部署。
多媒体资源与学术论文
本章节汇总了Qlib相关的视频教程、架构图表、学术论文等资源,帮助您通过多种方式深入学习。
📹 视频教程
官方视频
Qlib - AI量化投资平台介绍
GitHub官方介绍视频 | 2024年8月
Qlib: AI-Driven Platform for Quantitative Finance
深度解析 | 2025年1月
Deeper Dive into Qlib
深入探讨 | 2025年1月
Microsoft Qlib – AI Transforming Quantitative Finance
短视频介绍 | 2025年10月
推荐学习路径
- 先看官方介绍视频,了解Qlib基本概念
- 学习本文档的"快速开始"章节
- 运行官方示例代码(examples/workflow_by_code.ipynb)
- 观看深度解析视频,理解高级功能
- 阅读学术论文,深入理解原理
📊 架构图与流程图
Qlib整体架构
┌─────────────────────────────────────────────────────────────────┐
│ 用户接口层 (Interface) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Python API │ │ CLI (qrun) │ │ Notebook │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼─────────────────┼─────────────────┼──────────────────────┘
│ │ │
┌─────────┼─────────────────┼─────────────────┼──────────────────────┐
│ ▼ ▼ ▼ │
│ 工作流层 (Workflow Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Information │→→│ Forecast │→→│ Portfolio │ │
│ │ Extractor │ │ Model │ │ Generator │ │
│ └──────────────┘ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────────────┐ ┌──────────────┐ ┌────────▼───────┐ │
│ │ Executor │←←│ Meta │←←│ Analyzer │ │
│ │ Strategy │ │ Controller │ │ & Report │ │
│ └──────────────┘ └──────────────┘ └────────────────┘ │
└─────────┬────────────────────────────────────────────────────────────┘
│
┌─────────┼────────────────────────────────────────────────────────────┐
│ ▼ │
│ 组件层 (Component Layer) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Data │ │ Model │ │ Strategy │ │
│ │ Framework │ │ Library │ │ Library │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Backtest │ │ RL │ │ Online │ │
│ │ Engine │ │ Framework │ │ Serving │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────┬────────────────────────────────────────────────────────────┘
│
┌─────────┼────────────────────────────────────────────────────────────┐
│ ▼ │
│ 基础设施层 (Infrastructure) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Data │ │ Expression │ │ Model │ │
│ │ Server │ │ Engine │ │ Trainer │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Experiment │ │ Cache │ │ Parallel │ │
│ │ Manager │ │ System │ │ Computing │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
Qlib工作流程
┌─────────────┐
│ 原始数据 │ (OHLCV, 财务数据, 替代数据)
└──────┬──────┘
│
▼
┌─────────────────────────────────────┐
│ 数据预处理 │
│ • 数据清洗 │
│ • 复权处理 │
│ • 特征工程 │
└──────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ 表达式引擎 │
│ • 计算 Alpha 因子 │
│ • 生成特征 (158/360个) │
│ • 标签定义 │
└──────┬──────────────────────────────┘
│
├─────────────────┬─────────────────┐
▼ ▼ ▼
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 训练集 │ │ 验证集 │ │ 测试集 │
│ (2008-2014) │ │ (2015-2016) │ │ (2017-2020) │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────┐
│ 模型训练 │
│ • LightGBM / XGBoost / CatBoost │
│ • MLP / LSTM / GRU / Transformer │
│ • RL Agent (PPO, DQN) │
└──────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ 预测生成 │
│ • 输出: 每只股票的预测分数 │
│ • 排序: 选择 top-k 股票 │
└──────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ 投资组合策略 │
│ • TopkDropoutStrategy │
│ • 风险控制 │
│ • 仓位分配 │
└──────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ 回测引擎 │
│ • 交易成本建模 │
│ • 滑点模拟 │
│ • 绩效计算 │
└──────┬────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────┐
│ 分析与报告 │
│ • IC, Rank IC, ICIR │
│ • 累计收益曲线 │
│ • 最大回撤 │
│ • 换手率分析 │
└─────────────────────────────────────────────┘
嵌套决策框架(高频交易)
┌────────────────────────────────────────────────────────────────────┐
│ 日频策略 (Daily Strategy) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ • 基于日频数据选股(如:CSI300成分股) │ │
│ │ • 使用Alpha158因子预测 │ │
│ │ • LightGBM模型训练 │ │
│ │ • 输出:目标仓位(如:买入100股AAPL) │ │
│ └──────────────────────────┬───────────────────────────────────┘ │
└───────────────────────────┼──────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────┐
│ 执行器 (Executor - 嵌套层) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 接收目标仓位 → 拆分为多个子订单 │ │
│ │ │ │
│ │ 示例:目标买入100股AAPL │ │
│ │ • 开盘拍卖:30股 │ │
│ │ • 盘中:40股(RL动态决定) │ │
│ │ • 收盘前:30股 │ │
│ └──────────────────────────┬───────────────────────────────────┘ │
└───────────────────────────┼──────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────┐
│ 分钟级RL策略 (Intraday RL Policy) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 状态空间 (State): │ │
│ │ • 当前持仓 │ │
│ │ • 实时价格(1分钟K线) │ │
│ │ • 订单簿深度(买卖价差) │ │
│ │ • 历史成交量 │ │
│ │ │ │
│ │ 动作空间 (Action): │ │
│ │ • 买入 N 股 │ │
│ │ • 卖出 N 股 │ │
│ │ • 等待(不交易) │ │
│ │ │ │
│ │ 奖励函数 (Reward): │ │
│ │ • -滑点成本 │ │
│ │ • +完成交易奖励 │ │
│ │ • -偏离VWAP惩罚 │ │
│ └──────────────────────────┬───────────────────────────────────┘ │
└───────────────────────────┼──────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────────────────┐
│ 环境模拟器 (Simulator) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ • 提供实时数据流 │ │
│ │ • 模拟订单成交(部分成交、滑点) │ │
│ │ • 计算交易成本 │ │
│ │ • 反馈奖励信号 │ │
│ └───────────────────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────────────────┘
📚 学术论文
核心论文
🏆 Qlib: An AI-oriented Quantitative Investment Platform
作者: Xiao Yang, Weiqing Liu, Dong Zhou, Jiang Bian, Tie-Yan Liu
发表: arXiv preprint arXiv:2009.11189 (2020)
链接: arXiv | PDF | Microsoft Research
内容: Qlib的原始论文,介绍了平台的设计理念、架构和核心功能。
相关研究
📊 Quantitative Trading using Deep Q Learning
作者: Soumyadip Sarkar
发表: arXiv:2304.06037 (2023)
链接: arXiv
内容: 使用深度Q学习进行量化交易的方法研究。
🤖 R&D-Agent-Quant: Multi-Agent Framework for Data-Centric Optimization
发表: arXiv:2505.15155 (2025)
链接: arXiv
内容: 多智能体框架,用于数据驱动的因子和模型联合优化。
🌊 Deep Reinforcement Learning for Quantitative Trading
发表: arXiv:2312.15730 (2023)
链接: arXiv
内容: 深度强化学习在量化交易中的应用综述。
📈 From Deep Learning to LLMs: AI in Quantitative Investment Survey
发表: arXiv:2503.21422 (2025)
链接: arXiv
内容: 从深度学习到大语言模型,AI在量化投资中的应用调查。
引用建议
@article{yang2020qlib,
title={Qlib: An AI-oriented Quantitative Investment Platform},
author={Yang, Xiao and Liu, Weiqing and Zhou, Dong and Bian, Jiang and Liu, Tie-Yan},
journal={arXiv preprint arXiv:2009.11189},
year={2020}
}
🔗 相关资源链接
- Microsoft Research: Qlib研究页面
- GitHub: microsoft/qlib (10.2k+ stars)
- 官方文档: qlib.readthedocs.io
- Discord社区: 加入讨论
- Gitter聊天: 实时交流
Qlib项目持续更新中,建议关注GitHub仓库获取最新功能和改进。学术论文和视频资源也在不断增加。
实战资源与最佳实践
本章节汇总了来自全网的 Qlib 实战资源、教程、博客和最佳实践,帮助您快速掌握 Qlib 并应用于实际量化投资研究。
📚 官方资源
- GitHub 仓库: microsoft/qlib - 源代码、Issue讨论、Pull Requests
- 官方文档: qlib.readthedocs.io - 完整API文档和教程
- 研究论文: Qlib: An AI-oriented Quantitative Investment Platform - Microsoft Research
- 示例代码:
examples/目录包含大量可运行的示例(LightGBM、MLP、LSTM、RL策略等)
🔥 高质量博客教程
1. Vadim's Blog - Qlib实战系列
深入浅出的Qlib实战教程,包含LightGBM和PyTorch MLP的完整案例:
- Harnessing AI for Quantitative Finance with Qlib and LightGBM
- Powering Quant Finance with Qlib's PyTorch MLP on Alpha360
- Leveraging Qlib and MLflow for Unified Experiment Tracking
这些博客提供了完整的YAML配置示例、详细的日志解读、性能优化建议以及实际运行中遇到的问题解决方案。
2. 中文社区资源
- 数量技术宅 - 三分钟玩转微软AI量化投资开源库QLib
- 完整的数据准备流程(雅虎财经数据下载)
- Workflow配置文件详解
- 一行命令启动策略回测 - CSDN - Qlib从入门到精通
- 系统梳理架构、核心功能、典型应用场景
- 实战案例快速上手 - 知乎 - Qlib学习分析
- 新手上手经验分享
- 学习路线和资料推荐
3. 综合指南
- Efficient Coder - Mastering Microsoft Qlib: From Basics to Advanced
- 涵盖40+种模型对比
- 性能基准测试
- 生产环境部署建议 - Joshua Berkowitz - Qlib, Open-Source AI For Quant Research
- 仓库结构分析
- 实践建议和工具链
⚡ 实战最佳实践
数据准备
# 下载社区维护的A股数据集
wget https://github.com/chenditc/investment_data/releases/latest/download/qlib_bin.tar.gz
mkdir -p ~/.qlib/qlib_data/cn_data
tar -zxvf qlib_bin.tar.gz -C ~/.qlib/qlib_data/cn_data
关键性能指标解读
| 指标 | 含义 | 优秀标准 |
|---|---|---|
| IC (Information Coefficient) | 预测值与真实值的相关系数 | > 0.05 |
| Rank IC | 秩相关系数 | > 0.05 |
| ICIR | 信息比率(IC均值/IC标准差) | > 0.5 |
| Annualized Return | 年化收益率 | > 基准 + 5% |
| Max Drawdown | 最大回撤 | < -10% |
🎓 学习路线建议
- 阅读本文档的"快速开始"章节
- 运行 examples/workflow_by_code.ipynb 熟悉基本流程
- 尝试修改 workflow 配置文件中的参数
- 阅读 Vadim 的博客教程了解实际应用
- 参考官方 examples 中的各种模型示例
- 深入理解数据框架和表达式引擎
- 学习自定义模型和策略
- 研究强化学习框架
- 探索高频交易和Point-in-Time数据库
- 部署在线服务和自动化流程
💻 社区与支持
🔧 常见问题实战
问题1: 数据质量检查
# 检查数据健康度
python scripts/check_data_health.py check-data \
--qlib_dir ~/.qlib/qlib_data/cn_data \
--missing_threshold 300 \
--price_step 0.5
问题2: 训练加速技巧
- 启用 DatasetCache 优化I/O
- 使用 Dask 并行计算
- 配置 ExpressionCache 复用特征
- 利用GPU加速深度学习模型
问题3: 模型性能优化
- 特征工程: 添加宏观经济数据、情绪分析、替代数据
- 模型选择: LightGBM欠拟合时尝试PyTorch神经网络
- 超参数调优: 使用贝叶斯优化、网格搜索、随机搜索
- 正则化: L1/L2惩罚或Dropout防止过拟合
- 并行化: 设置 num_threads 利用多核
即使预测信号很强,高换手率也会侵蚀利润。在实盘部署前务必关注交易成本、滑点等实际因素。
📊 性能基准参考
根据社区案例,以下是典型策略的回测表现:
| 策略 | 年化收益(无成本) | 年化收益(含成本) | 最大回撤 |
|---|---|---|---|
| LightGBM + Alpha158 | 17.83% | 12.90% | -9.11% |
| TopkDropout策略 | 15-20% | 10-15% | -8% 至 -12% |
🔮 未来发展方向
- 端到端学习: BPQP框架
- 云原生部署: AWS/Azure集成
- 替代数据: 新闻情绪、卫星数据处理
- 可解释性: SHAP值、特征可视化
- RD-Agent: LLM驱动的自动化因子发现和模型优化
常见问题
1. RuntimeError: multiprocessing 相关错误
错误信息:
RuntimeError: An attempt has been made to start a new process before the current process has finished its bootstrapping phase.
原因:Windows 下的多进程限制
解决方案:在主模块中使用 if __name__ == '__main__':
import qlib from qlib.data import D if __name__ == "__main__": qlib.init() df = D.features(instruments, fields, ...)
2. Redis lock 错误
错误信息:
QlibCacheException: redis lock key exists.
解决方案:清除 Redis 键
$ redis-cli > select 1 > flushdb
3. ModuleNotFoundError: qlib.data._libs.rolling
原因:在仓库目录中导入 qlib 而未编译
解决方案:
- PyCharm:运行
python setup.py build_ext --inplace - 命令行:确保不在项目目录中运行脚本
4. python-socketio 版本兼容问题
错误信息:BadNamespaceError: / is not a connected namespace
解决方案:确保版本兼容
pip install -U python-socketio==5.3.0 python-engineio==3.13.2
5. 换手率过高
可能原因:
- 预测信号变化过于频繁
- Topk 策略 k 值设置不当
- 未考虑交易成本
优化建议:
- 使用信号平滑技术
- 调整换手率限制参数
- 增加交易成本到优化目标
更多问题请访问 GitHub Issues 或查看 完整 FAQ。