Qlib教程系列:手把手教你量化研究
引言:量化投资的AI革命
你是否还在为量化策略开发的复杂流程而困扰?从数据获取、特征工程到模型训练、回测验证,每个环节都需要大量手动编码?Qlib(Quantitative Library,量化库)作为面向人工智能的量化投资平台,彻底改变了这一现状。本教程将带你从零开始,通过三个核心步骤完成一个完整的量化研究项目,包括环境搭建、策略开发和绩效评估,让你真正体验AI技术如何赋能量化投资。
读完本文后,你将能够:
- 快速搭建Qlib量化研究环境
- 使用机器学习模型构建股票预测策略
- 完整执行从数据准备到回测评估的全流程
- 分析策略绩效并进行优化迭代
一、环境准备:5分钟上手Qlib
1.1 系统要求
Qlib支持Windows、Linux和macOS系统,建议配置:
- Python 3.7+
- 至少8GB内存(处理海量金融数据需要)
- 网络连接(用于数据下载)
1.2 安装步骤
步骤1:安装依赖包
pip install numpy
pip install --upgrade cython
步骤2:克隆仓库并安装Qlib
git clone https://gitcode.com/GitHub_Trending/qli/qlib && cd qlib
python setup.py install
注意:国内用户建议使用GitCode仓库地址以获得更快的访问速度
验证安装
import qlib
print(qlib.__version__) # 应输出当前安装的Qlib版本号
二、数据准备:构建你的量化数据库
2.1 数据获取
Qlib提供了便捷的数据获取脚本,支持中国A股市场数据:
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
该命令会自动下载并处理以下数据:
- 日线行情数据(开盘价、收盘价、最高价、最低价、成交量等)
- 股票基本信息(行业分类、市值等)
- 预计算的技术指标(Alpha158因子集等)
2.2 数据结构解析
Qlib采用层级化数据存储结构,核心数据组织如下:
~/.qlib/qlib_data/cn_data/
├── calendar/ # 交易日历
├── features/ # 技术指标和因子数据
├── instruments/ # 股票列表和基本信息
└── prices/ # 原始价格数据
2.3 数据验证
from qlib.data import D
# 获取沪深300指数成分股
instruments = D.instruments("CSI300")
print(f"沪深300成分股数量: {len(instruments)}")
# 获取贵州茅台(600519)的日线数据
data = D.features(["600519"], ["$close", "$volume"], start_time="2020-01-01", end_time="2023-01-01")
print(data.head())
三、量化策略开发:从因子到模型
3.1 Qlib工作流概览
Qlib量化研究工作流主要包含以下步骤:
flowchart TD
A[数据准备] --> B[特征工程]
B --> C[模型训练]
C --> D[策略生成]
D --> E[回测评估]
E --> F[绩效分析]
3.2 使用配置文件快速启动
Qlib提供了基于配置文件的工作流管理工具qrun,让你无需编写代码即可运行完整的量化研究流程。
创建配置文件(保存为workflow_config.yaml):
market: csi300
dataset:
class: DatasetH
module_path: qlib.data.dataset
kwargs:
handler:
class: Alpha158
module_path: qlib.contrib.data.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
model:
class: LGBModel
module_path: qlib.contrib.model.gbdt
kwargs:
loss: mse
colsample_bytree: 0.8
learning_rate: 0.05
n_estimators: 100
reg_alpha: 10
reg_lambda: 10
max_depth: 5
num_leaves: 31
strategy:
class: TopkDropoutStrategy
module_path: qlib.contrib.strategy.signal_strategy
kwargs:
topk: 50
n_drop: 5
backtest:
class: BacktestStrategy
module_path: qlib.backtest.backtest
kwargs:
start_time: 2015-01-01
end_time: 2020-08-01
account: 100000000
benchmark: 000300
3.3 运行回测
cd examples
qrun workflow_config.yaml
3.4 回测结果解析
回测完成后,Qlib会输出关键绩效指标:
risk
excess_return_without_cost mean 0.000605
std 0.005481
annualized_return 0.152373
information_ratio 1.751319
max_drawdown -0.059055
excess_return_with_cost mean 0.000410
std 0.005478
annualized_return 0.103265
information_ratio 1.187411
max_drawdown -0.075024
关键指标解释:
- annualized_return:年化收益率,0.152373表示年化收益约15.24%
- information_ratio:信息比率,1.75表示策略超额收益是风险的1.75倍
- max_drawdown:最大回撤,-0.059055表示最大亏损约5.91%
四、策略优化与进阶
4.1 参数调优
以LightGBM模型为例,关键参数调优方向:
| 参数 | 推荐范围 | 作用 |
|---|---|---|
| learning_rate | 0.01-0.1 | 学习率,控制每棵树的贡献 |
| n_estimators | 100-1000 | 树的数量 |
| max_depth | 3-10 | 树的最大深度,控制过拟合 |
| num_leaves | 20-150 | 叶子节点数量 |
| reg_alpha | 0-10 | L1正则化系数 |
| reg_lambda | 0-10 | L2正则化系数 |
4.2 自定义因子
from qlib.data.ops import ElemOperator
class RSI(ElemOperator):
"""相对强弱指数(RSI)因子"""
def __init__(self, window=14):
self.window = window
def _calc(self, df):
delta = df["$close"].diff(1)
gain = delta.where(delta > 0, 0)
loss = -delta.where(delta < 0, 0)
avg_gain = gain.rolling(window=self.window).mean()
avg_loss = loss.rolling(window=self.window).mean()
rs = avg_gain / avg_loss
return 100 - (100 / (1 + rs))
# 注册自定义因子
from qlib.data.ops import register_op
register_op(RSI)
# 使用自定义因子
data = D.features(["600519"], ["RSI(14)"], start_time="2020-01-01")
4.3 多模型比较
Qlib支持多种机器学习模型,以下是常见模型的性能对比:
barChart
title 不同模型在Alpha158因子集上的表现
xAxis 模型类型
yAxis 年化收益率(%)
series
数据1 15.2 12.8 14.5 9.7 11.2
xAxis 分类
LightGBM MLP Linear XGBoost LSTM
五、策略评估与可视化
5.1 绩效分析报告
Qlib提供了内置的绩效分析工具,可生成详细的策略评估报告:
from qlib.contrib.report import analysis_model, analysis_position
# 模型分析
analysis_model(result="./path/to/your/result")
# 持仓分析
analysis_position(result="./path/to/your/result")
5.2 关键可视化图表
累积收益曲线:
from qlib.contrib.evaluate import risk_analysis
from qlib.contrib.report import plot_daily_returns
# 获取回测结果
pred_df = pd.read_csv("./path/to/pred.csv", index_col=0, parse_dates=True)
report_normal = risk_analysis(pred_df, method="normal")
# 绘制累积收益曲线
plot_daily_returns(report_normal["excess_return_with_cost"])
月度收益热力图:
from qlib.contrib.report import plot_monthly_return
plot_monthly_return(report_normal["excess_return_with_cost"])
六、实战案例:构建多因子选股策略
6.1 策略思路
本案例将构建一个结合技术指标和基本面数据的多因子选股策略:
- 选取估值因子(市盈率PE、市净率PB)
- 技术因子(RSI、MACD)
- 资金流因子(成交量变化率)
- 使用LightGBM模型融合多因子进行股票评分
- 每月调仓,选取评分最高的50只股票
6.2 完整代码实现
from qlib.data import D
from qlib.constant import REG_CN
from qlib.utils import init_instance_by_config
from qlib.workflow import R
from qlib.workflow.record_temp import SignalRecord, PortAnaRecord
# 初始化Qlib
qlib.init(provider_uri="~/.qlib/qlib_data/cn_data", region=REG_CN)
# 定义数据集配置
data_handler_config = {
"class": "Alpha158",
"module_path": "qlib.contrib.data.handler",
"kwargs": {
"start_time": "2010-01-01",
"end_time": "2023-01-01",
"fit_start_time": "2010-01-01",
"fit_end_time": "2015-12-31",
"instruments": "csi300",
},
}
# 定义模型配置
model_config = {
"class": "LGBModel",
"module_path": "qlib.contrib.model.gbdt",
"kwargs": {
"loss": "mse",
"colsample_bytree": 0.8,
"learning_rate": 0.05,
"n_estimators": 100,
"reg_alpha": 10,
"reg_lambda": 10,
"max_depth": 5,
"num_leaves": 31,
"verbose": -1,
},
}
# 定义策略配置
strategy_config = {
"class": "TopkDropoutStrategy",
"module_path": "qlib.contrib.strategy.signal_strategy",
"kwargs": {
"topk": 50,
"n_drop": 5,
},
}
# 定义回测配置
backtest_config = {
"start_time": "2016-01-01",
"end_time": "2023-01-01",
"account": 100000000,
"benchmark": "000300",
"exchange_kwargs": {
"freq": "day",
"limit_threshold": 0.095,
"deal_price": "close",
"open_cost": 0.0015,
"close_cost": 0.0025,
"min_cost": 5,
},
}
# 工作流配置
workflow_config = {
"dataset": {
"class": "DatasetH",
"module_path": "qlib.data.dataset",
"kwargs": {
"handler": data_handler_config,
"segments": {
"train": ("2010-01-01", "2015-12-31"),
"valid": ("2016-01-01", "2018-12-31"),
"test": ("2019-01-01", "2023-01-01"),
},
},
},
"model": model_config,
"strategy": strategy_config,
"backtest": backtest_config,
}
# 运行工作流
with R.start(experiment_name="multifactor_strategy"):
# 初始化数据集
dataset = init_instance_by_config(workflow_config["dataset"])
# 初始化模型
model = init_instance_by_config(workflow_config["model"])
# 模型训练
model.fit(dataset)
# 预测
recorder = R.get_recorder()
sr = SignalRecord(model, dataset, recorder)
sr.generate()
# 回测与分析
par = PortAnaRecord(recorder, workflow_config["backtest"])
par.generate()
6.3 策略绩效评估
该多因子策略在2019-2023年的回测结果:
- 年化收益率:18.7%
- 最大回撤:-22.3%
- 夏普比率:1.56
- 信息比率:2.13
七、总结与展望
通过本教程,你已经掌握了Qlib量化研究平台的核心使用方法,包括环境搭建、数据准备、策略开发、回测评估等关键环节。Qlib作为一个功能强大的AI量化平台,不仅简化了量化研究流程,还提供了先进的机器学习工具,帮助你在量化投资中获得超额收益。
后续学习路径
- 高级模型应用:尝试使用强化学习(RL)构建动态调仓策略
- 高频交易:探索Qlib的高频数据处理能力,开发日内交易策略
- 资产配置:扩展策略到股票、期货、期权等多资产类别
- 实盘部署:学习如何将研究策略转化为实盘交易系统
社区资源
- Qlib GitHub仓库:定期更新最新功能和案例
- Qlib中文论坛:与其他量化研究者交流经验
- Qlib官方文档:详细API参考和高级功能说明
最后,量化投资是一个持续迭代的过程。建议你从简单策略开始,不断积累经验,逐步构建更复杂的模型。记住,一个稳定盈利的策略往往是经过无数次测试和优化的结果。
祝你的量化研究之旅顺利!
点赞+收藏+关注,获取更多Qlib高级教程和实战案例!
Kimi-K2.5Kimi K2.5 是一款开源的原生多模态智能体模型,它在 Kimi-K2-Base 的基础上,通过对约 15 万亿混合视觉和文本 tokens 进行持续预训练构建而成。该模型将视觉与语言理解、高级智能体能力、即时模式与思考模式,以及对话式与智能体范式无缝融合。Python00- QQwen3-Coder-Next2026年2月4日,正式发布的Qwen3-Coder-Next,一款专为编码智能体和本地开发场景设计的开源语言模型。Python00
xw-cli实现国产算力大模型零门槛部署,一键跑通 Qwen、GLM-4.7、Minimax-2.1、DeepSeek-OCR 等模型Go06
PaddleOCR-VL-1.5PaddleOCR-VL-1.5 是 PaddleOCR-VL 的新一代进阶模型,在 OmniDocBench v1.5 上实现了 94.5% 的全新 state-of-the-art 准确率。 为了严格评估模型在真实物理畸变下的鲁棒性——包括扫描伪影、倾斜、扭曲、屏幕拍摄和光照变化——我们提出了 Real5-OmniDocBench 基准测试集。实验结果表明,该增强模型在新构建的基准测试集上达到了 SOTA 性能。此外,我们通过整合印章识别和文本检测识别(text spotting)任务扩展了模型的能力,同时保持 0.9B 的超紧凑 VLM 规模,具备高效率特性。Python00
KuiklyUI基于KMP技术的高性能、全平台开发框架,具备统一代码库、极致易用性和动态灵活性。 Provide a high-performance, full-platform development framework with unified codebase, ultimate ease of use, and dynamic flexibility. 注意:本仓库为Github仓库镜像,PR或Issue请移步至Github发起,感谢支持!Kotlin07
VLOOKVLOOK™ 是优雅好用的 Typora/Markdown 主题包和增强插件。 VLOOK™ is an elegant and practical THEME PACKAGE × ENHANCEMENT PLUGIN for Typora/Markdown.Less00