Files
xquant-beginner/book/q9-daily-work.md
T

502 lines
35 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 第九章:持续寻找盈利机会:因子研究入门
前面八章,我们从零搭建了一个完整的量化策略——选标的、定仓位、择时买卖、验证有效性、避免过拟合、接入执行、持续迭代。策略跑起来了。
**然后呢?**
做完一个策略就结束了吗?量化交易员的日常到底在忙什么?
答案是:**因子研究**。
回头看前面八章的每一个关键决策——用 GDP 选国家、用动量排名买卖——背后都有一个共同的逻辑:找到一个数据指标,用它来做决策。这个数据指标,就是**因子(Factor)**。
量化交易员的日常工作,就是不断寻找新的因子、评估它们的预测能力、组合成更好的信号、改进策略。这一章,我们就来体验这个过程。
### 路线图
**完整跑通一个策略(第一章)→ 选什么标的(第二章)→ 每个买多少(第三章)→ 什么时候买卖(第四章)→ 怎么验证有效(第五章)→ 如何避免自欺欺人(第六章)→ 怎么真正执行(第七章)→ 如何持续改进(第八章)→ 持续找下一个 alpha(第九章本章)**
本章从“回顾已有决策”出发,正式引入因子概念,用三个步骤体验量化研究员的日常工作,三步的问题与方法对照如表 9-1 所示。
**表 9-1 第九章三步实验问题与方法对照**
| 步骤 | 问题 | 方法 |
|------|------|------|
| Step 1 | 前面的决策靠的是什么? | 回顾 → 引入因子概念 → IC 评估方法 → GDP 因子实验 |
| Step 2 | 动量因子到底靠不靠谱? | 25 只 ETF × 多个前向窗口 → IC 分析 → 分组诊断 |
| Step 3 | 因子评估能改进策略吗? | 补充因子 → 发现问题 → 波动率过滤 → 回测验证 |
(操作流程见前言“怎么使用这本书”。)
---
## 9.1 从直觉到因子
回顾一下前面课程中的两个关键决策,对照如表 9-2 所示。
**表 9-2 前面课程中的两个关键决策回顾**
| 章节 | 决策 | 用了什么数据 | 因子名称 | 因子类别 |
|------|------|-------------|---------|---------|
| 第二章选什么 | 选哪个国家的市场 | GDP 总量/增速 | GDP 因子 | 宏观因子 |
| 第三章买多少 | 涨的多买、跌的不买 | 风险调整动量 | 动量因子 | 动量因子 |
你可能没意识到,第二章和第三章里你已经在用因子了。**因子(Factor)**就是你做投资决策时参考的那个数据——GDP 高的国家更值得投、涨得好的多买一点。就像你挑餐厅会看评分、看距离、看价格,这些“参考指标”就是因子。
量化研究的日常工作,就是不断寻找和评估这些因子。
### 怎么评估一个因子好不好?
一个因子好不好,最直接的检验方式是:它的打分排名,和实际收益排名有多像?
这就是 **ICInformation Coefficient,信息系数)** 的核心思想。打个比方——IC 就像考试估分准不准:你预估的前 5 名跟实际前 5 名的重合度越高,说明你的判断越靠谱。
计算方法:每一期,把所有标的按因子值排名,再按下一期的实际收益排名,然后算两个排名的 Spearman 相关系数。Spearman 是相关系数的一种,专门看排名而不是数值——就像比较两次考试的“班级第几名”是否一致,而不是看具体分数。相关系数范围从 -1 到 +1:+1 表示因子排名和收益排名完全一致(完美预测),-1 表示完全相反,0 表示毫无关系。
**IC 均值**是多期 IC 的平均值,反映因子是否长期有效:
- 绝对值 > 0.03:有一定参考价值
- 绝对值 > 0.05:算不错的因子
- 绝对值 > 0.1:非常强的因子(实际中很罕见)
**ICIRIC 信息比率)** = IC 均值 / IC 标准差,衡量 IC 的稳定性。不仅要均值高,还要稳定(偶尔猜中一次的因子不算好,每年都稳定有效才算)——类似夏普比率的思路。
### 动手实验 1GDP 因子 IC 分析
我们一起把这份 spec 写出来。这次重点看两件新东西:**评估工具先讲清楚再用**,以及**因子计算的关键参数要点名到函数级**。
#### 起草上下文 + 任务
这是收官章第一份 spec,承接前八章的所有实验。上下文段把“学员已经在用因子但没意识到”这个起点交代清楚:
> **上下文**:学员已完成第二至八章。本 spec 对应 notebook `q9-daily-work.ipynb` 的 Step 1,从零引入因子概念和 IC 评估方法,并用 10 国 GDP 数据做第一个因子评估实验。
>
> **任务**:在 notebook 中创建 Step 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 在 [`specs/spec-01-factor-intro.md`](https://github.com/xingwudao/xquant-learning/blob/main/q9-daily-work/specs/spec-01-factor-intro.md)——复制给 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.1272ICIR = 0.3158。GDP 增速因子:IC 均值 = -0.0390ICIR = -0.1177。
GDP 总量因子的 IC 均值为正,说明 GDP 越大的国家,下一年股市表现确实有略好的倾向。虽然很弱、不稳定,但方向是对的。这就呼应了第二章的选择逻辑——我们根据 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 只标的。动量因子在更大范围内真的有效吗?它在什么环境下会失灵?要回答这些问题,我们需要扩大标的池,用 IC 来严格评估。
### 动手实验 2:动量因子 IC 分析
我们一起把这份 spec 写出来。这次重点看两件新东西:**IC 计算函数的签名要点名到参数**,以及**最低样本数阈值要写明白**。
#### 起草上下文 + 任务
> **上下文**:在 `q9-daily-work.ipynb` 的 Step 1 中已完成库导入和 GDP 因子 IC 实验。已有变量 `downloader`YFinanceDownloader)、`provider`LocalMarketDataProvider)。本 spec 对应 Step 2,把标的池从 10 只扩展到 25 只,用日频数据做动量因子的 IC 分析。
>
> **任务**:在 notebook 中新建 Step 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 在 [`specs/spec-02-momentum-ic.md`](https://github.com/xingwudao/xquant-learning/blob/main/q9-daily-work/specs/spec-02-momentum-ic.md)——复制给 AI,弹窗选「允许」。
AI 助手执行完毕后,你的 notebook 里应该出现了 25 只标的的覆盖表、IC 对比表和多张 IC 时间序列图。
这个实验做了什么?把标的池从 第二、三章 的 3 只扩展到 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` 的 Step 2 中已完成 25 只标的的动量因子 IC 分析和分组分析。已有变量:`all_data`、`vol_df`、`fwd_dfs`、`ic_results`、`compute_ic_series` 函数、`downloader`。本 spec 对应 Step 3——补充因子、总结发现、改进策略并回测对比。
>
> **任务**:在 notebook 中新建 Step 3 的所有单元格——补充因子 IC、因子评估发现、策略改进框架、第三章三只标的基准回测、波动率过滤改进、对比分析。
#### 起草要求:包装类 + 教学简化声明
要求段把“研究 → 工程”这条路具象化:因子评估发现“动量在高波动时容易出错”,怎么把这个发现翻译成代码里能跑的过滤规则?答案是**包装一个 optimizer**——保留原 optimizer 的所有行为,只在末尾“打补丁”。
> **要求**(摘要):
>
> 1. 补充因子 IC:复用 `vol_df`(波动率因子)+ 新建 `rev_df = -df["close"].pct_change(5)`(短期反转因子),用 `compute_ic_series` 算 20 日前向 IC,三因子对比表
> 2. 第三章三只标的(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 + 第三章三只标的覆盖信息 + 基准回测指标 + 阈值与高波动天数占比 + 过滤策略回测指标 + 指标对比表 + 净值曲线对比图 + 动态分析文本 + 小结 markdown。
完整 spec 在 [`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)——复制给 AI,弹窗选「允许」。
AI 助手执行完毕后,你的 notebook 里应该出现了三因子 IC 对比表、基准策略和波动率过滤策略的回测结果,以及净值曲线对比图。
这个实验做了什么?分三步走:
1. **补充因子**:在 25 只 ETF 上计算波动率因子和短期反转因子的 IC,与动量因子对比
2. **基准回测**:回到第三章的三只标的(沪深300、纳指100、黄金),用 oxq 复刻第三章的动量排名策略作为基准
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 上做了因子评估,现在回到 第二、三章 的三只标的(沪深300、纳指100、黄金),看看这些发现能不能改进策略。
回顾一下贯穿全书的两层选择框架:
- **第一层:GDP 因子选候选池**——在 Step 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 翻负」,加上波动率过滤后回撤确实下降了——这就是因子评估带来的 Alpha,不是靠猜,而是靠数据发现问题、改进策略。
### 结果解读
波动率过滤带来了明显的改善:夏普比率从基准的 1.09 提升到 1.25,最大回撤从 -13.3% 降低到 -10.2%——回撤改善了约 24%。
代价是什么?累计收益从 113% 降到了 93%——高波动时降仓位,自然少赚了一些。但风险调整后的收益(夏普)更好了。这正是因子评估带来的价值:**不是让你赚更多,而是让你在承担同样风险的情况下赚得更稳**。
这个改进不是靠猜测,而是因子评估告诉我们的——IC 分析发现高波动时动量 IC 翻负,我们据此加了波动率过滤,回测验证了确实有效。这就是因子研究带来的 Alpha。
---
## 9.4 量化交易员的一周长什么样
到这里你已经掌握了“找因子 → 评估 → 改进策略”的完整流程。但每天打开电脑,到底先做什么、再做什么?光知道“应该会做”还不够,章名《量化交易员的日常工作》得给你一份能打印贴在桌面的作业日历。
把前八章的动作串成一条**可执行的研究流**——一个量化交易员典型的一周长什么样:
### 每个交易日(≤ 30 分钟)
**开盘前(5 分钟)。** 看一眼策略的实盘运行状态。监控仪表盘(第八章 Step 1)告诉你“是不是坏了”——滚动夏普还在 0 以上吗?回撤超过你预设的阈值了吗?相对沪深300超额收益还为正吗?三个指标全绿,今天没事;任意一个亮红灯,列入待诊断清单。
**盘后(10-15 分钟)。** 拉今日的成交回报,跑一次执行对账(第七章 Step 4)——回测口径下应该成交什么、实盘实际成交了什么、滑点和佣金加起来是不是在你的预算内。差距稳定 = 健康;差距突然放大 → 列入待诊断清单。
**晚间(10 分钟)。** 把今天的关键事件写进迭代记录表(第八章 Step 3)。“今天恶化时段触发”、“某只 ETF 触发止损”、“市场状态切到高波动”——三个月后这张表是你最值钱的资产。
### 每周(2-3 小时,建议周末)
**周一上午:监控扫描 + 诊断分流。** 把过去一周的滚动夏普、回撤、超额收益拉出来,对比上周——稳定还是恶化?如果有恶化时段,跑诊断三问(第八章 Step 2):先排执行落差(外)、再查市场状态(中)、最后看策略本身(内)。
**周末半天:因子探索 / 假设实验。** 两种典型节奏二选一:
- **因子探索(第九章流程)**:观察市场最近的特征 → 提一个新因子假设 → 跑 IC + 分组分析 → 决定是否纳入策略候选池。
- **假设驱动实验(第八章 Step 3)**:写下假设和验证标准 → 跑对照回测 → 看结果确认还是推翻假设。**纪律:标准定下来就不能事后改。**
### 每月(半天)
**月度复盘。** 拉本月的全部迭代记录,问三个问题:①假设确认率多少?②哪些假设被推翻、原因是什么?③下个月的研究方向?复盘的目的不是论功行赏,是让“疑”持续运转——上个月你以为对的东西,本月数据是不是还支持?
**工具升级。** 数据源更新了吗?open-xquant 有新模块要试吗?哪条 spec 你写第三遍了——可以模板化吗?这一步是给“做”持续松绑——让单位时间能做的实验更多。
### 每季度(1-2 天)
**季度策略检阅(第五 + 六章工具全用上)。** 跑一次完整的策略体检:基准对比、分年拆解、收益分布、参数敏感性、Walk-forward、交叉验证、规则负担——五把铲子(含第五章敏感性)每把都挥一次。任意一项亮红灯,启动重新设计或退役流程。
**视野扩展。** 读 1-2 篇论文 / 行业报告 / 优秀公开策略——不是为了立刻抄,是为了看看世界变到哪了。一个量化交易员退化的标志,是他几个月没读过任何外部输入。
### 一张可贴桌面的作业速查
把上面的节奏压成一张速查表,对应飞轮和三字要点的位置如表 9-8 所示。
**表 9-8 量化交易员的作业速查**
| 周期 | 主要动作 | 飞轮位置 | 三字要点 |
|------|---------|---------|---------|
| 每日 | 监控仪表盘 + 执行对账 + 写迭代记录 | 归因层 + 执行层 | 看 |
| 每周 | 监控扫描 + 诊断分流 + 因子/假设实验 | 归因层 + 候选/组合层 | 看 + 疑 + 做 |
| 每月 | 月度复盘 + 工具升级 | 归因层(反哺起点) | 疑 + 做 |
| 每季度 | 五把铲子全检阅 + 视野扩展 | 全飞轮 | 做 + 看 + 疑 |
**节奏比“努力”重要。** 量化不是靠加班赚钱——是靠**让飞轮持续转、让坏假设尽早被推翻、让好假设尽快上线**。一周一次因子实验、一个月一次复盘、一个季度一次大检阅——只要持续做,三年后的你会让现在的你认不出来。
---
## 9.5 本章总结
### 策略进化路径
三步走,每一步都有明确的产出:
- **Step 1**:因子概念 + IC 评估方法(从直觉到数据验证)
- **Step 2**:动量因子 IC 分析(发现高波动是弱点)
- **Step 3**:因子评估改进策略(波动率过滤提升夏普)
### 概念速查表
本章涉及的核心概念汇总如表 9-9 所示,方便随时回查。
**表 9-9 第九章核心概念速查**
| 概念 | 含义 | 类比 |
|------|------|------|
| 因子(Factor) | 用来预测资产收益的数据指标 | 挑餐厅时看的评分、距离、价格 |
| IC(信息系数) | 因子排名和收益排名的相似度,衡量因子预测能力 | 考试预测分和实际分的排名对比 |
| ICIR | IC 均值 / IC 标准差,衡量 IC 的稳定性 | 夏普比率的因子版——不仅要准,还要稳 |
| 截面分析 | 同一时间点比较不同标的 | 同一次考试比较不同学生的成绩 |
| 两层选择框架 | GDP 因子选候选池 + 动量因子做择时 | 先选城市(宏观),再选餐厅(微观) |
### 本章核心认知
走完三个 Step 后,本章最值得带走的三条 q9 独有认知如表 9-10 所示——其余共通认知由 9.6 飞轮 + 三字要点收束。
**表 9-10 第九章核心认知**
| 认知 | 来源 |
|------|------|
| 波动率是动量因子的关键弱点——高波动标的的 IC 明显更差 | Step 2 |
| 动量因子的截面预测力接近零,回测有效不等于因子有效 | Step 2 |
| 因子评估带来的 Alpha 来自发现因子的弱点,并把弱点转化为过滤规则 | Step 3 |
> 本章所有代码的可运行版本见 `notebooks/q9-daily-work.ipynb`
---
## 9.6 写给未来的你
这是全书的最后一章。回头看看你走过的路——把整本书带给你的东西,浓缩成一张图:**飞轮 + 三字要点 + 一句口号**。
**飞轮的四层你都站过。** 候选层(第二章选 ETF)→ 组合层(第三章定仓位 / 第四章加规则)→ 执行层(第七章下单)→ 归因层(第五、六、八章评估 / 防过拟合 / 监控诊断)→ 这一章的因子研究反过来回到候选与组合层,进入下一圈。这就是“飞轮转完一圈”——每转一圈都比上一圈聪明一点。
**三字要点你都练过。**
- **做** —— 把动作写成 spec,让 AI 把它变成可重复执行的规则。从第一章的均线、第三章的三种信号、第四章的止损止盈、到第八章的对照实验,每一次都是“做”。
- **看** —— 不允许“感觉还行”,所有判断都要落到指标上。年化、波动率、最大回撤、夏普 / 卡玛 / 索提诺、IC、ICIR——你已经收集了一整套尺子。
- **疑** —— 永远怀疑你的指标。第一章撞墙、第六章四把铲子、第八章诊断三问、第九章 IC 分组——你已经把“疑”从感觉训练成了流程。
**一句口号你能复述了:「做要规则、看要指标、还要怀疑你的指标。」** 会做、会看,但不会疑,最容易在某些时候把赚到的钱加倍还给市场。这正是为什么“疑”和“做”“看”在本书同等重要。
**你没有写过一行代码**——每一步都是通过撰写清晰的任务说明书(spec),让 AI 来执行。这不是偷懒,这是未来量化的工作方式。**Spec 写作能力本身就是本书最重要的一份带走品**:从第一章的“复制临摹”,到第三、四章的“改参数”,到第六章起的“自己拆四段式”,到第九章的“独立设计研究流程”——你的 spec 能力已经走完了三个台阶。
量化交易的门槛正在快速降低。以前需要金融学位 + 编程能力 + 大量资金,现在你只需要:清晰的思考 + 数据验证的习惯 + 一个好的 AI 助手。
但门槛降低不等于赚钱变容易了。市场不会因为工具变好就多给你钱。真正的竞争力在于:
- **更好的因子(做)**:别人没发现的数据关系,让“做什么”持续翻新
- **更快的迭代(看 + 疑)**:从假设到验证的周期越短越好,让“看 / 疑”快到几乎和市场同步
- **更强的纪律(疑)**:不被情绪左右,按数据做决策,不让“疑”被自己的乐观腐蚀
这三件事,恰好可以交给一个被研究纪律约束好的 AI Agent 去高速放大——具体怎么入门见本章末「拓展阅读」。
**飞轮在你手里——下一圈,让它转得更快、更稳、更聪明。** 祝你在量化的路上走得远。
---
## 拓展阅读
### 让 Agent 替你跑因子研究
整章你做的因子研究流程是高度结构化的——找因子、查 IC、看分组、改策略,每一步做什么、看什么指标都有明确标准。**结构化的流程最适合交给 AI Agent 执行。**
但通用 AgentOpenClaw、Cursor Agent 等)什么都能做但什么都做不精——拿来做量化研究容易跳过 IC 评估、用不可复现的方式处理数据、对 IC=0.01 的因子说“还不错”。这些都是研究纪律问题。
**Harness Engineering(缰绳工程)** —— 给 Agent 装上身份约束、操作流程、工具限制和技能模板,让“什么都能做”变成“按规矩做”。比喻来自驯马:马很强壮但需要缰绳,Agent 能力强但需要研究纪律。
### 用 open-xquant 让 Agent 接管你的因子研究
open-xquant 在 `agent/bootstrap/` 目录提供了一套量化研究专用的 harness:
- **SOUL.md** —— Agent 的身份和底线。最核心的约束是 **“不可复现 = 不可信 = 不可交易”**,通用 Agent 不会自带这条量化纪律
- **AGENT.md** —— 研究 SOP(5 阶段:业务约束 → 目标 → 5 要素假设 → 数据准备 → 逐层构建),每一步都要你确认才推进,不会偷跑
- **TOOLS.md** —— 工具清单(通过 MCP Server 暴露 62 个 SDK 工具)
- **19 个 skill 文件** —— 覆盖从策略构建、因子评估到实盘交易的全流程
**怎么用?**`agent/bootstrap/` 覆盖 OpenClaw 默认文件 → 让 Agent 自行安装 open-xquant skills → 配置 MCP Server。然后你用自然语言提研究需求,Agent 按 SOP 引导你完成。具体安装步骤见 [open-xquant 仓库](https://github.com/xingwudao/open-xquant)。
### 更多因子、更复杂的组合——机器学习的入口
本课程只用了三个因子做演示。实际的量化研究中,因子数量可能是几十甚至上百个。当因子多了,手工写 if-else 规则来组合就不现实了——阈值怎么定?因子之间的交互关系怎么处理?
这时候就需要机器学习:
- **决策树 / 随机森林**:自动学习因子之间的分裂规则,可解释性好
- **梯度提升树(XGBoost / LightGBM)**:量化行业最常用的多因子组合方法
- **神经网络**:能捕捉更复杂的非线性关系,但需要更多数据
核心思路都一样:把因子当作特征,未来收益当作标签,让模型学出最优的组合方式。这是你未来进入实战后可以深入探索的方向——但本书的主线已经够你跑很久了,**先把第八章的迭代闭环跑顺,再考虑加机器学习**。
---
## 反馈与读者群
如果你发现本章有错别字、概念不清或实验结果不一致,欢迎
[提交 GitHub Issue](https://github.com/xingwudao/xquant-beginner/issues/new/choose)。
课程、正式书和后续更新见
[xquant.shop/courses](https://xquant.shop/courses)。
添加作者微信 `xquanter` 进入读者群。请备注:`XQuant 读者`