把微软 qlib 的真实源码当教材,从
.bin存储一直读到回测与在线服务,逐层拆解一个工业级 AI 量化平台是怎么设计的;同时提炼一套读任何大型框架都能用的方法论。
本篇对应课程:qlib 源码解剖 + AI 量化平台对比(共 26 讲)。系列总纲见 量化工程能力知识图谱与学习路线。 顶层总路径见 量化投资学习路径图。参考源码(本课无教材,教材即框架源码本身)
- qlib(微软 AI 量化平台)· 源码 https://github.com/microsoft/qlib
为什么要学这块
到了这一层,问题不再是”用哪个算法””怎么调参”,而是”一个能长期维护、能被别人扩展的量化平台,代码结构该长什么样”。qlib 是目前开源里结构最完整的一个:数据存储、因子表达式、特征工程、模型库、工作流、策略回测、在线服务全都有,且被工业界实际使用。读懂它,等于把前几门课学到的因子、回测、模型全部串成一条能跑通的流水线,也让你有能力照着搭自己的研究平台,而不是每次都从零拼脚本。
这一篇的角度:读框架五步法 + 逐层深剖
市面上关于 qlib 的内容大多是”使用教程”——怎么写 YAML、怎么跑 qrun、怎么换模型。这套课不一样:它把源码本身当教材,逐层解剖每个模块的核心类、调用链和设计取舍,并且把最核心的思想用 100 行以内的可跑代码复刻出来(迷你表达式引擎、窗口延展、反射工厂、TopkDropout 核心逻辑)。
更重要的是,第 01 讲提炼的读框架五步法不止用于 qlib,读任何大型开源项目都通用:
- 找入口——从命令行 / 主函数出发,别一头扎进某个文件;
- 追一条数据的去向——挑一条真实数据(一根 K 线、一个因子值),跟着它从磁盘走到最终报告;
- 读继承树——看核心基类和它的子类,抽象方法就是这个框架给你留的”填空题”;
- 认设计模式——组合、模板方法、反射工厂、门面这些一旦认出来,一大片代码就能一眼看懂;
- 划边界——分清哪些是框架定的契约(core),哪些是可替换的实现(contrib)。
这五步是本篇最值得单独拎出来的部分,把它练熟,之后读 pandas、PyTorch、任何大型代码库都省一大半力气。
你会学到什么(按七层架构对应讲次)
qlib 源码可以理解成七层,从地基到应用逐层往上:
导论与地图(第 01–03 讲)
- 七层架构总览 + 读框架五步法 + 两大设计基因(配置驱动+反射、表达式 DSL)—— 第 01 讲
- 模块全景与协作:四大门面(D/R/Operators/init)、单向依赖铁律、core 契约 vs contrib 实现 —— 第 02 讲
- 跑通
qrun:从一份 YAML 到一张绩效报告的完整调用链 —— 第 03 讲
数据层(第 04–07 讲,qlib 最有特色的一层)
-
.bin扁平二进制存储、calendar/instruments 对齐、为何不用数据库、PIT 点数据防前视 —— 第 04 讲 - 表达式引擎(上):
Expression/Feature/Ops类体系、运算符重载、正则解析 +eval建树 —— 第 05 讲 - 表达式引擎(下):递归惰性求值、窗口延展防前视、未来标签与前视的边界 —— 第 06 讲
- 缓存系统:内存
H+DiskExpressionCache+DiskDatasetCache三级缓存、缓存键归一化、文件锁并发 —— 第 07 讲
数据集与特征 Handler(第 08–10 讲)
-
DataHandlerLP:learn/infer 双管道防泄露(DK_R/I/L 三份数据)、Processor 管道 —— 第 08 讲 -
Alpha158解剖:158 个因子怎么用表达式批量拼串生成、标签构造与前视分析 —— 第 09 讲 -
DatasetH/TSDatasetH:数据集切分、TSDataSampler零拷贝滑窗 —— 第 10 讲
模型库(第 11–13 讲)
-
Model基类契约 +init_instance_by_config反射工厂 —— 第 11 讲 -
LGBModel解剖:怎么把 LightGBM 包成契约类、fit/predict/早停 —— 第 12 讲 - 深度模型统一封装(LSTM/GRU/TCN/Transformer)+ DDG-DA 元学习抗漂移 —— 第 13 讲
工作流与实验管理(第 14–15 讲)
-
qrun全链路:init_instance_by_config如何递归实例化整条 pipeline、RecordTemp 三兄弟 —— 第 14 讲 - Recorder / MLflow:R 门面四层结构、
R.start()、artifact、结果可复现 —— 第 15 讲
策略与回测(第 16–19 讲)
- 回测框架总览:
Exchange/Order/Account/Position对象分工,与 backtrader 对比 —— 第 16 讲 -
TopkDropoutStrategy解剖:signal → 排序 → topk → dropout 换手控制 → Order 列表 —— 第 17 讲 - 嵌套决策执行(nested):日频套高频,qlib 独有设计 —— 第 18 讲
- 绩效分析
risk_analysis:年化、IR、回撤逐行拆解 —— 第 19 讲
强化学习与在线(第 20–21 讲)
-
qlib.rl:把订单执行建成 RL(Simulator/Interpreter/Reward 四零件解耦),与 FinRL 对比 —— 第 20 讲 -
OnlineManager:滚动训练、模型自动更新 —— 第 21 讲
横向对比其它平台(第 22–26 讲)
- FinRL 架构解剖:env-agent-market 三层、RL-first vs qlib 的 pipeline-first —— 第 22–23 讲
- RD-Agent 解剖:LLM 自动做因子研发、因子如何回写 qlib 闭环 —— 第 24–25 讲
- 三平台架构对比 + 给 qlib 加自定义组件 + 搭自己的研究平台的检查清单 —— 第 26 讲
几个亮点(真实结论 / 硬数据)
- 读框架五步法(第 01 讲):找入口 / 追一条数据 / 读继承树 / 认模式 / 划边界,把上万行源码变成一张可导航、可循迹的地图。这套方法跨框架通用,是本篇最能破圈的部分。
-
表达式 DSL 用
eval建树(第 05 讲):$close/Ref($close,1)-1这样的字符串,qlib 用正则改写 + Pythoneval直接建成Expression对象树,再靠运算符重载和惰性递归求值。课上用 100 行代码复刻了一个迷你版,把”字符串到算子树”的机制跑通。 - 缓存实测 2.7 万倍加速(第 07 讲):同一个因子第二次取,命中三级缓存后相比重新计算约有 2.7 万倍的加速;缓存键归一化和文件锁并发是这套机制能可靠复用的关键。
-
配置驱动 + 反射(第 11 / 14 讲):
init_instance_by_config用importlib+getattr把一段 YAML 变成真实对象;qrun的”递归实例化”其实是DatasetH.__init__里再次调用它形成的——课上把这条递归链逐层追清楚,并手搓了一个迷你反射工厂。 -
回测撮合与源码分毫对上(第 16 讲):把
Exchange的成交价、费用、涨跌停逻辑逐行读透后,手算的撮合费用与 qlib 真跑结果完全一致;并与 backtrader 的事件循环做了正面对比。
建议的阅读顺序
先看地图,再从数据层往上逐层读,最后看横向对比。
- 第 01 讲:为什么解剖 qlib,架构总览与读源码方法论——先拿到七层地图和五步法。
- 第 03 讲:跑通第一个 qrun,从 YAML 到绩效报告——先把整条流水线跑起来、看清全景。
- 第 05 讲:表达式引擎(上),类体系与解析建树 与 第 06 讲:递归求值与窗口延展防前视——qlib 最有特色的一层,值得慢读。
- 第 07 讲:缓存系统——理解那 2.7 万倍加速从哪来。
- 第 11 讲:Model 基类与反射工厂 与 第 14 讲:qrun 全链路递归实例化——把”配置驱动”这条基因彻底吃透。
- 第 16 讲:回测框架总览,对比 backtrader 与 第 17 讲:TopkDropoutStrategy 解剖——从信号一路读到订单。
- 有余力再看 第 24 讲:RD-Agent 解剖(上) 与 第 26 讲:三平台对比与搭自己的研究平台——跳出 qlib 看不同架构哲学。
承上启下
上一层 【工程·研究篇】机器学习算法与量化应用 用 ML4T 搭起因子、回测、组合的金融脚手架,其中深剖 backtrader 是读源码最深的一次;本篇把这份能力正式兑现——从读一个组件的源码,升级到读懂并能扩展一整个平台。往后走,下一层 【工程·工程篇】用 MLflow 把量化研究工程化 把研究做成可追踪、可复现、可上线的流水线;【工程·进阶篇】 再看 RD-Agent 怎么用 LLM 把因子研发闭环自动化。完整地图见 量化工程能力知识图谱与学习路线。