diff --git a/.dockerignore b/.dockerignore index e512079..81a96ff 100644 --- a/.dockerignore +++ b/.dockerignore @@ -27,7 +27,6 @@ docs/*_repair_ledger_*.md docs/first_principles_review_*.md # Untracked local drafts living under COPY'd dirs -docs/getting_started_zh.md docs/research_platform_optimization_from_vibe_quantgpt.md # Local machine setup material at the context root diff --git a/README.md b/README.md index 4d9eafb..d141c09 100644 --- a/README.md +++ b/README.md @@ -405,6 +405,7 @@ Read the full bilingual guide: 阅读完整双语手册: +- [新手入门指南 / Beginner's Guide (中文, 图文并茂)](docs/getting_started_zh.md) - [User Manual / 使用手册](docs/USER_MANUAL.md) - [Architecture / 架构说明](docs/architecture.md) - [Configuration Reference / 配置参考](docs/configuration.md) diff --git a/docs/getting_started_zh.md b/docs/getting_started_zh.md new file mode 100644 index 0000000..1a76c77 --- /dev/null +++ b/docs/getting_started_zh.md @@ -0,0 +1,737 @@ +# Quant Forge OpenSource · 新手入门指南 + +> 从 0 开始,一步步跑通你的第一个量化因子,并**真正看懂系统在背后做了什么**。 +> 本指南面向**完全没有基础**的读者 —— 不需要你会编程、也不需要你懂量化,跟着做就行。 +> 文中所有界面文字、指标、数值都来自对当前版本的**真实实操**,不是示意。 + +--- + +## 目录 + +1. [这个软件是干什么的](#1-这个软件是干什么的) +2. [先搞懂 7 个词(零基础必读)](#2-先搞懂-7-个词零基础必读) +3. [准备工作:你需要什么](#3-准备工作你需要什么) +4. [安装:两条路,任选一条](#4-安装两条路任选一条) +5. [第一次启动 & 控制令牌](#5-第一次启动--控制令牌) +6. [界面导览:每个地方是干嘛的(含模式切换真相)](#6-界面导览每个地方是干嘛的含模式切换真相) +7. [实战:挖出你的第一个因子](#7-实战挖出你的第一个因子) +8. [⭐ 幕后揭秘:点"开始研究"后系统到底做了什么](#8--幕后揭秘点开始研究后系统到底做了什么) +9. [看懂结果:每个指标怎么读(中英对照)](#9-看懂结果每个指标怎么读中英对照) +10. [进阶:样本内 vs 样本外](#10-进阶样本内-vs-样本外) +11. [进阶:接入 AI,用一句话生成因子](#11-进阶接入-ai用一句话生成因子) +12. [进阶:让 AI 自动帮你挖因子(RD)](#12-进阶让-ai-自动帮你挖因子rd) +13. [新手最容易卡住的 8 个点](#13-新手最容易卡住的-8-个点) +14. [常见问题](#14-常见问题) +15. [附录 A:命令速查表](#附录-a命令速查表) +16. [附录 B:术语表(中英对照)](#附录-b术语表中英对照) +17. [许可证说明](#许可证说明) + +--- + +## 1. 这个软件是干什么的 + +一句话:**它帮你把"选股想法"变成"可以验证的因子",并在历史数据上检验这个想法到底有没有用。** + +举个例子。你有一个直觉:"小盘股比大盘股涨得好"。Quant Forge 能帮你: + +```mermaid +flowchart LR + A["💡 一句话想法
小盘股涨得好"] --> B["📐 变成因子公式
-rank(market_cap)"] + B --> C["📊 打分评价
这个想法准不准?"] + C --> D["💰 模拟回测
照这个买卖能赚多少?"] + D --> E["📄 生成报告
结论 + 图表"] +``` + +**它能做的:** + +| 能力 | 说明 | +| --- | --- | +| 自然语言转因子 | 输入一句话想法或一段研报文字,自动变成因子公式 | +| 本地数据验证 | 在你自己电脑上的历史数据上跑,不联网上传数据 | +| 因子评价 | 算出 Rank IC、ICIR、覆盖率等"这个因子准不准"的指标 | +| 轻量回测 | 模拟"照这个因子买卖"的收益、回撤、换手 | +| 样本内/样本外 | 自动区分"用来研究的数据"和"用来验货的数据" | +| RD 研究循环 | 让 AI 自动生成多个改进版因子,挑出最好的 | +| 本地 Web 界面 + 命令行 | 两种用法,新手推荐用 Web 界面 | +| Markdown 研究报告 | 每次研究自动存一份报告 | + +**它刻意不做的**(重要,别误会): + +> ❌ 不含实盘交易、不下单、不连券商、不含托管服务、不含非公开数据源、不含账户体系。 +> +> 这是一个**研究工具**,帮你验证想法。界面上也会反复提醒:**"研究口径,不是生产交易口径。"** + +--- + +## 2. 先搞懂 7 个词(零基础必读) + +量化听起来吓人,其实核心就这几个概念。花 5 分钟看懂,后面全通。 + +### ① 因子(Factor) + +**一个给股票打分的公式。** 分数高的股票"应该"表现好,分数低的"应该"表现差。 + +> 例:`-rank(market_cap)` 意思是"市值越小,分数越高" —— 这就是"押小盘股"这个因子。 +> `rank(...)` 是"横截面排名",前面加 `-` 表示"反过来"(越小越靠前)。 + +### ② 面板数据(Panel Data) + +**一张大表格:每天、每只股票、每个字段一行。** 这是所有计算的原料。 + +``` +trade_date(日期) instrument(股票) close(收盘价) market_cap(市值) is_st(是否ST) +2025-01-02 000001 12.3 1.2e11 0 +2025-01-02 000002 8.7 9.8e10 0 +... +``` + +软件自带一份**演示数据**,你不用自己准备,开箱即用。 + +### ③ Rank IC(信息系数) + +**衡量"因子打的分" 和 "股票之后实际涨跌" 的相关性。** 数值在 -1 到 1 之间。 + +- 越接近 0 → 因子和涨跌没关系(没用) +- 越大(正或负)→ 因子越有预测力 +- 一般 |Rank IC| > 0.03 就算有点东西了(真实例子里我们会看到 0.088) + +### ④ ICIR + +**Rank IC 的稳定性 = IC 均值 ÷ IC 的波动。** IC 高还不够,还得每期都稳定地高,ICIR 才高。 + +### ⑤ Sharpe(夏普比率) + +**衡量"每承担一份波动风险,能换来多少收益"。** 回测里最常看的一个数。 + +- Sharpe < 0 → 亏钱 +- Sharpe ≈ 1 → 不错 +- Sharpe > 1.5 → 很好(但要警惕"过拟合",见第 10 节) + +### ⑥ 回测(Backtest) + +**用历史数据模拟"如果当时照这个因子买卖,现在赚多少"。** 输出收益、最大回撤、换手率等。 + +### ⑦ 样本内 / 样本外(In-Sample / Out-of-Sample) + +**这是量化最重要的纪律。** + +- **样本内(IS)**:你用来"研究、调整因子"的历史数据段。 +- **样本外(OOS)**:你**故意留着不看**、最后才用来"验货"的数据段。 + +> 为什么?因为在同一段数据上"反复调到最好",很容易调出一个**只对这段历史有效、换个时间就失灵**的假因子(叫"过拟合")。样本外就是照妖镜 —— 真有用的因子,在没见过的数据上也该有效。 + +**记住这一条,你就超过了一半的量化新手。** 第 10 节会用一个真实例子让你看到"样本内漂亮、样本外翻车"长什么样。 + +--- + +## 3. 准备工作:你需要什么 + +| 需要 | 说明 | +| --- | --- | +| 一台电脑 | macOS、Linux 或 Windows 都行 | +| Docker Desktop **或** Python 3.11+ | 二选一,下一节详解。**新手强烈推荐 Docker** | +| 一个浏览器 | Chrome / Edge / Safari 都行,用来打开 Web 界面 | +| (可选)一个大模型 API Key | 想用"任意一句话生成因子"才需要,见第 11 节。**不配也能用**(会退化成本地规则解析,只认识几种固定模式) | + +> 💡 **完全不懂命令行也没关系。** 下面每条命令都可以直接复制粘贴。命令行就是一个"输入指令、回车执行"的黑框:Mac 上叫"终端 Terminal",Windows 上叫"PowerShell"。 + +--- + +## 4. 安装:两条路,任选一条 + +```mermaid +flowchart TD + START([开始安装]) --> Q{你熟悉 Python 吗?} + Q -->|"完全不熟 / 想省事"| DOCKER["🐳 路线 A:Docker
(推荐)"] + Q -->|"装过 Python,想自己控制环境"| VENV["🐍 路线 B:Python 虚拟环境"] + DOCKER --> DONE([装好了,进第 5 节]) + VENV --> DONE +``` + +### 路线 A:Docker(推荐新手) + +Docker 会把整个运行环境打包好,你不用操心 Python 版本、依赖冲突这些破事。 + +**第 1 步**:安装 Docker Desktop(官网下载,一路下一步)。 + +**第 2 步**:下载本项目代码。在终端里: + +```bash +git clone https://github.com/agenthaulk/quant_forge_opensource.git +cd quant_forge_opensource +``` + +**第 3 步**:构建镜像(第一次会慢几分钟,泡杯茶): + +```bash +docker build -t quant-forge . +``` + +**第 4 步**:启动。这条命令会顺便生成一个随机"控制令牌"(见第 5 节): + +```bash +export QF_WEB_CONTROL_TOKEN="$(python3 -c 'import secrets; print(secrets.token_urlsafe(24))')" +docker run --rm -p 127.0.0.1:8765:8765 -e QF_WEB_CONTROL_TOKEN quant-forge +``` + +看到 `listening on http://0.0.0.0:8765` 就成功了。**打开浏览器访问 `http://127.0.0.1:8765/`**。 + +> ⚠️ 如果 8765 端口被占用,把命令里改成 `-p 127.0.0.1:8876:8765`,然后访问 `http://127.0.0.1:8876/`。 + +### 路线 B:Python 虚拟环境 + +如果你装过 Python,想直接在本机跑: + +```bash +git clone https://github.com/agenthaulk/quant_forge_opensource.git +cd quant_forge_opensource + +python3 -m venv .venv +source .venv/bin/activate # Windows 用: .venv\Scripts\activate +python3 -m pip install -e ".[dev]" +``` + +> 📌 支持 Python 3.11 及以上,推荐 3.12。安装依赖报错时,试试精确复现测试基线: +> `python3 -m pip install -e ".[dev]" -c constraints.txt` + +装完后,`qf` 命令就可用了。验证:`qf --help`。 + +> 不想"安装包"的话,可以用 `PYTHONPATH=src python3 -m quant_forge.apps.cli.main` 代替 `qf`。 + +--- + +## 5. 第一次启动 & 控制令牌 + +先用命令行把演示工作区跑起来,确认环境没问题。**这几条是"体检 + 打开界面"。** + +```mermaid +flowchart LR + A["qf init
创建工作区"] --> B["qf doctor
环境体检"] + B --> C["qf web
启动网页界面"] + C --> D["🌐 浏览器打开
开始研究"] +``` + +路线 B / 本机 Python 用户,在项目目录里依次执行: + +```bash +# 1. 创建演示工作区(生成 ./qf-demo 文件夹,内含示例数据和因子) +qf init --workspace ./qf-demo + +# 2. 环境体检:检查数据、配置、依赖是否都 OK +qf doctor --workspace ./qf-demo + +# 3. 启动本地网页界面 +qf web --workspace ./qf-demo --rd-config configs/rd.yaml +``` + +第 3 步会打印一个本地地址(通常 `http://127.0.0.1:8765/`),在浏览器打开它。 + +> Docker 路线 A 的用户:上一节 `docker run` 已经帮你做完了这些,直接打开浏览器即可。 + +### 🔑 关于"控制令牌"(很多人卡在这) + +打开网页时,**有的人会弹出一个"请输入本次 Web 控制令牌"的对话框,有的人不会** —— 这不是 bug,取决于服务怎么启动的: + +| 启动方式 | 会不会要令牌 | 为什么 | +| --- | --- | --- | +| **Docker**(绑定 `0.0.0.0`) | ✅ 会弹窗要令牌 | 服务对局域网可见,必须用令牌保护 | +| **本地 `127.0.0.1`** 直接跑 | ❌ 不弹窗,直接进 | 只有本机能访问,不需要令牌 | + +如果弹窗要令牌:**把启动时 `QF_WEB_CONTROL_TOKEN` 那个值粘进去,点 OK**(想看它的值,先运行 `echo $QF_WEB_CONTROL_TOKEN`)。令牌只存在你的浏览器里,输一次就行。 + +> ⚠️ 这个令牌框是浏览器的**原生弹窗**,只在你第一次点"需要保护的操作"(如"开始研究")时才弹,不是页面加载就弹。在令牌输入前,界面底部会显示 `protected` / `需要控制令牌`,输完就正常了。 + +**看到界面了?恭喜,最难的一步过了。** + +--- + +## 6. 界面导览:每个地方是干嘛的(含模式切换真相) + +### 🎭 模式切换:简洁模式 / 专家模式(先说清,否则你会困惑) + +打开网页,**顶部正中间**有两个按钮:**`简洁模式`** 和 **`专家模式`**。默认是**简洁模式**。 + +``` +┌─────────────────────────────────────────────┐ +│ [简洁模式] [专家模式] ← 顶部正中 │ +└─────────────────────────────────────────────┘ +``` + +- **简洁模式**:一张居中的大卡片,只有"输入想法 + 开始研究",没有侧边栏。适合新手。 +- **专家模式**:切换成**双栏 dashboard** —— 左边侧栏(解析/研究控制、运行状态),右边 7 个功能标签页。适合看细节、调参数。 + +**这两个按钮是好用的,点了会整页切换。** 如果你觉得"点了没反应",几乎可以肯定是下面这个坑 👇 + +> ⚠️ **有两个长得像的"简洁/专家"按钮,别搞混!** +> +> | 位置 | 按钮文字 | 作用 | +> | --- | --- | --- | +> | **顶部正中** | `简洁模式` / `专家模式` | 切换**整个页面布局**(卡片 ↔ dashboard),变化很大 | +> | **因子卡片内部**(研究进行时) | `简洁` / `专家`(没有"模式"二字) | 只切换**这张卡片显示多少细节**,变化很小,像"没反应" | +> +> 如果你点的是卡片里那个 `简洁`/`专家`,看起来几乎不变是**正常的** —— 它只控制卡片信息密度。想切整页布局,请点**顶部正中带"模式"二字**的那对。 + +### 顶部 7 个功能标签页 + +进入**专家模式**后,顶部一排标签(从左到右),都是真实标签文字: + +`LLM 因子工作台` · `研究历史` · `数据` · `已注册因子` · `文档` · `扩展` · `记忆治理` + +| 标签页 | 里面有什么 | +| --- | --- | +| **LLM 因子工作台** | 主战场。下面还分两个子标签:**`单因子研究`** 和 **`多因子策略回测`** | +| **研究历史** | 你每次跑过的研究,都自动记这里,可回看对比(标题写着"run index 最近运行记录") | +| **数据** | "数据控制台" —— 一张字段目录表,列出 `close`/`market_cap`/`is_st`(必需)、`volume`/`return_1d` 等(可选),下面有"质量门结果"绿灯 `ok` | +| **已注册因子** | 因子库 —— 所有已注册因子的卡片(名称 · 因子ID · 持有天数 · 状态 · 公式) | +| **文档** | 内置说明文档 | +| **扩展** | 可选扩展模块 | +| **记忆治理** | 进阶:系统从历次研究沉淀的"经验规则",可人工审核 | + +--- + +## 7. 实战:挖出你的第一个因子 + +我们完整走一遍。目标:验证"小盘股涨得好"这个想法。 + +### 在简洁模式里(最简单) + +1. 保持在**简洁模式**(默认)。你会看到一张卡片,标题 **`一句话,开始研究`**。 +2. 中间的输入框里**已经预填了一句示例**:`非ST的小市值股票未来表现更好`。 + > 这是可以编辑的示例文字。你可以直接用它,也可以清空改成自己的想法。 +3. 下面 **`试试:`** 一行有 3 个示例按钮(点一下自动填入): + + | 按钮 | 填入的想法 | + | --- | --- | + | `非ST 小市值` | 非ST的小市值股票未来表现更好 | + | `短期动量` | 过去5天涨幅较大的股票,短期动量继续 | + | `低估值` | 估值越低的股票,长期收益越好 | +4. 点绿色大按钮 **`开始研究`**。 +5. 页面会自动切到**专家模式 → LLM 因子工作台 → 单因子研究**,并启动一条"研究流水线"。 + +### 你会看到 4 个阶段依次点亮 + +顶部有一个 4 步进度条,真实文字是: + +```mermaid +flowchart LR + A["① 解析
把话变成公式"] --> B["② 假设确认
检查参数"] + B --> C["③ 计算
评价 + 回测"] + C --> D["④ 报告
看结果"] +``` + +- **① 解析**:系统把你的话变成因子公式。侧栏显示 `解析完成,等待确认参数`。 +- **② 假设确认**:出现一张"确认因子假设"卡片(badge `待确认`),列出因子定义和所有参数(下一节详解每个字段)。 +- **③ 计算**:badge 变 `计算中`,标题"正在评测与回测"。这里会提示: + > `本次运行使用确认时冻结的参数;下方编辑只会保存为下一次尝试,不会改变本次运行。` +- **④ 报告**:badge 变 `已完成`,标题"报告已生成",出现全部指标结果。 + +**下一节我们逐帧拆解这 4 步里系统到底做了什么** —— 这是理解整个软件的关键。 + +--- + +## 8. ⭐ 幕后揭秘:点"开始研究"后系统到底做了什么 + +这一节回答几个新手最想问的问题:**系统跑了哪些步骤?调没调大模型?数据从哪来?因子怎么建出来的?那堆结果怎么算的?** + +### 全景图 + +```mermaid +flowchart TD + U["你点『开始研究』"] --> P["① 解析 Parse"] + P -->|"配了大模型?"| LLM["调用 DeepSeek
生成公式
标『AI 推断』"] + P -->|"没配 / 想省钱"| RULE["本地规则解析
只认 5 种固定模式
无 AI 徽标"] + LLM --> C["② 假设确认 Confirm
你检查参数并点『确认并计算』"] + RULE --> C + C --> COMP["③ 计算 Compute"] + COMP --> DATA[("读数据
面板数据 或 预计算因子值")] + COMP --> BUILD["把公式变成可执行因子
(只允许公开算子,安全)"] + BUILD --> EVAL["因子评价
Rank IC / ICIR / 覆盖率"] + BUILD --> BT["组合回测
Sharpe / 收益 / 回撤 / 换手"] + EVAL --> R["④ 报告 Report
汇总 + 存研究历史"] + BT --> R +``` + +### 阶段 ① 解析:调大模型,还是本地规则? + +**这是最关键的分叉。系统有两种方式把你的话变成公式:** + +| 方式 | 什么时候用 | 认识什么 | 怎么判断用了哪个 | +| --- | --- | --- | --- | +| **大模型(LLM)语义解析** | 配了 DeepSeek key(第 11 节) | 任意自然语言 | 结果卡片上有 **`AI 推断`** 徽标 | +| **本地规则解析** | 没配 key,或选了本地模式 | **只认 5 类固定模式** | **没有** `AI 推断` 徽标 | + +**本地规则只认识这几类**(其它话它认不出来): + +- 小盘 / 市值 → `-rank(market_cap)` +- 动量 / 短期反转 → 基于收益率 +- 低波动 → `-rank(volatility_5d)` 之类 +- 成交量 / 流动性 → `rank(volume)` +- 以及上面几种的组合 + +> 🔍 **怎么知道到底调没调大模型?看徽标。** +> - 公式旁边有 **`AI 推断`** → DeepSeek 真的被调用了。 +> - 没有徽标 → 是本地关键词解析器认出来的。 +> - 如果**没配 key 又不匹配任何固定模式**,系统会**明确报错**,而不是偷偷编一个公式糊弄你 —— 这是有意的诚实设计。 + +真实例子:输入"非ST的小市值股票表现更好",配了 DeepSeek,得到公式 **`-rank(market_cap)`**,并标注 `AI 推断`。 + +### 阶段 ② 假设确认:每个字段什么意思 + 徽标图例 + +确认卡片("确认因子假设")会列出**全部参数**,每个都带一个"来源徽标"。真实字段如下: + +| 分组 | 字段 | 示例值 | 徽标 | +| --- | --- | --- | --- | +| **因子定义** | 因子名称 | `small_cap_non_st` | `AI 推断` | +| | 公式 | `-rank(market_cap)` | `AI 推断` | +| | 说明 | 非ST的小市值股票表现更好 | `AI 推断` | +| | 预测周期 | `21天` | `AI 推断` | +| **股票池** | 股票池筛选 | `is_st == false`(排除 ST 股) | `用户明确指定` | +| **持有与执行** | 持有期 / Delay / Decay / Top Quantile | `21天 / 1天 / 0天 / 0.3` | `默认配置` | +| **评测区间** | 评测开始 / 结束 | `2025-01-01 / 2025-12-31` | `默认配置` | +| **回测区间** | 回测开始 / 结束 | `2026-01-01 / 未设置` | `默认配置` / `固定策略` | +| **交易成本** | 手续费 / 滑点 / 融券成本 | `0bps / 0bps / 0bps/年` | `默认配置` | + +**徽标图例(界面里没有说明,这里补上):** + +| 徽标 | 含义 | +| --- | --- | +| **`AI 推断`** | 这个值是大模型根据你的话猜的 | +| **`用户明确指定`** | 这个值是你的话里明确要求的(如"非ST"→排除 ST) | +| **`默认配置`** | 系统默认值,你可以改 | +| **`固定策略`** | 系统按规则自动决定,**你改不了**(如"回测结束:未设置=按可用数据自动到最新") | + +> 💡 看到 **`回测结束:未设置(按可用数据自动解析)`** 不要慌 —— 这**不是错误**,意思是"自动用到最新一天的数据"。 + +底部两个按钮:**`确认并计算`**(绿色,继续)/ **`放弃本次研究`**(红色,取消)。点"确认并计算"进入下一步。 + +### 阶段 ③ 计算:数据从哪来 + 因子怎么建 + 怎么评价回测 + +点"确认并计算"后,系统在几秒内做完三件事: + +**(a) 读数据 —— 从哪来?** + +| 因子类型 | 数据来源 | +| --- | --- | +| **公式因子**(如 `-rank(market_cap)`) | 读本地**面板数据**(那张日期×股票×字段的大表),按公式**当场算**出每天每只股票的因子值 | +| **预计算因子**(公式是 `precomputed:...`) | 直接读事先算好、存在磁盘上的**因子值**,不再计算 | + +面板数据最少要有这几列:`trade_date, instrument, close, market_cap, is_st`(演示工作区自带一份,离线可用)。 + +**(b) 把公式变成"可执行因子" —— 安全吗?** + +系统只允许一份**公开算子白名单**(`rank`、`ts_sum`、`ts_std_dev`、`ts_delta`、`ts_corr` 等)。你的公式必须只用这些算子,否则**在校验阶段就被拒绝,根本不会执行**。 + +> 🔒 这就是为什么"用自然语言生成公式"是安全的 —— 任何奇怪的、想搞破坏的东西都过不了算子白名单这一关。 + +算好的因子会存成一个 `factor.yaml`(在因子库 `factor_root` 里),包含名称、公式、预测周期等。 + +**(c) 评价 + 回测**(下一节详细解读每个数字): +- **评价**:算 Rank IC、ICIR、覆盖率等 —— 回答"这个因子准不准"。 +- **回测**:模拟"买因子分数最高的一批、卖最低的一批"(次日成交、持有 N 天、扣交易成本)—— 回答"照这个买卖赚不赚"。 + +### 阶段 ④ 报告:结果 + 存档 + +系统把因子定义、评价指标、回测结果汇总成报告,同时: +- 在界面右侧展开一排结果子标签:`概览` · `样本内评价` · `样本内回测` · `样本外评测` · `诊断` · `研究证据` · `Artifacts` · `Benchmark 对比`。 +- 把这次运行写进**研究历史**(持久保存,以后能回看)。 +- 在工作区 `artifacts/research_reports/` 下存一份 Markdown 报告。 + +--- + +## 9. 看懂结果:每个指标怎么读(中英对照) + +界面里指标是**中英混着来**的,对新手不友好。这里给一张对照表,并用一次**真实运行结果**逐个解读。 + +真实例子:小盘因子 `-rank(market_cap)`,样本内 2025 年、样本外 2026 年初。 + +### 样本内评价(因子准不准) + +| 界面标签 | 中文 | 真实值 | 怎么读 | +| --- | --- | --- | --- | +| `Rank IC` | 信息系数 | **0.0881** | 预测力。>0.03 算有料,0.088 相当不错 | +| `ICIR` | IC 稳定性 | **0.53** | IC 的稳定程度,越高越可靠 | +| `HAC t-stat` | 统计显著性 | **2.12** | >2 一般认为"不是碰运气",有统计显著性 | +| `IC Days` | 有效天数 | **221** | 用了多少个交易日算 IC | +| `Joint Coverage` | 联合覆盖率 | **97.15%** | 有多少股票能算出因子值,越接近 100% 越好 | +| `Horizon / Delay` | 预测周期 / 延迟 | **21日 / 1日** | 预测未来 21 天,信号延迟 1 天成交 | + +### 样本内组合回测(照这个买卖赚不赚 —— 样本内) + +| 界面标签 | 中文 | 真实值 | 怎么读 | +| --- | --- | --- | --- | +| `净累计收益` | 扣成本后总收益 | **29.00%** | 整段时间总共赚了多少 | +| `可报告净年化收益` | 年化收益 | **32.02%** | 折算成一年赚多少 | +| `年化Sharpe` | 夏普比率 | **1.90** | 每份风险换多少收益,>1.5 很漂亮 | +| `净值最大回撤` | 最大回撤 | **-10.60%** | 最惨从高点跌了 10.6% | +| `Rebalance Turnover` | 调仓换手率 | **11.28%** | 每次调仓换掉约 11%,不算高 | + +### ⚠️ 外部样本外评测(照妖镜 —— 样本外) + +| 界面标签 | 中文 | 真实值 | 怎么读 | +| --- | --- | --- | --- | +| `净累计收益` | 扣成本后总收益 | **-8.88%** | **样本外反而亏了!** | +| `年化Sharpe` | 夏普比率 | **-1.41** | **由正转负** | +| `净值最大回撤` | 最大回撤 | **-12.49%** | 回撤更大 | + +> 🎯 **这就是活生生的教训。** 样本内 Sharpe **1.90**(漂亮得不行),换到样本外直接变 **-1.41**(亏钱)。如果只看样本内就上,实盘会血本无归。 +> +> 更棒的是:**系统自己在"诊断"标签里诚实地警告了你** —— 会打出 `IS ICIR 明显强于 OOS,不要只依赖全样本指标` 之类的提示,以及 `OVERLAPPING_IC_REQUIRES_HAC`、`INSUFFICIENT_ANNUALIZATION_HISTORY` 等诚实标签。**它不藏着掖着,这正是好研究工具该有的样子。** + +### 诊断标签(为什么这些警告是好事) + +| 诊断标签 | 意思 | +| --- | --- | +| `OVERLAPPING_IC_REQUIRES_HAC` | IC 有重叠,已用 HAC 方法修正统计量(更严谨) | +| `INCOMPLETE_FORWARD_HORIZON_DROPPED` | 末尾不足一个持有期的数据被丢弃(避免虚高) | +| `INSUFFICIENT_ANNUALIZATION_HISTORY` | 历史太短,年化数字不可靠,已标 n/a | +| `POSITIONS_LOST_BEFORE_EXIT` | 有持仓在到期前丢失(如退市),已如实处理 | + +> 这些不是报错,是系统在**主动告诉你结果哪里要打折扣** —— 越多这类诚实标签,越说明工具靠谱。 + +--- + +## 10. 进阶:样本内 vs 样本外 + +第 2、9 节都强调了:这是量化最重要的纪律。现在动手实践。 + +**正确的研究姿势:** + +```mermaid +flowchart TD + A["1️⃣ 划一条时间线
前段=样本内,后段=样本外"] --> B["2️⃣ 只在样本内
反复调因子、看 IC"] + B --> C["3️⃣ 因子定稿后
才在样本外跑一次回测"] + C --> D{样本外还行?} + D -->|是| E["✅ 因子可能真有用"] + D -->|否| F["❌ 大概率是过拟合
回炉重造"] +``` + +在**专家模式**下,"评测区间"和"回测区间"可以分别填不同的日期段: + +- 评测区间(样本内)= `2025-01-01` ~ `2025-09-30` → 在这段研究、优化 +- 回测区间(样本外)= `2025-10-01` ~ `2025-12-31` → 定稿后验货 + +> ⚠️ 常见误区:两个区间都**留空**时,系统会用"全部可用数据"自动填,导致样本内外是**同一段** —— 这时系统会诚实标注"样本内评价为同窗诊断,非独立研究样本"。想要真正的样本外验证,**一定要显式填两段不重叠的日期**。 + +对于自动挖因子(RD)流程,配置文件里用 `sample_splits` 表达 IS/OOS 划分,并可用 `boundary_date` 钉住精确切分日期(而不是按比例切): + +```yaml +evaluation: + sample_splits: + - {name: is, fraction: 0.75, boundary_date: "2025-09-30"} # 样本内到 9-30 + - {name: oos, fraction: 0.25} # 样本外 = 剩余 +``` + +> 系统还会在样本内外的接缝处自动"隔离"(purge/embargo)几天(`延迟天数 + 预测周期`),防止未来信息泄漏到过去 —— 这些你不用手动管,但知道它在保护你。 + +--- + +## 11. 进阶:接入 AI,用一句话生成因子 + +不配 AI,系统只认识第 8 节那 5 类固定模式。配上大模型(如 DeepSeek),你就能用**任意自然语言**描述想法。 + +> 🔒 **安全原则:配置文件里只写"环境变量名",绝不写真实密钥。** 真实 Key 放在被 git 忽略的本地文件里。 + +**第 1 步**:复制配置模板: + +```bash +cp configs/default.draft.yaml configs/default.local.yaml +``` + +**第 2 步**:把 API Key 放进本地 env 文件(被 git 忽略,不会上传): + +```bash +printf 'DEEPSEEK_API_KEY=<你的-api-key>\n' > configs/default.local.env +chmod 600 configs/default.local.env +``` + +**第 3 步**:在 `configs/default.local.yaml` 里声明 provider(只写环境变量名): + +```yaml +runtime: + env_files: + - default.local.env +llm: + provider: deepseek + providers: + deepseek: + model: deepseek-chat + base_url: https://api.deepseek.com + api_key_env: DEEPSEEK_API_KEY +``` + +**第 4 步**:验证链路(不会打印你的密钥): + +```bash +qf llm-smoke --config configs/default.local.yaml --provider deepseek +``` + +**第 5 步**:带上这个配置启动 Web: + +```bash +qf web --config configs/default.local.yaml --rd-config configs/rd.yaml +``` + +现在界面底部会显示 **`LLM deepseek / deepseek-chat`**,解析因子时公式旁会出现 **`AI 推断`** 徽标。 + +> Docker 用户:用 `docker run --env-file configs/default.local.env ...` 把密钥传进容器,同样不写进镜像。 + +### 另一条路:直接在网页里切换大模型 / 输入密钥 + +如果你不想改 YAML、也不想重启,可以直接在**专家模式**左侧控制栏里切换 provider 或临时输入密钥,即时生效: + +1. **LLM Provider** 下拉会同时列出你在配置里写好的 provider **和 6 个内置预设**(`deepseek` / `openai` / `openai_compatible` / `glm` / `claude` / `minimax`)。没在 YAML 里配过的预设会标注**「预设未启用」**。 +2. 把 **LLM API Key** 从「配置文件 / 环境变量加载」切到**「前端输入(注入本次运行)」**,密码框就可以编辑了。 +3. 填入密钥。如果选的是**没有默认模型的预设**(如 openai / glm / claude),会多出一个**模型名**输入框要你补填;选 `openai_compatible`(本地自建模型常用)还会多出一个 **Base URL** 框(如本地 `http://127.0.0.1:11434/v1`)。 +4. 点**「保存并启用」**。状态提示会显示"已保存",输入框立即清空,底部运行时状态条切换成你选的 provider。 + +> 🔒 **这条路的密钥只进"运行中进程的内存":不写磁盘、不在任何响应里回显、不进日志,重启就没了。** 想让密钥重启后还在,仍然要走上面第 2 步那种 `configs/*.local.env` 文件。 +> +> 几个安全细节,遇到时不用慌: +> - Docker / `0.0.0.0` 启动时,这个保存操作和其它会改状态的操作一样**需要控制令牌**(见第 5 节)。 +> - 想把某个**已配好的** provider 改指向新的 `base_url`(换服务地址)时,系统会要求你**在同一次保存里重新填一遍密钥** —— 这是为了防止你原有的常驻密钥被发去一个新地址,属于正常保护,不是 bug。 + +--- + +## 12. 进阶:让 AI 自动帮你挖因子(RD) + +RD(Research-Development)循环 = 让 AI **自动生成多个因子候选、逐个评价回测、挑出最好的**。 + +```mermaid +flowchart LR + A["🌱 种子因子
或一个方向"] --> B["🤖 AI 生成
N 个改进候选"] + B --> C["⚙️ 逐个评价+回测"] + C --> D["🏆 挑出最优
+ 生成报告"] +``` + +命令行跑一轮: + +```bash +qf research run-once FTR_DEMO_SMALL_CAP --workspace ./qf-demo --rd-config configs/rd.yaml +``` + +网页里进入 **LLM 因子工作台 → 多因子策略回测** 或单因子研究页,配置轮数和候选数后运行。 + +**几个要点:** + +- RD 会输出一个 `report_path`,Markdown 报告写在工作区 `artifacts/research_reports/` 下。 +- RD 耗时取决于数据量、AI 延迟、候选数。完整数据集上一轮可能几十秒到几分钟。界面超过 10 秒会显示长任务提示,并给一个**中断按钮**(在安全阶段边界生效)。 +- 如果 AI 连续给出非法公式,系统会把错误回传给 AI 做有限次修复;若最终只是复用种子、没产生新公式,结果会标记 `no_optimization_performed` —— 这表示**这轮研究没成功**,不能当作优化成果。 +- 首次尝试建议把候选数设小(如 `default_max_candidates: 1`),跑通后再放大。 + +--- + +## 13. 新手最容易卡住的 8 个点 + +这些是实操中真实遇到的困惑,提前打个预防针: + +1. **"模式切换点了没反应"** → 你多半点了因子卡片里那个 `简洁/专家`(只切细节密度)。要切整页布局,请点**顶部正中带"模式"二字**的 `简洁模式`/`专家模式`(见第 6 节)。 +2. **"要输入控制令牌"** → Docker 启动才会要,值就是 `QF_WEB_CONTROL_TOKEN`;本地 `127.0.0.1` 跑则不弹窗(见第 5 节)。 +3. **界面里一堆英文**(`Factor Tape`、`Exposure Days`、`Rebalance Turnover`、`HAC t-stat`…)→ 对照第 9 节和附录 B 的中英表,别被吓到。 +4. **"回测结束:未设置(按可用数据自动解析)"** → 不是错误,是"自动用到最新数据"(见第 8 节徽标图例)。 +5. **输入框里已有一句话** → 那是可编辑的示例文字,直接改成你的想法即可。 +6. **徽标 `AI 推断`/`用户明确指定`/`默认配置`/`固定策略`** → 界面没图例,含义见第 8 节表格。 +7. **研究历史里那一长串 ID 竖着换行显示** → 是列宽显示问题,不影响使用;ID 本身是运行的唯一编号。 +8. **样本外结果很难看(甚至亏钱)** → 这是**正常且有价值的**,说明因子过拟合了;能诚实暴露这一点正是工具的价值(见第 9、10 节)。 + +--- + +## 14. 常见问题 + +| 症状 | 原因 & 解决 | +| --- | --- | +| **端口 8765 被占用** | 换端口:Docker 用 `-p 127.0.0.1:8876:8765`,开 `http://127.0.0.1:8876/` | +| **Docker 里看不到我的数据盘** | Docker Desktop 需授权共享该磁盘:设置 → Resources → File Sharing 里加上,再用 `-v` 挂载 | +| **依赖安装失败** | 确认 `python --version` ≥ 3.11;重建虚拟环境;用 `pip install -e ".[dev]" -c constraints.txt` | +| **最小 Docker 镜像缺 git/curl** | 装基础工具:`apt-get update && apt-get install -y --no-install-recommends git curl ca-certificates procps` | +| **样本内外结果一模一样** | 两个区间都留空了 → 系统用全量同一段。显式填两段不重叠日期(见第 10 节) | +| **AI 报错缺 key / 公式解析失败** | 检查 `configs/*.local.env` 里有没有对应环境变量;先跑 `qf llm-smoke` 验证;没配 key 时只能用第 8 节那 5 类固定模式 | +| **RD 跑很久** | 正常。缩小候选数/参数网格先跑通,或用界面的中断按钮 | + +> 更详细的联调排错,见 `docs/full_integration_test_prompt.md`。 + +--- + +## 附录 A:命令速查表 + +| 命令 | 作用 | +| --- | --- | +| `qf init --workspace ./qf-demo` | 创建演示工作区 | +| `qf doctor --workspace ./qf-demo` | 环境体检 | +| `qf data validate --workspace ./qf-demo` | 校验数据 | +| `qf factor list --workspace ./qf-demo` | 列出所有因子 | +| `qf show ` | 查看某因子详情 | +| `qf idea-to-factor --text "..."` | 一句话转因子 | +| `qf eval-factor --rd-config configs/rd.yaml` | 评价因子(算 IC) | +| `qf run-backtest --rd-config configs/rd.yaml` | 回测因子 | +| `qf research run-once --rd-config configs/rd.yaml` | 跑一轮 RD | +| `qf web --workspace ./qf-demo --rd-config configs/rd.yaml` | 启动网页界面 | +| `qf llm-smoke --config <配置> --provider deepseek` | 测试 AI 链路 | +| `qf --help` | 查看所有命令 | + +> 所有命令都可加 `--help` 看详细参数,例如 `qf run-backtest --help`。 + +--- + +## 附录 B:术语表(中英对照) + +界面里中英混杂,这张表帮你对上号: + +| 界面可能显示 | 中文 | 一句话解释 | +| --- | --- | --- | +| Factor / 因子 | 因子 | 给股票打分的公式 | +| Panel | 面板数据 | 日期 × 股票 × 字段 的大表格 | +| Rank IC / rank_ic_mean | 信息系数 | 因子打分与实际涨跌的相关性(预测力) | +| ICIR | IC 信息比率 | IC 的稳定性(IC 均值 ÷ IC 波动) | +| HAC t-stat | HAC t 统计量 | 统计显著性(>2 一般算显著) | +| Joint Coverage | 联合覆盖率 | 能算出因子值的股票占比 | +| Sharpe | 夏普比率 | 每份风险换来的收益 | +| Backtest | 回测 | 用历史数据模拟买卖 | +| Turnover / Rebalance Turnover | 换手率 | 调仓频繁程度 | +| Max Drawdown / 最大回撤 | 最大回撤 | 从最高点跌下来的最大幅度 | +| Exposure Days | 暴露天数 | 实际持有仓位的天数 | +| Top Quantile | 头部分位 | 取排名前多少比例的股票(如 0.3=前30%) | +| Delay | 延迟 | 信号出现后隔几天成交(防未来函数) | +| Decay | 衰减 | 对信号做时间平滑的天数 | +| Horizon | 预测周期 | 因子预测未来多少天 | +| In-Sample (IS) | 样本内 | 用来研究、调整因子的数据段 | +| Out-of-Sample (OOS) | 样本外 | 留着最后验货的数据段 | +| sample_role | 样本角色 | 标注这次是样本内还是样本外回测 | +| Overfitting | 过拟合 | 只对历史有效、换个时间就失灵 | +| RD Loop | RD 研究循环 | AI 自动生成并筛选因子候选 | +| Seed Factor | 种子因子 | RD 优化的起点因子 | +| factor_root | 因子库 | 存放所有因子定义/公式的地方 | +| workspace | 工作区 | 一次研究的数据、因子、结果所在文件夹 | +| AI 推断 | (徽标)AI 推断 | 该值由大模型生成 | +| 用户明确指定 | (徽标) | 该值来自你的话里的明确要求 | +| 默认配置 | (徽标) | 系统默认值,可改 | +| 固定策略 | (徽标) | 系统按规则决定,不可改 | + +--- + +## 许可证说明 + +本仓库采用 **Business Source License 1.1(BUSL-1.1)**,并约定未来转为 Apache-2.0。 + +```text +当前许可证:BUSL-1.1 +Change Date 前允许:非商业研究、教育、个人评估、内部非商业实验,以及非生产用途 +Change Date:2027-12-31 +Change License:Apache License, Version 2.0 +``` + +简单说:**2027-12-31 之前,可自由用于非商业研究、学习、个人评估**;之后自动转为更宽松的 Apache-2.0。商业生产用途需另行确认。 + +--- + +## 下一步读什么 + +跑通之后,想深入了解可以读这些(仓库 `docs/` 下): + +- 使用手册 USER_MANUAL.md —— 完整功能双语手册 +- 架构说明 architecture.md —— 软件内部怎么设计的 +- 配置参考 configuration.md —— 所有配置项详解 +- 联调流程 integration_workflow.md —— 完整联调步骤 + +> 遇到问题?先跑 `qf doctor` 体检,大部分环境问题它都能指出来。 +> +> 觉得项目有用?欢迎去 GitHub 给个 ⭐ Star。