Qlib-Skill-设计方案与施工方案
#金融
#股票研究
Qlib-Skill 设计方案与施工方案
文档类型: 架构设计 + 施工方案
创建时间: 2026-05-15
目标: 在 OpenClaw 生态内搭建 Qlib 量化回测 Skill,实现”发散 → 收敛”的策略验证流程
一、背景与目标
1.1 业务需求
- 查 A 股数据(沪深 300、中证 500 等成分股)
- 支持跑多个策略(多支股票、多因子组合)
- 支持定期轮训(滚动回测、参数再优化)
- 在一定周期后返回收益指标(夏普、回撤、胜率等)
- 从 N 个策略中找到最优策略或最优组合
1.2 核心挑战
- 回测可信度: 过拟合、未来函数、幸存者偏差
- 策略多样性: LLM 驱动的专家容易输出同质化策略
- 时间周期性: 市场状态切换导致策略失效
二、架构定位:为什么选 Skill
2.1 为什么不选 Tool
Qlib 的工作流是连贯的:
下载数据 → 定义因子 → 配置策略 → 回测 → 评估 → 对比排名
如果拆成独立 Tool,每次调用状态不继承,数据下载完下次得重新下,策略参数散落在多次调用里,错误处理也很复杂。
2.2 为什么不塞进金融专家
金融专家的职责是分析 + 建议(出主意),Qlib 的职责是验证(跑实验)。两者混在一起会导致:
- 专家 prompt 膨胀到难以维护
- 回测代码出错时,专家不知道该修代码还是换策略
- 容器变得臃肿
2.3 Skill 的优势
| 维度 | 说明 |
|---|---|
| 封装完整工作流 | 从数据准备到策略对比,一键跑完 |
| 状态管理 | 已下载的股票列表、已定义的策略库、回测结果缓存 |
| 解耦协作 | 专家出主意,Qlib 验证,接口干净 |
| 可复用 | 不局限于金融专家,任何 agent 都可调用 |
三、目录结构
skills/qlib-backtest/
├── SKILL.md # Skill 元信息 + prompt
├── README.md # 使用文档
├── config/
│ ├── default_config.yaml # 默认回测参数
│ └── stock_pools.yaml # 股票池定义(沪深300、中证500等)
├── scripts/
│ ├── data_manager.py # 数据下载 + 缓存管理
│ ├── strategy_parser.py # 把自然语言策略翻译成 Qlib 代码
│ ├── batch_runner.py # 批量回测主入口
│ ├── evaluator.py # 绩效评估 + 排名
│ ├── report_generator.py # 生成 Markdown/图表报告
│ └── regime_analyzer.py # 市场状态分析(牛/熊/震荡)
├── templates/
│ ├── alpha_template.py # 单因子策略模板
│ ├── model_template.py # 机器学习模型模板
│ └── strategy_template.py # 完整策略模板
├── state/
│ ├── downloaded_stocks.json # 已下载股票列表
│ ├── strategy_library.json # 策略库(描述 + 代码 + 参数)
│ └── backtest_results/ # 回测结果缓存
└── tests/
└── test_sample.py # 示例测试
四、核心工作流:四阶段”发散 → 收敛”
Stage 1: 发散 —— 专家大量输出策略想法
输入: 用户的投资目标或方向(如”想做 A 股多因子选股”)
输出: 20-30 个策略描述(自然语言)
Prompt 模板(给金融专家用):
请基于你对 A 股市场的理解,提出 20 个不同的量化策略思路。
要求:
- 每个策略用一句话描述核心逻辑
- 尽量覆盖不同类型的交易逻辑:
* 技术面(动量、反转、突破、趋势跟踪)
* 基本面(价值、成长、质量、低波动)
* 量价关系(放量、缩量、异常波动)
* 资金流(北向、融资融券、主力资金)
* 事件驱动(财报、分析师评级、政策)
* 情绪面(舆情、恐慌指数、散户情绪)
- 允许大胆、非常规的想法
- 避免重复,确保逻辑上真正不同
Stage 2: 去重聚类 —— 合并同类项
输入: 20-30 个策略描述
输出: 12-15 个真正不同的策略方向
聚类规则:
"5日均线金叉10日均线" 和 "10日均线金叉20日均线"
→ 同类(均线动量),只留一个
"MACD底背离买入" 和 "RSI超卖反弹"
→ 同类但逻辑不同(MACD vs RSI),保留
"北向资金连续3日净流入" 和 "融资融券余额增加"
→ 同类但数据源不同,保留
脚本逻辑 (strategy_parser.py):
- 用 sentence-transformer 计算策略描述的语义相似度
- 相似度 > 0.8 的合并
- 输出每类的代表性策略
Stage 3: 回测验证 —— 分状态 + out-of-sample
输入: 12-15 个去重后的策略
输出: 每个策略在训练集、验证集、测试集上的表现
数据切分:
2018-2020: 训练集(策略设计 + 参数调优)
2021-2022: 验证集(第一次见这些数据,模拟实盘)
2023-2024: 测试集(最终验收)
市场状态切分:
2015 股灾期 → 看抗跌能力
2019-2021 成长牛 → 看进攻能力
2022-2024 震荡市 → 看稳定性
2024 下半年高股息 → 看风格适应性
关键指标:
- 年化收益率
- 夏普比率(> 1 为达标)
- 最大回撤(< 20% 为达标)
- 胜率、盈亏比、Calmar 比率
- 信息系数 IC(因子有效性)
Stage 4: 组合优化 —— 不赌单策略
输入: 验证集表现达标的策略(假设 6-8 个)
输出: 最优策略组合 + 动态权重
组合逻辑:
# 不选收益最高的单一策略
# 而是选相关性低的几个人组一个队
策略 A: 趋势跟踪(牛市赚、熊市亏)
策略 B: 均值反转(震荡市赚、趋势市亏)
策略 C: 基本面质量(长期稳、爆发弱)
组合后 → A 亏的时候 B 可能赚,整体曲线更平滑
权重优化: 用风险平价或均值方差优化,定期再平衡。
五、关键脚本设计
5.1 data_manager.py —— 数据管家
"""
职责:
- 下载 A 股日线/分钟线数据
- 管理数据缓存,避免重复下载
- 维护股票池(沪深300、中证500、自定义)
"""
import qlib
from qlib.data import D
STOCK_POOLS = {
"hs300": "SH000300", # 沪深300
"zz500": "SH000905", # 中证500
"zz1000": "SH000852", # 中证1000
"custom": [...] # 自定义列表
}
def ensure_data(stock_pool="hs300", start_date="20180101", end_date="20241231"):
"""确保指定股票池的数据已下载,未下载则自动拉取"""
...
def get_instruments(stock_pool="hs300"):
"""返回股票池内的股票代码列表"""
...
5.2 strategy_parser.py —— 策略翻译官
"""
职责:
- 接收自然语言策略描述
- 翻译成 Qlib 可执行的 Alpha/Model/Strategy 代码
- 生成标准化的策略配置文件
"""
# 示例:把"均线金叉"翻译成 Qlib Expression
SIMPLE_TRANSLATIONS = {
"5日均线金叉10日均线": "($close_5/$close_10)>1",
"MACD底背离": "($macd-$macd_signal)<0 & ($macd>$macd_1) & ($close<$close_1)",
# ...
}
def parse_strategy(description: str) -> dict:
"""
输入: "当5日均线突破10日均线时买入,配合成交量放大"
输出: {
"alpha": "($close_5/$close_10)>1 & ($volume>$volume_mean_20)",
"model": "LGBModel",
"strategy": "TopkDropoutStrategy"
}
"""
...
5.3 batch_runner.py —— 批量回测引擎
"""
职责:
- 接收策略列表,批量跑回测
- 支持并行(多进程加速)
- 输出原始结果(收益率序列、持仓记录)
"""
def batch_backtest(strategies: list, stock_pool="hs300",
train_period=("2018-01-01","2020-12-31"),
valid_period=("2021-01-01","2022-12-31"),
test_period=("2023-01-01","2024-12-31")):
"""
对多个策略分别跑训练/验证/测试
返回每个策略在每个阶段的表现
"""
...
5.4 evaluator.py —— 绩效裁判
"""
职责:
- 计算夏普比率、回撤、胜率等指标
- 分市场状态评估(牛/熊/震荡)
- 策略间相关性分析
- 输出排名榜单
"""
def evaluate(strategy_results: dict) -> pd.DataFrame:
"""
返回每个策略的指标矩阵:
| 策略 | 训练夏普 | 验证夏普 | 测试夏普 | 最大回撤 | 牛市区间收益 | 熊市区间收益 | 震荡区间收益 |
"""
...
def rank_strategies(metrics_df: pd.DataFrame) -> pd.DataFrame:
"""综合排序,优先看验证集表现(out-of-sample)"""
...
5.5 regime_analyzer.py —— 市场状态分析
"""
职责:
- 识别历史数据中的市场状态(牛市/熊市/震荡市)
- 为分状态回测提供切分点
"""
def detect_regimes(price_series, method="hmm"):
"""
用 HMM(隐马尔可夫模型)或简单均线法识别市场状态
返回每个日期对应的状态标签
"""
...
六、与 OpenClaw 的集成方式
6.1 调用入口
OpenClaw 通过 exec 工具调用 Qlib Skill 的主脚本:
# 完整流程(发散 → 收敛)
python3 skills/qlib-backtest/scripts/full_pipeline.py --stage all --stock-pool hs300 --strategy-input /tmp/expert_strategies.json --output /tmp/qlib_report.md
# 仅回测(已有策略代码)
python3 skills/qlib-backtest/scripts/batch_runner.py --config /tmp/strategies.yaml --output /tmp/results.json
6.2 和专家的协作流程
用户: "帮我设计一套 A 股多策略组合"
│
▼
[OpenClaw] 调金融专家
│
├── 专家输出 20 个策略描述 → 存到 /tmp/expert_strategies.json
│
▼
[OpenClaw] 调 Qlib Skill
│
├── Step 1: strategy_parser 去重聚类 → 15 个策略
├── Step 2: data_manager 下载数据
├── Step 3: batch_runner 批量回测
├── Step 4: evaluator 评估排名
├── Step 5: report_generator 出报告
│
▼
[OpenClaw] 把报告展示给用户
│
├── 文字总结:哪个策略验证集夏普最高
├── 图表:收益曲线对比、回撤对比
├── 建议:推荐组合配置 + 风险提示
七、施工计划(分阶段落地)
Phase 1: 基建(Week 1)
- [ ] 安装 Qlib 及依赖(已安装于 ywz-local-fin 镜像)
- [ ] 初始化数据目录,下载沪深300日线数据(2018-2024)
- [ ] 搭建 Skill 目录结构
- [ ] 实现 data_manager.py(数据下载 + 缓存)
Phase 2: 策略翻译(Week 1-2)
- [ ] 实现 strategy_parser.py(自然语言 → Qlib 代码)
- [ ] 建立常见策略模板库(均线、MACD、RSI、基本面等)
- [ ] 测试 5-10 个已知策略的回测结果,验证准确性
Phase 3: 回测引擎(Week 2)
- [ ] 实现 batch_runner.py(支持多策略并行回测)
- [ ] 实现 evaluator.py(夏普、回撤、胜率、IC 等指标)
- [ ] 实现 regime_analyzer.py(市场状态识别)
- [ ] 支持训练/验证/测试集切分 + 滚动回测
Phase 4: 报告与集成(Week 3)
- [ ] 实现 report_generator.py(Markdown + 图表)
- [ ] 和 OpenClaw 集成测试(从专家出策略到报告输出端到端)
- [ ] 保存报告到思源知识库
Phase 5: 优化(Week 4)
- [ ] 加入交易成本(印花税 0.05%、佣金、滑点)
- [ ] 策略组合优化(风险平价 / 均值方差)
- [ ] 实盘模拟(paper trading)
- [ ] 性能优化(大数据量并行计算)
八、风险提示与缓解措施
| 风险 | 说明 | 缓解措施 |
|---|---|---|
| 过拟合 | 策略恰好拟合历史随机波动 | 强制 out-of-sample 验证、限制参数搜索空间 |
| 未来函数 | 回测中用了未来才知道的信息 | 数据切分严格按时间顺序、代码审计 |
| 因子衰减 | 过去有效的因子未来失效 | 滚动再训练、实时监控 IC 衰减 |
| 策略同质化 | 专家输出相似策略 | 发散阶段不限制类型、聚类去重 |
| 市场状态切换 | 牛市有效的策略熊市失效 | 分状态回测、构建多策略组合 |
| 计算资源不足 | 大量策略回测耗时 | 多进程并行、缓存中间结果 |
九、附录
9.1 参考资源
- Qlib 官方文档: https://qlib.readthedocs.io/
- Qlib GitHub: https://github.com/microsoft/qlib
- Qlib A 股教程: CSDN/知乎搜 “qlib A股”
9.2 关键依赖
qlib >= 0.9.0
pandas >= 1.5.0
numpy >= 1.21.0
lightgbm >= 3.3.0
matplotlib >= 3.5.0
scikit-learn >= 1.0.0
sentence-transformers >= 2.0.0 # 用于策略去重
9.3 股票池定义示例
# config/stock_pools.yaml
stock_pools:
hs300:
name: "沪深300"
benchmark: "SH000300"
count: 300
zz500:
name: "中证500"
benchmark: "SH000905"
count: 500
zz1000:
name: "中证1000"
benchmark: "SH000852"
count: 1000
active_50:
name: "自选活跃股"
symbols:
- "SH600519" # 茅台
- "SZ000858" # 五粮液
- "SH601318" # 平安
# ...
下一步行动: 等用户确认方案后,开始 Phase 1 基建工作(搭建目录结构 + 数据下载)。