一、Quant Signal Factory:基础设施升级与自动化
项目:FM_trade 生态 — Quant Signal Factory 信号工厂核心引擎:RD-Agent 0.8.0 + Qlib 0.9.7(LLM 因子挖掘 → 回测评估 → 信号导出)
上周完成工程化收口(4 个 P0 + 3 个 P1 + 双栈合并),本周重心转向基础设施升级与自动化落地:Qlib 0.9.7 双端适配、RD-Agent WSL2 迁移、日频+周频定时任务全量注册。
本周建设总览
qlib_compat.py 兼容层封装 API 差异 | |
P0:Qlib 0.9.7 API 适配 — 双端完成
背景:Qlib 0.9.7 的 D.features()、D.instruments()、DataHandlerLP 与 0.8.x 存在 breaking changes,factor-lab 和 quant-signal-factory 两端代码均受影响。
方案:创建 qlib_compat.py 兼容层,封装 0.9.7 API 差异,对外提供 0.8.x 兼容接口。
factor-lab(WSL2)端:
init_qlib()get_features() / get_features_raw() / get_instruments() / forward_returns() | |
validator.pyrd_runner.py / api_server.py / pit_handler.py / paper_extractor.py(5 个) | |
_load_dotenv()parent.parent.parent 改为 parent.parent | |
quant-signal-factory(Windows)端:
alpha_signals.pypit_handler.py / adapter.py / signal_generator.py(4 个) | |
adapter.pyinit_qlib 改为 qlib_compat.init_qlib | |
Validator 表达式模式修复:
策略 3 从 exec 包装改为 eval() 闭包,以 DataFrame 为 locals。裸列名表达式 close / (close.shift(20) + 1e-8) - 1 现在可直接使用——函数式与表达式式 IC 完全一致(IC=-0.0089, ICIR=-0.0221)。
P0:RD-Agent WSL2 迁移完成
背景:factor-lab(RD-Agent + 论文因子挖掘 + 验证器)原在 Windows 端的 quant-signal-factory 中,需迁移到 WSL2 以利用原生 Linux 环境。
/home/user/factor-lab/(WSL2) | |
paper_store.json | |
start-factor-lab.ps1-u root 改为默认用户(修复 .env 加载失败) | |
P1:自动化任务编排 — 日频 + 周频
日频管线(6 个任务,已有):
周频管线(2 个任务,W34 新增):
设计要点:
周六研究不依赖实时行情,避免占用交易时间 周一盘前 08:00 先于 08:05 日频管线,确保新因子进入当日信号 内置容错:factor-lab 不可达时自动重启,超时优雅退出 内置星期判断:非周六/周一自动跳过,安全幂等 - 8 个任务全部注册到 Task Scheduler
,状态 Ready,已配置"无论用户是否登录均运行"
P1:代码清理与管线修复
删除已迁移文件(7 个):config/papers.yaml、config/rd_agent.yaml、src/factors/rd_runner.py、src/factors/paper_miner.py、src/factors/combiner.py、src/data/fundamental.py — 全部已迁移到 factor-lab。
新增文件:
src/factor_lab_client.py | |
tests/test_alpha_signals.py | |
tests/test_wind_bridge.py | |
scripts/run-data-update.ps1 | |
scripts/run-signal-factory.ps1 |
管线修复:run-signal-factory-pipeline.ps1 添加 PYTHONIOENCODING=utf-8,修复 Windows GBK 编码导致的 emoji 报错。
当前能力总览
截至 W34,Quant Signal Factory 能力矩阵:
当前限制:
二、沉淀
🔧 兼容层模式:用一层抽象隔离上游 Breaking Changes
Qlib 0.9.7 的 API 变更影响了 factor-lab 和 quant-signal-factory 两端的 9 个文件。没有逐文件改,而是创建 qlib_compat.py 兼容层,对外暴露 0.8.x 风格接口。
好处:未来 Qlib 再升级,只需改兼容层一个文件;上层业务代码零改动。
通用规则:当上游依赖频繁出现 breaking changes 时,引入兼容层(Adapter Pattern)是比"逐文件适配"更可持续的方案。代价是多一层间接调用,但换来的是升级成本的常数化——从 O(文件数) 降为 O(1)。
🐧 WSL2 迁移:让 Linux-first 框架回归原生环境
RD-Agent 是 Linux-first 的研究框架,Windows 端跑需要大量补丁(上周的 7 层补丁体系)。本周把 factor-lab 整体迁移到 WSL2 后:
DeepSeek API 调用链路一次跑通,不再有 Windows 端的超时问题 论文路径从反斜杠修正为正斜杠,JSON 解析不再报错 .env加载失败问题(root 用户 vs 默认用户)一次修复
通用规则:当一个工具链在设计上是 Linux-first 的,与其在 Windows 上打补丁维持,不如迁移到 WSL2 回归原生环境。补丁是债务,迁移是还债。
⏰ 定时任务编排:日频 + 周频的时序设计
周频任务的时间设计有两个关键约束:
- 周六研究
不依赖实时行情 → 可以慢跑 DeepSeek 论文挖掘,不占用交易时间 - 周一计算
先于日频管线 → 新因子在周一开盘前就进入信号
这种"研究→计算→日频消费"的三段式时序,本质上是把因子生产链拆成异步阶段,每个阶段的输出作为下一阶段的输入,时间上完全解耦。
通用规则:定时任务编排不只是"几点跑什么",而是要设计数据依赖的时序拓扑。下游任务必须在上游任务完成后启动,否则会拿到过期数据。
🎯 坑→规则转化率持续 100%
本周 2 个 P0(Qlib 适配 + WSL2 迁移)+ 2 个 P1(自动化编排 + 代码清理)全部产出可执行方案。技术债务也清晰记录(两份 qlib_compat.py 待统一、SingleStockSignalStrategy 重复定义待合并、论文因子与 FactorStore 待打通),不积压不掩盖。
*— 记录于 2026.08.22*
夜雨聆风