简介
Qlib 是微软开发的 AI 导向量化投资平台。它提供了数据处理、模型开发和交易策略实施的工具。
Qlib 是一个量化投资研究平台,将机器学习与金融数据分析相结合,用于开发交易策略。
| 特性 | 描述 |
|---|
| 数据管理 | 金融数据处理 |
| 模型训练 | ML 模型开发 |
| 策略回测 | 测试交易策略 |
| 投资组合管理 | 优化投资组合 |
| 风险分析 | 评估风险指标 |
与其他方案的比较
| 特性 | Qlib | Zipline | Backtrader |
|---|
| ML 集成 | 原生 | 有限 | 有限 |
| 数据管理 | 内置 | 外部 | 外部 |
| 云支持 | 是 | 否 | 否 |
| 中国市场 | 是 | 否 | 否 |
| 文档 | 良好 | 良好 | 良好 |
安装
系统要求
| 要求 | 最低 | 推荐 |
|---|
| Python | 3.7+ | 3.9+ |
| 内存 | 4 GB | 16+ GB |
| 存储 | 10 GB | 100+ GB |
| CPU | 2 核 | 8+ 核 |
安装步骤
# 从 PyPI 安装
pip install pyqlib
# 或从源码安装
git clone https://github.com/microsoft/qlib.git
cd qlib
pip install -e ".[dev]"
数据准备
# 下载市场数据
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/cn_data --region cn
# 美国市场
python scripts/get_data.py qlib_data --target_dir ~/.qlib/qlib_data/us_data --region us
数据结构
市场数据
| 字段 | 描述 |
|---|
| open | 开盘价 |
| high | 最高价 |
| low | 最低价 |
| close | 收盘价 |
| volume | 成交量 |
| factor | 调整因子 |
数据格式
| 格式 | 描述 |
|---|
| CSV | 逗号分隔值 |
| HDF5 | 层次数据格式 |
| In-memory | Pandas DataFrame |
数据提供者
| 提供者 | 描述 |
|---|
| Local | 本地数据文件 |
| Remote | 远程数据服务器 |
| Yahoo | Yahoo Finance |
| Alpha Vantage | Alpha Vantage API |
特征工程
内置特征
| 特征 | 描述 |
|---|
| Price | 基于价格的特征 |
| Volume | 基于成交量的特征 |
| Technical | 技术指标 |
| Fundamental | 基本面数据 |
| Custom | 用户自定义特征 |
技术指标
import qlib
from qlib.contrib.data.handler import Alpha158
# 初始化处理器
handler = Alpha158(
instruments="csi300",
start_time="2020-01-01",
end_time="2023-12-31"
)
# 获取特征
features = handler.fetch()
| 类别 | 数量 | 示例 |
|---|
| KMID | 6 | 价格动量 |
| KLEN | 6 | 价格范围 |
| KSFT | 6 | 价格偏移 |
| KLOW | 12 | 低价特征 |
| OPEN | 12 | 开盘价特征 |
| HIGH | 12 | 最高价特征 |
| LOW | 12 | 最低价特征 |
| CLOSE | 12 | 收盘价特征 |
| VOLUME | 12 | 成交量特征 |
| RSV | 6 | 相对强弱 |
| ROLL | 12 | 滚动特征 |
| CORR | 12 | 相关性特征 |
| CORD | 12 | 相关性差异 |
| SUMP | 12 | 正向求和特征 |
| SUMN | 12 | 负向求和特征 |
| SUMD | 12 | 求和差异特征 |
| VMA | 6 | 成交量均线 |
| VSTD | 6 | 成交量标准差 |
| WVMA | 6 | 加权成交量均线 |
| VSUMP | 6 | 成交量正向求和 |
| VSUMN | 6 | 成交量负向求和 |
| VSUMD | 6 | 成交量求和差异 |
自定义特征
from qlib.data.dataset import DatasetH
# 定义自定义特征
FEATURES = [
"Ref($close, 1) / $close - 1", # 1日收益
"Ref($close, 5) / $close - 1", # 5日收益
"Mean($close, 10) / $close - 1", # 均线比率
]
# 创建数据集
dataset = DatasetH(
handler={
"class": "Alpha158",
"module_path": "qlib.contrib.data.handler",
"kwargs": {
"instruments": "csi300",
"start_time": "2020-01-01",
"end_time": "2023-12-31",
},
}
)
模型开发
内置模型
| 模型 | 类型 | 描述 |
|---|
| LightGBM | 树模型 | 梯度提升 |
| XGBoost | 树模型 | 梯度提升 |
| CatBoost | 树模型 | 梯度提升 |
| Linear | 线性 | 线性回归 |
| LSTM | 深度学习 | 长短期记忆 |
| GRU | 深度学习 | 门控循环单元 |
| Transformer | 深度学习 | 注意力模型 |
训练模型
import qlib
from qlib.contrib.model.gbdt import LGBModel
# 初始化模型
model = LGBModel(
loss="mse",
colsample_bytree=0.8879,
learning_rate=0.0421,
subsample=0.8789,
lambda_l1=205.6999,
lambda_l2=580.9768,
max_depth=8,
num_leaves=210,
num_threads=20,
)
# 训练模型
model.fit(dataset)
模型配置
# LightGBM 参数
LGB_PARAMS = {
"colsample_bytree": 0.8879,
"learning_rate": 0.0421,
"subsample": 0.8789,
"lambda_l1": 205.6999,
"lambda_l2": 580.9768,
"max_depth": 8,
"num_leaves": 210,
}
深度学习模型
from qlib.contrib.model.pytorch_lstm import LSTM
model = LSTM(
d_feat=6,
hidden_size=64,
num_layers=2,
dropout=0.0,
lr=0.001,
)
策略开发
内置策略
| 策略 | 描述 |
|---|
| TopK | 选择前 K 只股票 |
| WeightStrategy | 基于权重的分配 |
| SignalStrategy | 基于信号的交易 |
from qlib.contrib.strategy.signal_strategy import TopkDropoutStrategy
strategy = TopkDropoutStrategy(
signal=predictions,
topk=50,
n_drop=5,
)
自定义策略
from qlib.contrib.strategy.signal_strategy import BaseSignalStrategy
class MyStrategy(BaseSignalStrategy):
def __init__(self, signal, **kwargs):
super().__init__(signal, **kwargs)
def generate_target_weight_position(self, score):
# 自定义权重计算
weights = score / score.sum()
return weights
回测
运行回测
from qlib.backtest import backtest
# 运行回测
report, metrics = backtest(
start_time="2023-01-01",
end_time="2023-12-31",
strategy=strategy,
executor={
"class": "SimulatorExecutor",
"module_path": "qlib.backtest.executor",
"kwargs": {
"time_per_step": "day",
"generate_report": True,
},
}
)
回测指标
| 指标 | 描述 |
|---|
| Annual return | 年化收益率 |
| Sharpe ratio | 夏普比率 |
| Max drawdown | 最大回撤 |
| Win rate | 胜率 |
| Profit factor | 盈亏比 |
绩效分析
from qlib.contrib.report import analysis_model, analysis_position
# 分析持仓
analysis_position.report_graph(report)
# 分析模型
analysis_model.model_performance_graph(predictions)
投资组合管理
投资组合优化
from qlib.contrib.strategy.weight_strategy import WeightStrategyStrategy
strategy = WeightStrategyStrategy(
signal=predictions,
method="max_sharpe",
)
优化方法
| 方法 | 描述 |
|---|
| equal | 等权重 |
| min_variance | 最小方差 |
| max_sharpe | 最大夏普比率 |
| risk_parity | 风险平价 |
| black_litterman | Black-Litterman 模型 |
风险分析
风险指标
| 指标 | 描述 |
|---|
| Value at Risk | 潜在损失 |
| Conditional VaR | 预期短缺 |
| Beta | 市场敏感度 |
| Alpha | 超额收益 |
| Volatility | 价格波动率 |
风险分析代码
from qlib.contrib.eva import risk_analysis
# 分析风险
risk_metrics = risk_analysis(report)
print(risk_metrics)
数据管道
数据流
原始数据 → 处理 → 特征 → 模型 → 预测 → 策略 → 回测
数据处理
from qlib.data.dataset import DatasetH
# 使用处理器创建数据集
dataset = DatasetH(
handler={
"class": "Alpha158",
"module_path": "qlib.contrib.data.handler",
"kwargs": {
"instruments": "csi300",
"start_time": "2020-01-01",
"end_time": "2023-12-31",
},
}
)
# 获取数据
data = dataset.prepare(
segments={
"train": ("2020-01-01", "2021-12-31"),
"valid": ("2022-01-01", "2022-12-31"),
"test": ("2023-01-01", "2023-12-31"),
}
)
配置
import qlib
from qlib.config import REG_CN
qlib.init(
provider_uri="~/.qlib/qlib_data/cn_data",
region=REG_CN,
)
配置选项
| 选项 | 描述 |
|---|
| provider_uri | 数据目录 |
| region | 市场区域 |
| expression_cache | 缓存表达式 |
| dataset_cache | 缓存数据集 |
高级功能
多模型集成
from qlib.contrib.ensemble import Ensemble
# 创建集成模型
ensemble = Ensemble(
models=[model1, model2, model3],
method="average",
)
超参数调优
from qlib.contrib.tuner import Tuner
tuner = Tuner(
model=LGBModel,
param_grid={
"learning_rate": [0.01, 0.05, 0.1],
"max_depth": [5, 8, 10],
},
)
部署
实盘交易
from qlib.contrib.strategy.signal_strategy import TopkDropoutStrategy
# 创建实盘策略
strategy = TopkDropoutStrategy(
signal=model.predict(live_data),
topk=50,
n_drop=5,
)
部署选项
| 选项 | 描述 |
|---|
| Paper trading | 模拟交易 |
| Live trading | 实盘交易 |
| Batch mode | 定时运行 |
最佳实践
开发流程
| 步骤 | 描述 |
|---|
| 1. 数据 | 准备和清洗数据 |
| 2. 特征 | 特征工程 |
| 3. 模型 | 训练和验证 |
| 4. 回测 | 测试策略 |
| 5. 优化 | 调参 |
| 6. 部署 | 上线 |
常见陷阱
| 陷阱 | 解决方案 |
|---|
| 过拟合 | 使用交叉验证 |
| 前视偏差 | 注意数据分割 |
| 幸存者偏差 | 包含退市股票 |
| 交易成本 | 包含真实成本 |
总结
| 组件 | 用途 |
|---|
| 数据 | 市场数据管理 |
| 特征 | 技术指标 |
| 模型 | ML 模型训练 |
| 策略 | 交易逻辑 |
| 回测 | 策略测试 |
| 投资组合 | 资产配置 |