Qlib 是一个专为量化金融和算法交易研究设计的开源库。本文配置一个基于 LightGBM 的梯度提升决策树(GBDT)模型,并使用金融数据集(包含 158 个技术指标特征)进行训练和预测。
1. 导入必要的模块
python
CollapseWrapRun
Copy
from qlib.contrib.model.gbdt import LGBModel
from qlib.contrib.data.handler import Alpha158
from qlib.utils import init_instance_by_config, flatten_dict
from qlib.workflow import R
from qlib.workflow.record_temp import SignalRecord, PortAnaRecord
- 目的:导入 Qlib 框架中所需的模块。
- 详细说明:
- LGBModel:基于 LightGBM 的梯度提升决策树模型,用于股票价格预测或信号生成。
- Alpha158:一个数据处理器,生成 158 个金融技术指标(特征),如移动平均线、RSI 等。
- init_instance_by_config:Qlib 的工具函数,根据配置字典动态实例化对象(例如模型或数据集)。
- flatten_dict:将嵌套字典展平为单一层级的键值对,便于记录参数。
- R:Qlib 的工作流管理器,用于记录实验的参数、结果等。
- SignalRecord 和 PortAnaRecord:用于记录模型预测信号和投资组合分析结果的工具类(本例中仅使用了 SignalRecord)。
2. 定义市场和基准
python
CollapseWrapRun
Copy
market = "csi300"
benchmark = "SH000300"
- 目的:指定实验的市场和基准指数。
- 详细说明:
- market = "csi300":表示使用中国 CSI 300 指数(沪深 300 指数)的成分股作为实验的市场数据。
- benchmark = "SH000300":指定沪深 300 指数作为基准,用于后续评估模型表现。
3. 配置数据处理器
python
CollapseWrapRun
Copy
data_handler_config = {
"start_time": "2008-01-01",
"end_time": "2020-08-01",
"fit_start_time": "2008-01-01",
"fit_end_time": "2014-12-31",
"instruments": market,
}
- 目的:定义数据处理器的参数,用于加载和处理金融数据。
- 详细说明:
- start_time 和 end_time:指定数据的整体时间范围,从 2008 年 1 月 1 日到 2020 年 8 月 1 日。
- fit_start_time 和 fit_end_time:指定模型训练的时间范围(2008-01-01 至 2014-12-31)。
- instruments:指定使用 CSI 300 指数的成分股数据。
4. 定义任务配置
python
CollapseWrapRun
Copy
task = {
"model": {
"class": "LGBModel",
"module_path": "qlib.contrib.model.gbdt",
"kwargs": {
"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,
},
},
"dataset": {
"class": "DatasetH",
"module_path": "qlib.data.dataset",
"kwargs": {
"handler": {
"class": "Alpha158",
"module_path": "qlib.contrib.data.handler",
"kwargs": data_handler_config,
},
"segments": {
"train": ("2008-01-01", "2014-12-31"),
"valid": ("2015-01-01", "2016-12-31"),
"test": ("2017-01-01", "2020-08-01"),
},
},
},
}
- 目的:定义实验的模型和数据集配置。
- 详细说明:
- 模型配置 (model):
- "class": "LGBModel":指定使用 LightGBM 模型。
- "module_path": "qlib.contrib.model.gbdt":指定模型的模块路径。
- "kwargs":LightGBM 模型的超参数,包括:
- loss: "mse":使用均方误差(Mean Squared Error)作为损失函数。
- colsample_bytree: 0.8879:每棵树使用的特征比例(列采样)。
- learning_rate: 0.0421:学习率,控制模型的学习速度。
- subsample: 0.8789:样本采样比例,防止过拟合。
- lambda_l1: 205.6999 和 lambda_l2: 580.9768:L1 和 L2 正则化参数,控制模型复杂度。
- max_depth: 8:树的最大深度,限制模型复杂度。
- num_leaves: 210:每棵树的最大叶子数,影响模型表达能力。
- num_threads: 20:并行训练的线程数,加速训练过程。
- 数据集配置 (dataset):
- "class": "DatasetH":使用 Qlib 的 DatasetH 类来管理数据集。
- "handler":指定数据处理器为 Alpha158,并传入前面定义的 data_handler_config。
- "segments":定义数据的时间段:
- train:训练集时间范围(2008-01-01 至 2014-12-31)。
- valid:验证集时间范围(2015-01-01 至 2016-12-31)。
- test:测试集时间范围(2017-01-01 至 2020-08-01)。
- 模型配置 (model):
5. 初始化模型和数据集
python
CollapseWrapRun
Copy
model = init_instance_by_config(task["model"])
dataset = init_instance_by_config(task["dataset"])
- 目的:根据配置字典实例化模型和数据集对象。
- 详细说明:
- init_instance_by_config(task["model"]):根据 task["model"] 的配置,实例化一个 LightGBM 模型。
- init_instance_by_config(task["dataset"]):根据 task["dataset"] 的配置,实例化一个数据集对象,包含训练、验证和测试数据,并使用 Alpha158 数据处理器生成特征。
6. 启动实验
python
CollapseWrapRun
Copy
with R.start(experiment_name="workflow"):
# train
R.log_params(**flatten_dict(task))
model.fit(dataset)
# prediction
recorder = R.get_recorder()
sr = SignalRecord(model, dataset, recorder)
sr.generate()
- 目的:启动 Qlib 工作流,执行模型训练和预测。
- 详细说明:
- with R.start(experiment_name="workflow"):启动一个名为 "workflow" 的实验,Qlib 会记录实验的元数据(如参数、结果等)。
- 训练阶段:
- R.log_params(**flatten_dict(task)):将任务配置展平后记录到实验日志中,便于后续分析。
- model.fit(dataset):使用数据集的训练部分(2008-01-01 至 2014-12-31)对 LightGBM 模型进行训练。
- 预测阶段:
- recorder = R.get_recorder():获取当前实验的记录器,用于保存实验结果。
- sr = SignalRecord(model, dataset, recorder):创建信号记录器,基于训练好的模型和数据集生成预测信号(可能是股票的买入/卖出信号或预期回报)。
- sr.generate():生成预测结果并保存到记录器中。
总结
这段代码的整体流程是:
- 配置数据和模型:使用 CSI 300 指数的成分股数据,基于 Alpha158 数据处理器生成 158 个技术指标特征,配置 LightGBM 模型的超参数。
- 数据划分:将数据分为训练集(2008-2014)、验证集(2015-2016)和测试集(2017-2020)。
- 模型训练:使用 LightGBM 模型在训练集上进行拟合,目标是预测股票价格或 Hawkins:Alpha158 数据处理器基于技术指标(如移动平均线、RSI 等)生成特征,这些特征结合历史股价数据,用于模型的输入。
- 数据划分:数据集被划分为三个时间段:
- 训练集(2008-01-01 至 2014-12-31):用于模型训练。
- 验证集(2015-01-01 至 2016-12-31):用于验证模型性能,调整超参数。
- 测试集(2017-01-01 至 2020-08-01):用于评估模型在未来数据上的表现。
- 模型训练:model.fit(dataset) 使用训练集数据训练 LightGBM 模型,目标是通过历史特征预测未来的股票表现(如价格变化或收益)。
- 预测:sr.generate() 使用训练好的模型对测试集数据生成预测信号(如买入/卖出建议),并将结果保存到实验记录中。
应用场景
这段代码适用于量化金融研究,目标是构建一个基于机器学习的交易策略,通过历史数据预测股票表现,生成交易信号。Alpha158 提供的 158 个技术指标为模型提供了丰富的特征输入,而 LightGBM 模型的高效性和准确性使其适合处理高维金融数据。
注意事项
- 数据依赖:代码假设 Qlib 已正确配置,并有 CSI 300 的历史数据可用。
- 超参数调基本配置:模型的超参数(如 learning_rate、max_depth 等)已预先设定,可能需要根据实际情况进一步调优。
- 运行环境:需要安装 Qlib 和 LightGBM 库,并确保数据源可用。