# 第 9 章：持续寻找机会：因子研究入门

> 最新书稿已更新至 [XQuant 量化课堂页](https://xquant.shop/courses)。
> 想阅读最新版官方书稿，请前往图书页。

前面 8 章，我们从零搭建了一个完整的量化策略：选标的、定权重、制定买卖规则、验证有效性、避免过拟合、接入执行、持续迭代。策略跑起来了。

**然后呢？**

做完一个策略就结束了吗？量化交易员的日常到底在忙什么？

答案是：**因子研究**。

回头看前面 8 章的每一个关键决策：用 GDP 选国家，用动量排名买卖。背后都有一个共同逻辑：把投资直觉翻译成可计算变量，再用它做决策。这个变量，就是**因子（Factor）**。

量化研究的日常工作，就是不断寻找新的因子、评估它们的预测能力，再把有用的发现变成策略改进。这一章，我们就来体验这个过程。

### 路线图

**完整跑通一个策略（第 1 章）→ 选什么标的（第 2 章）→ 每个买多少（第 3 章）→ 什么时候买卖（第 4 章）→ 怎么验证有效（第 5 章）→ 如何避免自欺欺人（第 6 章）→ 如何真正执行（第 7 章）→ 如何持续改进（第 8 章）→ 持续寻找机会（第 9 章本章）**

本章从“回顾已有决策”出发，正式引入因子概念，用三个步骤体验量化研究员的日常工作，三步的问题与方法对照如表 9-1 所示。

**表 9-1 第 9 章三步实验问题与方法对照**

| 步骤 | 问题 | 方法 |
|------|------|------|
| 第 1 步 | 前面的决策靠的是什么？ | 回顾 → 引入因子概念 → IC 评估方法 → GDP 因子实验 |
| 第 2 步 | 动量因子到底靠不靠谱？ | 25 只 ETF × 多个前向窗口 → IC 分析 → 分组诊断 |
| 第 3 步 | 因子评估能改进策略吗？ | 补充因子 → 发现问题 → 波动率过滤 → 回测验证 |

（操作流程见前言“怎么使用这本书”。）

---

## 9.1 从直觉到因子

回顾一下前面课程中的两个关键决策，对照如表 9-2 所示。

**表 9-2 前面课程中的两个关键决策回顾**

| 章节 | 决策 | 用了什么数据 | 因子名称 | 因子类别 |
|------|------|-------------|---------|---------|
| 第 2 章选什么 | 选哪个国家的市场 | GDP 总量/增速 | GDP 因子 | 宏观因子 |
| 第 3 章买多少 | 涨得多买、跌得多不买 | 风险调整动量 | 动量因子 | 动量因子 |

你可能没意识到，第 2 章和第 3 章里你已经在用因子了。**因子（Factor）**是描述资产或市场特征的可计算变量。它可以用来解释风险和收益，也可以用来预测表现、辅助决策。比如 GDP 高的国家更值得投，涨得好的资产多买一点。就像你挑餐厅会看评分、距离、价格，这些“参考指标”就是因子。

量化研究的日常工作，就是不断寻找和评估这些因子。

### 怎么评估一个因子好不好？

一个因子好不好，最直接的检验方式是：它的打分排名，和实际收益排名有多像？

这就是 **IC（Information Coefficient，信息系数）** 的核心思想。打个比方，IC 就像考试估分准不准：你预估的前 5 名跟实际前 5 名的重合度越高，说明你的判断越靠谱。

计算方法：每一期，把所有投资对象按因子值排名，再按下一期的实际收益排名，然后算两个排名的 Spearman 相关系数。Spearman 是相关系数的一种，专门看排名而不是数值。它比较的是两次考试的“班级第几名”是否一致，而不是具体分数。相关系数范围从 -1 到 +1：+1 表示因子排名和收益排名完全一致（完美预测），-1 表示完全相反，0 表示毫无关系。

**IC 均值**是多期 IC 的平均值，反映因子是否长期有效：

- 绝对值 > 0.03：有一定参考价值
- 绝对值 > 0.05：算不错的因子
- 绝对值 > 0.1：非常强的因子（实际中很罕见）

**ICIR（IC 信息比率）** = IC 均值 / IC 标准差，衡量 IC 的稳定性。不仅要均值高，还要稳定。偶尔猜中一次的因子不算好，每年都稳定有效才算。这和第 3 章讲简化夏普时的思路类似：不只看平均收益，也要看波动。

### 动手实验 1：GDP 因子 IC 分析

我们一起把这份 spec 写出来。这次重点看两件新东西：**评估工具先讲清楚再用**，以及**因子计算的关键参数要点名到函数级**。

#### 第一、二段：上下文和任务描述

这是收官章第一份 spec，承接前 8 章的所有实验。上下文段把“读者已经在用因子但没意识到”这个起点交代清楚：

> **上下文**：读者已完成第 2 章到第 8 章。本 spec 对应 notebook `q9-daily-work.ipynb` 的第 1 步，从零引入因子概念和 IC 评估方法，并用 10 国 GDP 数据做第一个因子评估实验。
>
> **任务描述**：在 notebook 中创建第 1 步的所有单元格：导入库、因子回顾表、IC 方法说明、GDP 因子 IC 实验、排名对比图、GDP 分析、因子分类全景表。

> 📌 **要点**：收官章 spec 把“评估工具”前置于“评估实验”。任务要求段先单独要求一个 IC 方法说明 markdown（讲 Spearman、阈值、ICIR），再要求 GDP 实验。先把全章共用的“测量尺”建起来，后面所有 spec 都引用同一套语言。

#### 第三段：任务要求

任务要求段是这份 spec 最长的一节（11 条）。两个最关键的细节：

> **任务要求**（摘要）：前两条规定整体结构，3-5 条是具体的 oxq 模块调用细节。
>
> 1. IC 方法说明 markdown 必须放在 GDP 实验之前。先讲 Spearman 相关系数、IC 阈值（0.03 / 0.05 / 0.1）、ICIR 概念
> 2. GDP 数据下载用 `WorldBankFetcher()` + `FactorDownloader(fetcher, sub="macro")` + `dl.download("gdp", start="2010", end="2024", countries=countries)`
> 3. ETF 价格用 `YFinanceDownloader()` + `LocalMarketDataProvider().get_bars()`，时间范围 2011-01-01 至 2026-12-31
> 4. IC 计算：每个“因子年→收益年”配对，用 `scipy.stats.spearmanr` 算相关系数；同时跑 GDP 总量因子和 GDP 增速因子（`gdp_df.pct_change()`）
> 5. 视觉契约：1×2 柱状图（figsize 14×5），正相关蓝色、负相关红色，加 IC 均值虚线；slope chart 选 IC 最大那一年，中美红色粗线高亮、其他灰色

> 📌 **要点**：量化研究 spec 必须把“算什么”具体到函数。“算 IC”不够。`spearmanr` 还是 `pearsonr`？前者看排名相关，后者看数值相关，因子评估默认用 spearman。任何统计计算都要点名具体函数，避免 AI 在等价函数间随机选。

> 📌 **要点**：复用现成模块时，spec 第一条要点名所有 import 路径。AI 不知道哪些轮子已经存在，名字写错就重复造轮子。本节涉及 `WorldBankFetcher`、`FactorDownloader`、`read_factor`、`Momentum`、`RollingVolatility` 等 7 个模块，全部按官方写法显式列出。

#### 第四段：验收标准

> **验收标准**：GDP 数据表（万亿美元） + 10 国 ETF 覆盖表 + 1×2 IC 柱状图 + IC 均值/ICIR 打印 + 排名对比 slope chart + GDP 分析 markdown + 6 类因子分类全景表 + 过渡文案。

完整示例 spec 见配套仓库的 [`q9-daily-work/specs/spec-01-factor-intro.md`](https://github.com/xingwudao/xquant-learning/blob/main/q9-daily-work/specs/spec-01-factor-intro.md)。参考示例后，确认自己的 spec，再复制给 AI。

AI 编程工具执行完毕后，你的 notebook 里应该出现了 GDP 数据表、IC 柱状图和排名对比图。

这个实验做了什么？先下载 10 个国家的 GDP 数据和对应的指数 ETF 价格数据，然后分别用两个 GDP 因子（总量和增速）来预测下一年的指数收益排名，计算每一年的 IC。

### 运行结果

先看两个因子的 IC 对比，如图 9-1 所示。

![GDP 总量因子和增速因子的年度 IC 对比](images/q9-daily-work/01-gdp-ic-comparison.png)

GDP 总量因子：IC 均值 = 0.1272，ICIR = 0.3158。GDP 增速因子：IC 均值 = -0.0390，ICIR = -0.1177。

GDP 总量因子的 IC 均值为正，说明 GDP 越大的国家，下一年股市表现确实有略好的倾向。虽然很弱、不稳定，但方向是对的。这就呼应了第 2 章的选择逻辑：我们根据 GDP 总量挑选了最大的两个经济体（中国和美国），用沪深 300 和纳斯达克来构建标的池，背后是有数据支撑的。

而 GDP 增速因子的 IC 更差，说明“增长快”并不能预测“股市涨得好”。经济增速和股市回报的关系比直觉想的要弱得多。

再看 IC 最高那一年的排名对比图，如图 9-2 所示。

![IC 最高年份的 GDP 排名 vs 收益排名对比](images/q9-daily-work/01-gdp-rank-comparison.png)

左列是 GDP 总量排名，右列是下一年指数收益排名。线越平，说明两个排名越接近（IC 越高）；线交叉越多说明排名差异大（IC 低）。中美两国用红色高亮。你能直观感受到“IC 高”意味着什么。

### 结果解读

GDP 因子的局限很明显：年度数据、10 个国家、十几年样本，IC 估计噪音很大。但这正好说明了 IC 的价值。不是拍脑袋觉得“有道理”就行，要用数据验证。

### 因子的分类

因子的世界远不止 GDP 和动量。主要的因子类别如表 9-3 所示，也是你未来挖掘新因子的方向。

**表 9-3 因子分类全景**

| 因子类别 | 含义（一句话） | 常见例子 | 数据来源 |
|---------|--------------|---------|---------|
| 价值 | 便不便宜 | 市盈率、市净率 | 财报数据 |
| 动量 | 涨跌趋势 | N 日收益率、风险调整动量 | 价格数据 |
| 质量 | 公司好不好 | 利润率、负债率 | 财报数据 |
| 波动率 | 稳不稳 | 历史波动率 | 价格数据 |
| 宏观 | 大环境 | GDP、利率 | 经济数据 |
| 另类 | 非传统信息 | 新闻情绪、卫星图像 | 另类数据 |

前面课程里我们用过宏观因子（GDP）和动量因子（风险调整动量）。接下来我们重点研究动量因子，因为它用的是每天都有的价格数据，样本量大、更新快，最适合日常研究。

GDP 因子受限于年度频率和小样本，IC 很不稳定。接下来，我们用日频价格数据和更多投资对象来评估动量因子。这才是量化研究的日常节奏。

---

## 9.2 动量因子：涨得好的会继续涨吗？

第 3 章里我们用动量排名来决定买多少：涨得好的多买，跌得多的不买。当时在 3 只 ETF 上回测效果不错。

但那只是 3 只 ETF。动量因子在更大范围内真的有效吗？它在什么环境下会失灵？要回答这些问题，我们需要扩大标的池，用 IC 来严格评估。

### 动手实验 2：动量因子 IC 分析

我们一起把这份 spec 写出来。这次重点看两件新东西：**IC 计算函数的签名要点名到参数**，以及**最低样本数阈值要写明白**。

#### 第一、二段：上下文和任务描述

> **上下文**：在 `q9-daily-work.ipynb` 的第 1 步中已完成库导入和 GDP 因子 IC 实验。已有变量 `downloader`（YFinanceDownloader）、`provider`（LocalMarketDataProvider）。本 spec 对应第 2 步，把标的池从 10 只扩展到 25 只，用日频数据做动量因子的 IC 分析。
>
> **任务描述**：在 notebook 中新建第 2 步的所有单元格：构建 25 只投资对象组成的标的池、计算动量因子与前向收益、IC 分析表和图、按波动率分组的 IC 分析、问题总结。

#### 第三段：任务要求

任务要求段的灵魂是把 IC 计算的“工程化模式”用函数签名固化下来。任何新因子来了都按这个模板跑一遍。

> **任务要求**（摘要）：
>
> 1. 25 只投资对象组成的标的池：22 国 ETF + 3 个大宗商品（GLD / USO / SLV），时间范围 2015-01-01 至 2025-12-31
> 2. 因子矩阵：`Momentum().compute(df, column="close", period=20)`、`RollingVolatility().compute(df, column="close", period=20)`、RAM = 动量 / 波动率
> 3. 前向收益窗口 `[10, 20, 40]` 交易日：`df["close"].pct_change(h).shift(-h)`
> 4. 实现 `compute_ic_series(factor_df, fwd_df, min_assets=5)`：每个交易日取因子值和前向收益都有数据的投资对象（至少 min_assets 个），用 Spearman 算 IC
> 5. 实现 `compute_grouped_ic(factor_df, fwd_df, vol_df, min_assets=6)`：每天按波动率中位数把投资对象分高/低两组，组内分别算 Spearman IC；要求交集 ≥12、每组 ≥ min_assets
> 6. 视觉契约：2×3 子图（figsize 18×8），柱状图 `width=2, alpha=0.2, steelblue` + 60 日滚动均值 `darkblue` + IC 均值红色虚线
> 7. 末尾保留 `ic_ts = ic_results["风险调整动量 → 20日"]` 和 `fwd_df = fwd_dfs[20]` 给 spec-03

> 📌 **要点**：IC 计算这种“对每天做一次统计、跳过样本不足的天、收集成时间序列”的工程化模式，必须封装成函数：`compute_ic_series(factor_df, fwd_df, min_assets=5)`。函数签名级精度让 AI 没有自由发挥空间，也让读者未来换标的池时有明确的修改入口。

> 📌 **要点**：统计计算的阈值要写明白。`min_assets=5`（整体 IC）和 `min_assets=6`（分组 IC，配合交集 ≥12 的额外门槛）不是凭空选。Spearman 在 ≥5 时方差才可控，分组样本减半后 ≥6 才能稳定。任何“最少多少样本”的阈值都要进 spec 的参数清单，否则 AI 可能选 3 也可能选 10。

#### 第四段：验收标准

> **验收标准**：25 只投资对象覆盖表 + 动量因子矩阵 + 6 组 IC 对比表 + 2×3 IC 时间序列子图 + 分组 IC 表 + 高/低波动 IC 时间序列对比图 + 问题总结 markdown。

完整示例 spec 见配套仓库的 [`q9-daily-work/specs/spec-02-momentum-ic.md`](https://github.com/xingwudao/xquant-learning/blob/main/q9-daily-work/specs/spec-02-momentum-ic.md)。参考示例后，确认自己的 spec，再复制给 AI。

AI 编程工具执行完毕后，你的 notebook 里应该出现了 25 只投资对象的覆盖表、IC 对比表和多张 IC 时间序列图。

这个实验做了什么？把标的池从第 2、3 章的 3 只 ETF 扩展到 25 只全球 ETF（22 个国家/地区 + 黄金/原油/白银），用 2015-2025 的日频数据，分别测试两个动量因子（20 日动量和风险调整动量）在三个前向收益窗口（10/20/40 交易日）上的 IC 表现。然后按每只投资对象自身的波动率分组，看动量因子在高波动和低波动投资对象上的表现差异。

### 运行结果

两个动量因子在三个前向窗口上的 IC 对比如表 9-4 所示。

**表 9-4 两个动量因子 × 三个前向窗口的 IC 对比**

| 因子 / 前向窗口 | IC 均值 | IC 标准差 | ICIR | IC>0 |
|-----------------|--------|----------|------|------|
| 20日动量 / 10日 | -0.0263 | 0.2794 | -0.0941 | 45.7% |
| 20日动量 / 20日 | -0.0290 | 0.2731 | -0.1062 | 45.7% |
| 20日动量 / 40日 | -0.0436 | 0.2794 | -0.1560 | 43.4% |
| 风险调整动量 / 10日 | -0.0161 | 0.2730 | -0.0589 | 46.0% |
| 风险调整动量 / 20日 | -0.0193 | 0.2705 | -0.0714 | 46.4% |
| 风险调整动量 / 40日 | -0.0335 | 0.2770 | -0.1208 | 45.7% |

两个因子在三个窗口上的 IC 均值都接近零。动量因子的截面预测能力很弱。

2×3 的 IC 时间序列图如图 9-3 所示。

![两个动量因子 × 三个前向收益窗口 IC 对比](images/q9-daily-work/02-momentum-ic-grid.png)

图 9-3 每个格子是一个“因子 × 前向窗口”组合的 IC 随时间变化。蓝色柱子是每日 IC，深蓝线是 60 日滚动均值，红色虚线是 IC 均值。可以看到 IC 在零附近大幅波动，正负交替，说明动量因子的预测能力非常不稳定。

关键发现来自**按波动率分组的 IC 分析**。按投资对象自身波动率分组的 IC 表现如表 9-5 所示。

**表 9-5 动量因子在高波动 vs 低波动投资对象上的 IC 表现**

| 因子 | 整体 IC | 高波动组 IC | 低波动组 IC | Spread |
|------|--------|-----------|-----------|--------|
| 20日动量 | -0.0290 | -0.0334 | -0.0119 | 0.0215 |
| 风险调整动量 | -0.0193 | -0.0354 | -0.0011 | 0.0343 |

直观对比如图 9-4 所示。

![风险调整动量因子：高波动 vs 低波动投资对象 IC 对比](images/q9-daily-work/02-grouped-ic-comparison.png)

### 结果解读

分组分析揭示了一个重要规律：**同一天内，高波动投资对象的动量 IC 明显差于低波动投资对象**。

波动率大的资产，价格噪音更大，动量信号就更容易被噪音淹没，指错方向。风险调整动量（RAM = 动量 / 波动率）在低波动组表现更好，说明除以波动率确实有帮助，但对高波动投资对象依然救不了。

结论：**一个因子不够**。动量因子在高波动环境下失灵，我们需要补充能感知波动率环境的因子，在高波动时调整策略行为。

---

## 9.3 从因子到策略：让数据说话

我们已经知道了动量因子的弱点。现在的问题是：这个发现能不能帮我们改进策略？

### 动手实验 3：补充因子 + 策略改进

我们一起把这份 spec 写出来。这次重点看两件新东西：**用包装类把因子的弱点翻译成过滤规则**，以及**教学简化声明**，也就是哪些参数是为了演示效果而非工程最优。

#### 第一、二段：上下文和任务描述

> **上下文**：在 `q9-daily-work.ipynb` 的第 2 步中已完成 25 只投资对象的动量因子 IC 分析和分组分析。已有变量：`all_data`、`vol_df`、`fwd_dfs`、`ic_results`、`compute_ic_series` 函数、`downloader`。本 spec 对应第 3 步：补充因子、总结发现、改进策略并回测对比。
>
> **任务描述**：在 notebook 中新建第 3 步的所有单元格：补充因子 IC、因子评估发现、策略改进框架、第 3 章三只 ETF 的基准回测、波动率过滤改进、对比分析。

#### 第三段：任务要求

任务要求段把“研究 → 工程”这条路具象化：因子评估发现“动量在高波动时容易出错”，怎么把这个发现翻译成代码里能跑的过滤规则？答案是**包装一个 optimizer**。保留原 optimizer 的所有行为，只在末尾“打补丁”。

> **任务要求**（摘要）：
>
> 1. 补充因子 IC：复用 `vol_df`（波动率因子）+ 新建 `rev_df = -df["close"].pct_change(5)`（短期反转因子），用 `compute_ic_series` 算 20 日前向 IC，三因子对比表
> 2. 第 3 章三只 ETF（510300.SS / 513100.SS / 518880.SS）+ 基准策略：`Threshold` 信号、`TopNRankingOptimizer(score_col="ram", n=3, filter_negative=True)`、`RebalanceFrequencyRule(interval_days=21)`、data_start=“2020-06-01”
> 3. 实现 `VolFilteredOptimizer` 包装类：接受 `base_optimizer`、`vol_threshold`、`market_vol` 参数；`optimize()` 先调用 base 拿到权重、再从 indicators 取最新日期查 market_vol、若 > 阈值则把所有持仓权重减半、多余分配给 CASH；暴露 `name` 和 `required_indicators`
> 4. 阈值取市场平均波动率的中位数（教学场景刻意“过滤狠”，50% 时间降低持仓比例，让对比效果显著）
> 5. 视觉契约：净值曲线对比图（figsize 14×7），基准蓝 #3498DB、过滤橙 #E67E22，归一化到起点 = 100，图例标注简化夏普

> 📌 **要点**：把研究发现的因子弱点翻译成代码里的过滤规则时，首选**包装一个新类**。保留原 optimizer 的所有行为，只在末尾“打补丁”。这样原 optimizer 不动、新行为可插可拔，未来想换过滤逻辑只换包装。
>
> 📌 **要点**：包装类要复用原类的契约接口。`VolFilteredOptimizer` 接收一个 `base_optimizer` 引用，复用它的 `required_indicators`，只在 `optimize()` 末尾插入波动率检查。这样调用方完全感知不到差别，可以无痛切换。

> 📌 **要点**：教学场景的参数选择必须在 spec 里声明“是简化、不是最优”。波动率阈值取中位数（50% 时间降低持仓比例）、持仓比例减半（不是 0.7× 也不是 0.3×），都是为了让对比效果显著的教学选择。spec 写明这一点，读者仿写时才知道哪些数字可以、应该被改。

#### 第四段：验收标准

> **验收标准**：三因子 IC 对比表 + 因子评估发现 markdown + 策略改进方向 markdown + 第 3 章三只 ETF 覆盖信息 + 基准回测指标 + 阈值与高波动天数占比 + 过滤策略回测指标 + 指标对比表 + 净值曲线对比图 + 动态分析文本 + 小结 markdown。

完整示例 spec 见配套仓库的 [`q9-daily-work/specs/spec-03-factor-to-strategy.md`](https://github.com/xingwudao/xquant-learning/blob/main/q9-daily-work/specs/spec-03-factor-to-strategy.md)。参考示例后，确认自己的 spec，再复制给 AI。

AI 编程工具执行完毕后，你的 notebook 里应该出现了三因子 IC 对比表、基准策略和波动率过滤策略的回测结果，以及净值曲线对比图。

这个实验做了什么？分三步走：

1. **补充因子**：在 25 只 ETF 上计算波动率因子和短期反转因子的 IC，与动量因子对比
2. **基准回测**：回到第 3 章的三只 ETF（沪深 300、纳指 100、黄金），用 oxq 复刻第 3 章的动量排名策略作为基准
3. **改进回测**：基于因子评估的发现（高波动时动量预测力下降），给策略加上波动率过滤。高波动时自动降低持仓比例

### 运行结果

三因子在 25 只 ETF、20 日前向窗口上的 IC 对比如表 9-6 所示。

**表 9-6 三因子 IC 对比（25 只 ETF，20 日前向窗口）**

| 因子 | IC 均值 | IC 标准差 | ICIR | IC>0 |
|------|--------|----------|------|------|
| 风险调整动量 | -0.0193 | 0.2705 | -0.0714 | 46.4% |
| 波动率 | 0.0020 | 0.2643 | 0.0076 | 49.1% |
| 短期反转 | 0.0183 | 0.2786 | 0.0659 | 52.6% |

三个因子各有侧重：动量看趋势、波动率看风险、反转看短期超跌。它们在不同环境下各有优势。

### 因子评估的发现

关键发现是：**动量因子在高波动投资对象上 IC 为负，在低波动投资对象上接近零**。波动率是动量因子失灵的主要原因。这个发现直接指向一个改进方向：在使用动量因子做决策时，应该考虑波动率环境。

### 因子评估的发现能改进策略吗？

我们在 25 只 ETF 上做了因子评估，现在回到第 2、3 章的三只 ETF（沪深 300、纳指 100、黄金），看看这些发现能不能改进策略。

回顾一下贯穿全书的两步筛选框架：

- **第一步：GDP 因子确定标的池**。在第 1 步中，GDP 因子帮我们从全球市场中筛出了有潜力的国家/资产类别
- **第二步：动量因子制定买入规则**。在标的池内，用动量排名决定买谁、买多少

因子评估告诉我们，动量在高波动时容易出错。如果我们能让策略在高波动时自动降低持仓比例，应该能改善表现。

基准策略与改进策略的回测对比如表 9-7 所示。

**表 9-7 基准（动量排名）vs 改进（波动率过滤）策略对比**

| 策略 | 累计收益 | 年化波动率 | 最大回撤 | 简化夏普 |
|------|---------|----------|---------|---------|
| 基准（动量排名） | +113.36% | 15.01% | -13.32% | 1.09 |
| 改进（波动率过滤） | +92.96% | 11.00% | -10.17% | 1.25 |

净值曲线对比如图 9-5 所示。

![因子评估：策略改进，基准 vs 波动率过滤](images/q9-daily-work/03-strategy-comparison.png)

基准策略的简化夏普是 1.09，最大回撤 -13.32%。波动率过滤后，简化夏普提高到 1.25，最大回撤降到 -10.17%，回撤改善 23.7%。因子评估告诉我们“高波动时动量 IC 翻负”，加上波动率过滤后回撤确实下降了。这不是靠猜，而是靠数据发现问题、改进策略。

### 结果解读

波动率过滤带来了明显的改善：简化夏普从基准的 1.09 提升到 1.25，最大回撤从 -13.3% 降低到 -10.2%，回撤改善了约 24%。

代价是什么？累计收益从 113% 降到了 93%。高波动时降低持仓比例，自然少赚了一些。但风险调整后的收益（简化夏普）更好了。这正是因子评估带来的价值：**不是让你赚更多，而是让你在承担同样风险的情况下赚得更稳**。

这个改进不是靠猜测，而是因子评估告诉我们的。IC 分析发现高波动时动量 IC 翻负，我们据此加了波动率过滤，回测验证了确实有效。这就是因子研究带来的改进价值。

---

## 9.4 量化交易员的一周长什么样

到这里你已经掌握了“找因子 → 评估 → 改进策略”的完整流程。但每天打开电脑，到底先做什么、再做什么？光知道“应该会做”还不够。收官章还要给你一份能打印贴在桌面的作业日历。

把前 8 章的内容串成一条**可执行的研究流**。一个量化交易员典型的一周长什么样？

### 每个交易日（≤ 30 分钟）

**开盘前（5 分钟）。** 看一眼策略的运行状态。监控仪表盘（第 8 章第 1 步）告诉你“是不是坏了”：滚动夏普还在 0 以上吗？回撤超过你预设的阈值了吗？相对沪深 300 表现还好吗？三个指标都正常，今天没事；任意一个亮红灯，列入待诊断清单。

**盘后（10-15 分钟）。** 拉今日的成交回报，跑一次执行对账（第 7 章第 4 步）：回测口径下应该成交什么，模拟交易或真实交易里实际成交了什么，滑点和佣金加起来是不是在你的预算内。差距稳定 = 健康；差距突然放大 → 列入待诊断清单。

**晚间（10 分钟）。** 把今天的关键事件写进迭代记录表（第 8 章第 3 步）。“今天恶化时段触发”、“某只 ETF 触发止损”、“市场状态切到高波动”。三个月后，这张表是你最值钱的资产。

### 每周（2-3 小时，建议周末）

**周一上午：监控扫描 + 诊断分流。** 把过去一周的滚动夏普、回撤、相对沪深 300 表现拉出来，对比上周：稳定还是恶化？如果有恶化时段，跑诊断三问（第 8 章第 2 步）：先排执行落差（外）、再查市场状态（中）、最后看策略本身（内）。

**周末半天：因子探索 / 假设实验。** 两种典型节奏二选一：
  - **因子探索（第 9 章流程）**：观察市场最近的特征 → 提一个新因子假设 → 跑 IC + 分组分析 → 决定是否纳入后续研究清单。
  - **假设驱动实验（第 8 章第 3 步）**：写下假设和验证标准 → 跑对照回测 → 看结果确认还是推翻假设。**纪律：标准定下来就不能事后改。**

### 每月（半天）

**月度复盘。** 拉本月的全部迭代记录，问三个问题：①假设确认率多少？②哪些假设被推翻、原因是什么？③下个月的研究方向？复盘的目的不是论功行赏，是让“疑”持续运转：上个月你以为对的东西，本月数据是不是还支持？

**工具升级。** 数据源更新了吗？open-xquant 有新模块要试吗？哪条 spec 你写第三遍了，可以模板化吗？这一步是给“做”持续松绑，让单位时间能做的实验更多。

### 每季度（1-2 天）

**季度策略检阅（第 5 章和第 6 章工具全用上）。** 跑一次完整的策略体检：基准对比、分年拆解、收益分布、参数敏感性、Walk-forward、交叉验证、规则负担。把第 5、6 章的检查工具完整跑一遍。任意一项亮红灯，启动重新设计或退役流程。

**视野扩展。** 读 1-2 篇论文 / 行业报告 / 优秀公开策略。不是为了立刻抄，是为了看看世界变到哪了。一个量化交易员退化的标志，是他几个月没读过任何外部输入。

### 一张可贴桌面的作业速查

把上面的节奏压成一张速查表，对应四个阶段和三个环节的位置如表 9-8 所示。

**表 9-8 量化交易员的作业速查**

| 周期 | 主要事项 | 对应阶段 | 对应环节 |
|------|---------|---------|---------|
| 每日 | 监控仪表盘 + 执行对账 + 写迭代记录 | 评估归因 + 执行交易 | 看 |
| 每周 | 监控扫描 + 诊断分流 + 因子/假设实验 | 评估归因 + 确定候选 / 制定规则 | 看 + 疑 + 做 |
| 每月 | 月度复盘 + 工具升级 | 评估归因，反过来影响下一轮研究 | 疑 + 做 |
| 每季度 | 策略完整体检 + 视野扩展 | 四个阶段全部检查 | 做 + 看 + 疑 |

**节奏比“努力”重要。** 量化不是靠加班赚钱，而是靠**让研究流程持续运转、让坏假设尽早被推翻、让好假设尽快被验证**。一周一次因子实验、一个月一次复盘、一个季度一次大检阅。只要持续做，三年后的你会让现在的你认不出来。

---

## 9.5 本章总结

### 策略进化路径

三步走，每一步都有明确的产出：

- **第 1 步**：因子概念 + IC 评估方法（从直觉到数据验证）
- **第 2 步**：动量因子 IC 分析（发现高波动是弱点）
- **第 3 步**：因子评估改进策略（波动率过滤提升简化夏普）

### 概念速查表

本章涉及的核心概念汇总如表 9-9 所示，方便随时回查。

**表 9-9 第 9 章核心概念速查**

| 概念 | 含义 | 类比 |
|------|------|------|
| 因子（Factor） | 描述资产或市场特征的可计算变量，可用于解释风险和收益、预测表现或辅助决策 | 挑餐厅时看的评分、距离、价格 |
| IC（信息系数） | 因子排名和收益排名的相似度，衡量因子预测能力 | 考试预测分和实际分的排名对比 |
| ICIR | IC 均值 / IC 标准差，衡量 IC 的稳定性 | 因子版的“性价比”：不仅要准，还要稳 |
| 截面分析 | 同一时间点比较不同投资对象 | 同一次考试比较不同学生的成绩 |
| 两步筛选框架 | GDP 因子确定标的池 + 动量因子制定买入规则 | 先选城市（宏观），再选餐厅（微观） |

### 本章核心认知

走完三个步骤后，本章最值得带走的三条认知如表 9-10 所示。

**表 9-10 第 9 章核心认知**

| 认知 | 来源 |
|------|------|
| 波动率是动量因子的关键弱点，高波动投资对象的 IC 明显更差 | 第 2 步 |
| 动量因子的截面预测力接近零，回测有效不等于因子有效 | 第 2 步 |
| 因子评估的价值来自发现因子的弱点，并把弱点转化为过滤规则 | 第 3 步 |

> 本章所有代码的可运行版本见配套仓库的 [`q9-daily-work/notebooks/q9-daily-work.ipynb`](https://github.com/xingwudao/xquant-learning/blob/main/q9-daily-work/notebooks/q9-daily-work.ipynb)

---

## 9.6 写给未来的你

这是全书的最后一章。回头看看你走过的路，把整本书带给你的东西浓缩成三件事：**四个阶段、三个环节、一种工作方式**。

**四个阶段你都走过。** 确定候选（第 2 章选 ETF）→ 制定规则（第 3 章定权重 / 第 4 章加买卖规则）→ 执行交易（第 7 章下单）→ 评估归因（第 5、6、8 章评估 / 防过拟合 / 监控诊断）。这一章的因子研究又反过来帮助你确定新的候选、制定新的规则。研究不是走到第 9 章就停止，而是带着新问题回到下一轮。

**做、看、疑三个环节你都练过。**

- **做**：把想法写成 spec，让 AI 把它变成可重复执行的规则。从第 1 章的均线，到第 3 章的权重分配方法、第 4 章的止损止盈、第 8 章的对照实验，每一次都是“做”。
- **看**：不允许“感觉还行”，所有判断都要落到指标上。年化、波动率、最大回撤、简化夏普、卡玛、索提诺、IC、ICIR，你已经收集了一整套尺子。
- **疑**：永远怀疑你的指标。第 1 章撞墙、第 6 章防过拟合检查、第 8 章诊断三问、第 9 章 IC 分组分析，你已经把“疑”从感觉训练成了流程。

会做、会看，但不会疑，最容易把漂亮结果当成真规律。这正是为什么“疑”和“做”“看”在本书同等重要。

**你不需要把重点放在手写代码上。** 每一步都是通过撰写清晰的 spec，让 AI 来执行。这不是偷懒，而是一种新的工作方式。**Spec 写作能力本身就是本书最重要的一份带走品**：从第 1 章的“照着写”，到第 3、4 章的“改参数”，到第 6 章起的“自己拆四段式”，再到第 9 章的“独立设计研究流程”，你的 spec 能力已经走完了三个台阶。

量化交易的门槛正在快速降低。以前需要金融学位、编程能力和大量资金。现在你至少可以用更低的成本开始练习：清晰的思考、数据验证的习惯、一个好用的 AI 编程工具。

但门槛降低不等于赚钱变容易了。市场不会因为工具变好就多给你钱。真正的竞争力在于：

- **更好的因子（做）**：别人没发现的数据关系，让“做什么”持续翻新
- **更快的迭代（看 + 疑）**：从假设到验证的周期越短越好，让“看 / 疑”快到几乎和市场同步
- **更强的纪律（疑）**：不被情绪左右，按数据做决策，不让“疑”被自己的乐观腐蚀

这三件事，恰好可以交给一个被研究纪律约束好的 AI Agent 去放大。具体怎么入门见本章末「拓展阅读」。

**下一轮研究还在你手里。** 让它更快、更稳、更聪明。祝你在量化的路上走得远。

---

## 拓展阅读

### 让 Agent 辅助你跑因子研究

整章你做的因子研究流程是高度结构化的：找因子、查 IC、看分组、改策略，每一步做什么、看什么指标都有明确标准。**结构化的流程最适合交给 AI Agent 执行。**

但通用 Agent 什么都能做，也容易什么都不够守规矩。拿来做量化研究时，它可能跳过 IC 评估，用不可复现的方式处理数据，或者对 IC=0.01 的因子说“还不错”。这些不是能力问题，而是研究纪律问题。

你要做的不是让 Agent “自由发挥”，而是给它清楚的身份约束、操作流程、工具限制和技能模板，让“什么都能做”变成“按规矩做”。

### 用 open-xquant 约束 Agent 的研究流程

open-xquant 在 `agent/bootstrap/` 目录提供了一套量化研究专用的 Agent 约束文件：

- **SOUL.md**：Agent 的身份和底线。最核心的约束是“不可复现 = 不可信 = 不可交易”
- **AGENT.md**：研究 SOP，每一步都要你确认才推进
- **TOOLS.md**：工具清单，告诉 Agent 哪些工具能用、该怎么用
- **skill 文件**：把策略构建、因子评估、交易执行等流程写成可复用技能

**怎么用？** 先阅读 open-xquant 仓库里的 `agent/bootstrap/` 说明，再按你的 Agent 工具配置对应文件。然后你用自然语言提出研究需求，Agent 按 SOP 引导你完成。具体安装步骤见 [open-xquant 仓库](https://github.com/xingwudao/open-xquant)。

### 更多因子、更复杂的组合：机器学习的入口

本课程只用了三个因子做演示。实际的量化研究中，因子数量可能是几十甚至上百个。当因子多了，手工写 if-else 规则来组合就不现实了。阈值怎么定？因子之间的交互关系怎么处理？

这时候就需要机器学习：

- **决策树 / 随机森林**：自动学习因子之间的分裂规则，可解释性好
- **梯度提升树（XGBoost / LightGBM）**：量化行业最常用的多因子组合方法
- **神经网络**：能捕捉更复杂的非线性关系，但需要更多数据

核心思路都一样：把因子当作特征，未来收益当作标签，让模型学出更合适的组合方式。这是你未来进入实战后可以深入探索的方向。但本书的主线已经够你跑很久了，**先把第 8 章的迭代流程跑顺，再考虑加机器学习**。
