知识
← 返回

Qlib-Skill-设计方案与施工方案

2026-05-15 金融
#金融 #股票研究

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 基建工作(搭建目录结构 + 数据下载)。