尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Qlib Alpha158 实战指南:3 步配好 158 个因子池,附 4 个避坑点

Qlib Alpha158 实战指南:3 步配好 158 个因子池,附 4 个避坑点 Qlib Alpha158 实战指南3 步配好 158 个因子池附 4 个避坑点【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlibAlpha158 是 Qlib 量化平台内置的特征集158 个价量因子加默认标签负责特征工程这一环。本文带你看 Qlib Alpha158 从取数、切分、训练到回测验证的完整链路读完你能独立跑通一条因子 → 训练 → 回测流水线并知道 4 个常见坑在哪。先定位Alpha158 在数据链路里的位置Alpha158 是qlib/contrib/data/handler.py里DataHandlerLP可学习处理器数据处理器负责把原始数据加工成训练/推理两套数据的子类。它卡在 Qlib 的 bin 数据文件和模型之间下游QlibDataLoader按表达式把 open/high/low/close/volume 算成因子列上游DatasetH把因子矩阵切成 train/valid/test中间的处理器链processor chain负责去 inf、填缺失、做标准化。它最核心的量化特征是158 个因子 9 个 K 线形态kbar 4 个价格price 145 个滚动算子rolling特征其中 145 个是 29 种算子ROC、MA、STD、RANK、RSV、CORR……各配 5 个窗口 [5, 10, 20, 30, 60] 天。全部由价量 5 字段推导不需要任何外部数据源。参数默认值说明instrumentscsi500成分股池可换 csi300start_time / end_timeNone数据时间范围freqday日频labelRef($close,-2)/Ref($close,-1)-1次日收益率infer_processors[]推理处理器链默认空fit_start_time / fit_end_timeNone标准化处理器必需数据在链路中的流向核心机制拆解Qlib Alpha158 的 3 个高频用法 3 个坑最高频的 3 个用法用法一直接 fetch 特征和标签。不想建模、只想看因子分布或做相关性分析时跳过 Dataset 直接取数据。handler Alpha158(instrumentscsi300, start_time2008-01-01, end_time2020-08-01) feat handler.fetch(col_setfeature, data_keyinfer) # 158 列因子 label handler.fetch(col_setlabel, data_keyinfer) # 单列 LABEL0注意索引是 (datetime, instrument) 两级直接feat.loc[(2015-01-01, SH600000)]切片不需要 reset_index。用法二通过 DatasetH 接模型。这是进 qrun 流水线的标准姿势Alpha158 因子配置全部收敛在这段 YAML 里dataset: class: DatasetH kwargs: handler: class: Alpha158 module_path: qlib.contrib.data.handler kwargs: {instruments: csi300, start_time: 2008-01-01, end_time: 2020-08-01} segments: train: [2008-01-01, 2014-12-31] valid: [2015-01-01, 2016-12-31] test: [2017-01-01, 2020-08-01]注意segments 只是时间切分不是三份不同的数据处理过的数据infer/learn和时间段train/test是两个独立维度查询时自由组合。用法三自定义处理器链。官方 LightGBM 基准没配 infer_processors但换到对尺度敏感的模型时你得自己加kwargs: instruments: csi300 fit_start_time: 2008-01-01 fit_end_time: 2014-12-31 infer_processors: - {class: ProcessInf} # 处理 inf - {class: ZScoreNorm} # 全期 z-score - {class: Fillna} # 填缺失 learn_processors: - {class: DropnaLabel} - {class: CSZScoreNorm, kwargs: {fields_group: label}} # 标签按截面 z-score注意fit_start_time/fit_end_time限定 ZScoreNorm 只在训练段上拟合均值和标准差这是防前视偏差的机制不是可选优化。容易踩的 3 个坑⚠️坑一默认推理链是空的。Alpha158的infer_processors默认值是[]也就是说data_keyinfer拿到的是未标准化的原始因子。LightGBM 这类树模型对尺度不敏感所以官方基准裸用没问题但你换 Linear 或 MLP 时训练链和推理链必须一致否则上线推理的数据分布和训练时完全对不上。⚠️坑二标签不是当天收益。标签表达式Ref($close, -2)/Ref($close, -1) - 1里第 t 天的标签是 t1 到 t2 的收盘收益t 天出分数TopkDropout 策略 t1 才买入。如果你把标签改成$close/Ref($close, 1) - 1t 到 t1回测的成交时点和预测时点整体错位一天IC 曲线看着像实际成交逻辑已经变了。⚠️坑三用了 fit 类处理器却不给 fit 时间直接断言失败。check_transform_proc()会检查每个处理器的签名发现 ZScoreNorm 这类带fit_start_time参数的处理器没配时间就抛Make sure fit_start_time and fit_end_time are not None。这是有意为之的防护不是 bug——配了 fit 时间标准化参数才不会用到测试段的信息。动手跑通从一次 fetch 到 qrun 全流程最小可运行示例先准备数据约 300MB 的 A 股日线落到~/.qlib/qlib_data/cn_datapython scripts/get_data.py再跑一个最小验证脚本前置依赖已pip install pyqlib且数据就绪import qlib from qlib.constant import REG_CN from qlib.contrib.data.handler import Alpha158 qlib.init(provider_uri~/.qlib/qlib_data/cn_data, regionREG_CN) # 必须先 init 再取数 handler Alpha158(instrumentscsi300, start_time2008-01-01, end_time2020-08-01) feat handler.fetch(col_setfeature, data_keyinfer) print(feat.shape) # 约 90 万行(300 只股票 x 12 年) x 158 列 print(list(feat.columns[:9])) # KMID KLEN KMID2 KUP KUP2 KLOW KLOW2 KSFT KSFT2确认 shape 和列名对得上再跑端到端训练 回测qrun examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml这份 config 就是上面三块拼起来data_handler_confighandler 参数segments切分record三个记录器SignalRecord 存预测、SigAnaRecord 算 IC/ICIR、PortAnaRecord 跑 TopkDropout 回测topk50、n_drop5、买佣 0.05%、卖佣 0.15%。跑完在 mlflow 实验记录里取指标。3 种常见变体变体改动方式适用场景换股票池instrumentscsi500想要更大样本换执行价标签改用Alpha158vwap对齐 vwap 成交口径加长滚动窗口rolling.windows改 [10,20,40,60,120]看中周期形态换原始序列改用Alpha360序列模型吃 60 日原始价扩展思路不写子类也能改因子池关键 API 是Alpha158DL.get_feature_config(config)它接受一个 4 个开关的配置字典kbar、price、volume、rolling。加量价原始特征、排除某个算子都在这一个字典里完成from qlib.contrib.data.loader import Alpha158DL config { kbar: {}, price: {windows: [0], feature: [OPEN, HIGH, LOW, VWAP]}, volume: {windows: [0, 1, 2, 3, 4]}, # 新增 5 个原始量特征 rolling: {windows: [5, 10, 20, 30, 60], exclude: [RANK]}, # 排除 RANK } fields, names Alpha158DL.get_feature_config(config) print(len(names)) # 163 158 5把config塞给QlibDataLoader或子类化Alpha158重写get_feature_config返回它两条路都行前者改动最小。搭配与验证Qlib Alpha158 与 LightGBM 等组合验证环节不用自己写回测脚本qrun的 record 链已经把流程封死了项目里现成可跑的 Alpha158 基准配置examples/benchmarks/下条件均为 csi300、train 2008-2014、valid 2015-2016、test 2017-01 至 2020-08组合特征配置配置文件定位LightGBM Alpha158158 因子benchmarks/LightGBM树模型主力XGBoost Alpha158158 因子benchmarks/XGBoost与 LGB 对照Linear Alpha158158 因子benchmarks/Linear基线检验因子池有无信号Transformer Alpha158158 x 1 窗口benchmarks/Transformer序列建模路线具体的 IC、年化、回撤数字以你自己qrun后的 record 输出为准不同版本数据更新后会有出入同因子池下树模型与序列模型各占一档线性基线的作用是先确认这 158 个因子在你手上这份数据里到底有没有截面信号。信号端的 IC 报告长这样来源Qlib 官方 analysis 模块输出示例图csi300、252 交易日年化回测端由 PortAnaRecord 生成的组合报告持仓、累计收益、风险指标一页出全边界与替代Alpha158 什么时候不够用它不擅长什么信息面只有价量。158 个因子全部从 open/high/low/close/volume 推导不含基本面、财报、舆情。如果你的策略逻辑依赖PE 从 15 倍回到 10 倍这类信息Alpha158 里没有这一列。时间视野最长默认 60 天。滚动窗口默认封顶 60 天研究半年到一年尺度的结构变化时信息量有限。可以扩窗口但训练段要够长才撑得住 120 天以上的滚动算子。特征本身默认不做截面标准化。默认 learn_processors 只对 label 做 CSZScoreNorm特征列保持原始量纲——对树模型无所谓对线性模型就是坑见上文坑一。何时该换方案序列模型GRU/LSTM/Transformer需要 60 天原始价格输入 → 换Alpha36060 天 x 6 字段用最新收盘价归一化CLOSE0 恒为 1。分钟级或订单簿数据 → 换highfreq_handler见examples/highfreq/。非 A 股市场或自建数据源 → 自定义QlibDataLoader 自配 instrumentsAlpha158 的表达式语法照样能用。判断阈值给一条简单的数据频率低于日频或你要用的特征窗口超过 60 天就离开 Alpha158反之它够用别先造轮子。3 个高频问题问默认配置直接训真的没问题吗 答分模型。树模型LightGBM/XGBoost对特征尺度不敏感官方基准就是裸推理链在跑可以直接用。Linear 和 MLP 不行KMID 系量级在 0.0x、RANK 系在 0~1 之间不标准化会让梯度被大量纲列主导先加 ProcessInf ZScoreNorm Fillna 再谈效果。问加了新因子回测反而变差了先查什么 答先拆两层。一层看 SigAnaRecord 里新旧因子池的 IC/ICIR 变化——如果 IC 没动问题不在因子再一层看模型的 feature_importances_新因子没拿到权重说明它和现有 158 列高度共线。经验上日频因子 |IC| 长期低于 0.02 时大概率是噪声而不是模型不行。问Alpha158 和 Alpha360 到底怎么选 答158 是人加工好的每列含义明确、可直接做特征重要性归因360 是把 60 天原始价量序列原样喂给模型让模型自己找模式代价是参数量更大、更容易过拟合且特征不可解释。做归因分析选 158做序列建模选 360。下一步今天就可以做的 3 件事跑python scripts/get_data.py拉好 A 股数据再用上面的最小脚本 fetch 一次确认 shape 是约 90 万行 x 158 列。qrun官方 LightGBM 配置把 SigAnaRecord 输出的 IC、ICIR 和 PortAnaRecord 的年化、最大回撤抄下来当基线。给 handler 的 infer_processors 加上 ZScoreNorm Fillna改用 Linear 配置重跑同一份数据对比基线掉多少——这一组对照能验证你对坑一的理解。 进阶方向因子会随市场结构变化而衰减可以接qlib/contrib/rolling/的滚动机制每半年重训一次观察 IC 的时间衰减曲线再决定要不要扩因子池。收尾命令直接复制运行qrun examples/benchmarks/LightGBM/workflow_config_lightgbm_Alpha158.yaml【免费下载链接】qlibQlib is an AI-oriented Quant investment platform that aims to use AI tech to empower Quant Research, from exploring ideas to implementing productions. Qlib supports diverse ML modeling paradigms, including supervised learning, market dynamics modeling, and RL, and is now equipped with https://github.com/microsoft/RD-Agent to automate RD process.项目地址: https://gitcode.com/GitHub_Trending/qli/qlib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表