# 第二章：选出你的投资宇宙：3 只 ETF

第一章我们用一只沪深300ETF 体验了量化策略的完整闭环——从下载数据、定投回测、基准对比，到均线择时、参数扫描、样本外测试。一路走下来，你已经亲手验证了一个策略从“看起来有效”到“撞上过拟合”的全过程。

但有个问题我们始终没碰：只买一只 ETF 够吗？直觉告诉你，把鸡蛋放在一个篮子里不够安全，应该广撒网、分散风险。这个直觉对不对？“分散”到底该怎么分？随便多买几只就算分散了吗？这些问题，就是本章要回答的。

不过在动手之前，我们要先把“市场上到底有什么可以买”这个最基础的问题搞清楚——第一章直接给了你一只沪深300ETF，但你还没正式见过投资市场的全图。

### 路线图

从第二章开始，我们要把第一章的闭环拆开，一步步做扎实：

**选什么资产（第二章 本章）→ 每个买多少（第三章）→ 什么时候买卖（第四章）→ 怎么验证有效（第五章）**

本章七节按“准备 → 实验 → 收尾”三段组织，对照如表 2-1 所示。

**表 2-1 第二章七节的三段组织**

| 节 | 内容 | 类型 |
|----|------|------|
| 2.1 - 2.2 | 你到底能买什么 → 工具升级（引入 open-xquant） | 准备 |
| 2.3 - 2.5 | 选什么类型 → 选哪个地区 → 怎么保护组合 | 实验 |
| 2.6 - 2.7 | 回头看 + 本章总结 | 收尾 |

---

## 2.1 你到底能买什么？

直接给你答案：**新手不要买个股，从 ETF 开始。** 等你通过 ETF 理解了市场运作，再去研究其他资产也不迟。

为什么？新手的典型特点：不懂选股、资金有限、时间有限、心态不稳。而 ETF 恰好能解决这些问题（如表 2-2 所示）：

**表 2-2 ETF 解决新手四大痛点**

| 新手痛点 | ETF 如何解决 |
|---------|-------------|
| 不懂选股 | 已经帮你选好了一篮子股票 |
| 资金有限 | 一手 ETF 可能只要几百块 |
| 时间有限 | 不用研究单个公司，买指数 = 买这个国家的整体经济 |
| 心态不稳 | 分散持有降低波动，不会因一只股票暴雷而血本无归 |

一个无奈的现实：**大多数散户的长期收益低于指数。** 既然如此，为什么不直接买指数？本章接下来的实验，就是带你看清“为什么不要买个股、怎么用 ETF 构建投资组合”。

> ETF 之外还有股票、债券、期货期权；A 股之外有美股、港股；具体可交易的资产清单、各类资产的赚钱方式、券商怎么选——见本章末「拓展阅读」。

---

## 2.2 工具升级：从手写脚本到利用框架

2.1 把“为什么不要买个股、怎么用 ETF”的结论给了你。下一节就要动手实验。但在动手之前，先认识一下接下来三个实验都会用到的工具：open-xquant。

第一章手写循环跑通了一个均线策略——AI 帮你写了几十行代码就实现了。能跑，但稍有量化经验的人都知道：**真正的量化策略不是这么写的。**

### 你需要的不是更多代码，而是一套经过实战检验的体系

技术指标网上一搜就有，让 AI 抄一份代码也不难。但**怎么把指标变成一个真正可上线的策略**——怎么定义信号、怎么组合规则、怎么管仓位、怎么样本外验证、怎么避开常见陷阱——这套体系是多年自营交易桌上**踩过坑、亏过钱、改过的纪律**，看几本书内化不了。

新手自己摸索，要走的弯路三年起步。但用对的框架，等于让一个老手在背后**约束你的每一步**。

前提是：这个框架真的来自一个老手。

### quantstrat：业界公认的方法论参考

R 语言生态里有一个叫 **quantstrat** 的开源框架——它在量化策略开发领域久负盛名。主要作者 Brian Peterson 是一位有十几年自营交易实战经验的量化从业者，他公开发布的白皮书《Developing & Backtesting Systematic Trading Strategies》（[strat_dev_process.pdf](http://braverock.com/brian/strat_dev_process.pdf)）描述了一套从“想法”到“可上线策略”的完整流程，是业界教学和入职培训的常见教材。

一句话：**quantstrat 凝结了一位资深量化从业者多年的实战经验。**

### open-xquant：用 Python 致敬 quantstrat 的方法论

quantstrat 体系完整，但作为本书的学习工具，它有两个不利因素：

1. **R 语言在 AI 编程生态里是少数派**。主流 AI 编程助手对 Python 的支持远好于 R。你写 spec 让 AI 写代码，它写 Python 流畅，写 R 经常磕碰
2. **R 的指标 / 数据库迭代慢**。Python 这边 pandas / NumPy / scikit-learn / akshare / yfinance 都很活跃，新指标新数据源出来很快就有 Python 实现

直接学 R + quantstrat，方法论地道，但后续扩展、找数据、用 AI 都不顺手。

**open-xquant**（[github.com/xingwudao/open-xquant](https://github.com/xingwudao/open-xquant)）就是为此存在的：

- **沿用 quantstrat 的体系、理念、流程**——尤其是 Peterson 那份 strat_dev_process.pdf 的方法论。从顶层架构（Strategy / Signal / Rule / Position）到验证流程，都参照 quantstrat 的设计思路
- **用 Python 独立实现**——融入 pandas / NumPy 等数据科学栈，AI 能直接对话
- **Agent-First 设计**——你在 spec 里描述“做等权信号”、“做参数扫描”，AI 就知道调用哪个模块；框架约束 AI “怎么做”，**让结果稳定可复现**

> open-xquant 是 quantstrat 的 Python **致敬实现**——继承的是体系、理念、流程，而非代码（不是逐行 R → Python 翻译）。Brian Peterson 等人的工作以 GPL-3 开源，本书谨此致谢。

### 顺带解决：AI 编程的“不可复现”

前言里说过，AI 编程能力的跃迁是这本书能写出来的关键基础。但 AI 编程用在量化交易上有个绕不过去的问题：**不可复现**。

AI 大模型的底层原理是概率采样。同一份 spec，AI 今天写出来的代码和明天写出来的，细节上可能不一样。写网页、画图表无所谓；量化交易不行——同一个策略跑两遍结果不一样，你根本无法判断它到底有没有效。**不可复现 = 不可信 = 不可交易。**

open-xquant 的 Agent-First 接口把“框架做什么”约束得很死——AI 拼接的是积木，不是从零写代码。这样既享受 AI 编程的便利，又保证两次跑出来的结果一样。

> 你已经在「开始动手之前」的环境配置脚本里装过 open-xquant 了——如果当时漏装，现在补装：
>
> `pip install open-xquant[yfinance,akshare]`
>
> 把这行命令复制给 AI 编程工具，让它在终端里执行。遇到网络报错，把错误信息贴给 AI。

---

## 2.3 先拿几只股票试试

第一章用的是沪深300ETF，但你日常听到的投资故事，主角往往是个股——贵州茅台涨了多少倍、中国平安跌了多少、招商银行分红有多高。这些家喻户晓的大公司，能不能直接拿来跑第一章学的均线策略？

直觉告诉你：这些都是 A 股里最优秀的公司，策略在它们身上应该也能跑出不错的结果。真的吗？我们来试试——先猜后验。

### 动手实验 1：个股 vs ETF 信号质量对比

我们一起把这份 spec 写出来。这次重点看两件新东西：**怎么给 AI 一个能查到接口的入口**（让它有据可依地调框架），以及**怎么把对照实验的“唯一变量”锁死**。

（下文 spec 里把 open-xquant 简写为 oxq——和 numpy 简写为 np 一样的意思。）

#### 起草上下文 + 任务

> **上下文**：本章探讨“该选哪些标的”。第一步——先拿大家熟悉的几只个股试一遍第一章学的均线策略，跟沪深300ETF 摆在一起看效果。
>
> **任务**：在 notebook `q2-what-to-buy.ipynb` 中新建代码单元格，对 5 只 A 股个股 + 沪深300ETF 跑均线策略，让你直观看到个股信号的嘈杂。

#### 起草要求：给 AI 接口入口 + 锁死唯一变量

要求段是这份 spec 的关键。这是 open-xquant 框架第一次出场，要求段开头给 AI 一个能查到接口的入口（教程链接），而不是把框架的每个接口签名抄进 spec：

> **要求**：
>
> 1. 数据：沪深300ETF（`510300.SS`）+ 5 只 A 股（`600519.SS` 茅台 / `000858.SZ` 五粮液 / `601318.SS` 中国平安 / `000001.SZ` 平安银行 / `600036.SS` 招商银行），时间窗 `2023-01-01` 到 `2026-01-01` 共 3 年
> 2. 6 个标的跑同一个策略：均线交叉信号（SMA(1) 上穿 SMA(20)）、等权入场、信号反转出场——每个标的都是独立的单资产投资宇宙。具体 oxq 模块（`Engine.run` / `Crossover` / `EqualWeightOptimizer` / `ExitRule`）请参考 [open-xquant 教程](https://github.com/xingwudao/open-xquant/tree/main/examples/tutorials)
> 3. 取每个标的的累计收益率和年化波动率
> 4. 两张横向柱状图（figsize 10×8）：上图收益率（沪深300蓝色高亮、其余按正负绿/红），下图年化波动率（沪深300蓝色、个股灰色）

oxq 里 `EqualWeightOptimizer` 就是把钱平均分给入选的标的，`ExitRule` 就是按设定的反转条件平仓——你不需要钻接口细节，AI 会去查教程。

> 📌 **要点**：用到框架时，**给 AI 一个能查到接口的入口**（如教程链接），再让它写代码。不要把 `Engine.run(rules=[...], router=..., receiver=...)` 这种接口签名硬抄进 spec——框架升级一次，硬抄的接口就全部失效；给一个入口让 AI 现查现用，经得起框架升级。

> 📌 **要点**：对照实验只留一个变量。这份 spec 让 6 个标的跑**完全一样**的策略——同样的均线周期、同样的时间窗、同样的入场出场规则——这样最终柱状图上的差异就只能归因于“标的本身”。spec 里“6 个标的、同一个策略”必须写死，任何“看 AI 心情”的余地都不能留。

#### 起草结果呈现

> **结果呈现**：每只标的打印 `代码（中文名）: 收益率 X.XX%  年化波动率 X.XX%` + 两张横向柱状图 + 三句结论：「5 只个股结果天差地别」「个股波动率 XX%-XX%、ETF 只有 XX%」「组合能对抗波动，ETF 就是一种组合」。

完整 spec 在 [`specs/spec-01-signal-quality.md`](https://github.com/xingwudao/xquant-learning/blob/main/q2-what-to-buy/specs/spec-01-signal-quality.md)——复制给 AI，弹窗选「允许」。

AI 助手执行完毕后，你的 notebook 里应该出现了一组数字和一张柱状图。

open-xquant 的工作方式和你写 spec 很像：你不用描述 AI 该怎么一步步执行，只需要清楚地说明你要什么。比如“用 20 日均线作为信号，上穿就买、下穿就卖”——框架替你处理所有执行细节。

这里还出现了一个新指标：**年化波动率（Annualized Volatility）** ——价格上下波动的剧烈程度，数字越大说明越颠簸。就像坐车，波动率高就是过山车，波动率低就是高铁。年化是把每天的波动换算成一年的尺度，方便理解。

**回到实验设计本身**——6 只标的、同一个策略、同样的参数，唯一的变量是标的本身。结果如图 2-1 所示。

![个股 vs ETF 信号质量对比](images/q2-what-to-buy/01-signal-quality.png)

### 读懂这张图

先看图 2-1 上半部分（收益率）：同样的 20 日均线策略，跑在 5 只个股上的结果反差大得超出直觉——从 +34.59% 到 -7.47%，最好和最差之间差了 40 多个百分点。你选中国平安就赚了，选贵州茅台就亏了。同一个策略、同一个时间段，结果完全取决于你碰巧选了哪只股票。

再看图 2-1 下半部分（年化波动率）：个股年化波动率普遍在 16%-21%，而沪深300ETF 只有 13.61%。这不是巧合——沪深300ETF 包含 300 只股票，个股各自的噪音互相抵消，波动被分散掉了。均线策略在这种“干净”的趋势信号上，才能正常发挥作用。

**数据说了算：单只股票波动大、不可预测，但组合能对抗这种波动。** ETF 就是一种组合。第一章我们说过，ETF 是“一篮子股票的打包组合”——当时的理由是“适合新手”。现在你有了更深的理解：组合不只是省事，它能从根本上降低噪音，让策略信号更干净。

这个发现让问题一下子简化了——从“在 5000 只个股里选哪只”变成了“在几百只 ETF 里选哪只”。范围缩小了一个数量级。但几百只 ETF 还是太多，怎么继续缩小范围？

---

## 2.4 几百只 ETF，选哪几只？

用 ETF 没问题了，但全球 ETF 有几百只，覆盖美国、中国、欧洲、日本、新兴市场……总不能全买。怎么缩小范围？

最直觉的思路：**经济最强的国家，资本市场应该最有潜力。** 一个国家的 GDP 越高，说明这个国家创造财富的能力越强，企业整体的盈利能力也应该更强——股市自然有更大的上涨空间。**这只是起手的猜测，不是铁律**——日本九十年代后 GDP 全球前列但股市低迷十年就是反例。但作为“圈池子”的起点，它有数据支撑。下一步不是直接相信它，而是用数据验证。先猜后验，拿数据看看。

### 动手实验 2：用 GDP 数据锁定投资方向

同样的写法套路，这次重点演示两件没碰过的事：**怎么把宏观数据源接进来**，以及**怎么把“先猜后验”写进 spec 内部的打印语句**。

#### 起草上下文 + 任务

接续 spec-01——你已经知道“个股嘈杂、用 ETF”，这份 spec 解决“几百只 ETF 怎么缩范围”的开放问题：

> **上下文**：在 `q2-what-to-buy.ipynb` 中已有 spec-01 的“个股 vs ETF”实验代码，读者已理解“用 ETF 替代个股”。当前开放问题：**全球 ETF 几百只，怎么缩小范围？**
>
> **任务**：用全球主要经济体的 GDP 数据支撑“锁定中美”的选择，并下载对应的两只 ETF（沪深300ETF + 纳指100ETF）。

#### 起草要求：宏观数据源 + 两步式接口

宏观数据（GDP）和行情数据（ETF 价格）来自不同源、有不同的更新频率，但都包在 oxq 同一种“先 download → 再 read”的两步式接口里：

> **要求**：
>
> 1. 用世界银行数据下载器拉全球前 10 大经济体 GDP（`["USA", "CHN", "DEU", "JPN", "IND", "GBR", "FRA", "ITA", "BRA", "CAN"]`），时间窗 2020-2024 共 5 年（取最新一年使用，前 4 年留作缓冲、防止当年数据延迟发布）
> 2. 读出数据，取最新一年，单位换算为万亿美元
> 3. 横向柱状图（figsize 10×6）：从高到低排列，中红美蓝高亮、其余灰色，柱子右侧标具体数值，标题「全球前 10 大经济体 GDP」
> 4. 用 yfinance 数据下载器拉两只 ETF：`510300.SS`（沪深300ETF，代表中国核心资产）+ `513100.SS`（纳指100ETF，A 股上市的美国科技龙头），时间窗 `2021-01-01` 到 `2026-01-01`
> 5. 读出数据，画归一化走势图（figsize 12×6，起点=100，两色实线，图例标中文名）
>
> 具体 oxq 模块（`WorldBankDownloader` / `read_factor` / `YFinanceDownloader` / `LocalMarketDataProvider.get_bars`）请参考 [open-xquant 教程](https://github.com/xingwudao/open-xquant/tree/main/examples/tutorials)。

> 📌 **要点**：用一个数据锚点支撑你的选择。这份 spec 把“数据源 → 锚点 → 选择”三段写顺：先取 GDP 数据（来源），再算“中美遥遥领先”（锚点），最后下载对应 ETF（选择）。三段缺一不可，缺锚点段就成了“凭印象选标的”。

> 📌 **要点**：spec 内部就要把“先猜后验”的三段闭环打印出来。结果呈现里**预先写好**「最直觉的思路：经济最强的国家，资本市场应该最有潜力」（猜想）→「数据说了算：锁定中国 + 美国」（验证）→「但中美都是股市，同时下跌怎么办？」（开放下一份 spec 的问题）。让 AI 跑完 notebook，**结果会自己讲故事**——不用你回头补叙事。

#### 起草结果呈现

> **结果呈现**：GDP 柱状图 + 两条 ETF 归一化曲线 + 三句打印（猜想/验证/开放问题，见上方要点）。

完整 spec 在 [`specs/spec-02-gdp-anchor.md`](https://github.com/xingwudao/xquant-learning/blob/main/q2-what-to-buy/specs/spec-02-gdp-anchor.md)——复制给 AI，弹窗选「允许」。

AI 助手执行完毕后，你的 notebook 里应该出现了两张图和一组分析文字。

这里用到的 GDP（国内生产总值）是一个国家一年内创造的商品和服务的总价值，是衡量经济规模最常用的指标。GDP 告诉我们中美经济最强，接下来就去拿对应的 ETF 数据。`510300.SS` 是沪深300ETF——跟踪沪深两市市值最大的 300 家公司，代表中国核心资产的整体表现。`513100.SS` 是纳指100ETF（即纳斯达克100ETF）——在 A 股上市，跟踪纳斯达克100指数，涵盖苹果、微软、英伟达等美国科技成长龙头。两只 ETF 都在 A 股交易，交易日历完全一致。

走势对比图中出现了一个新概念：**归一化（Normalization）** ——把不同起点的价格都调整到同一个起跑线（100），这样才能公平比较谁涨得多、谁跌得多。两只 ETF 单价不同，直接放在一张图上没法比。归一化就像让两个选手从同一条起跑线出发——起点都是 100，后面谁高谁低，就是谁涨得多谁跌得多。

全球前 10 大经济体 GDP 对比如图 2-2 所示，两只 ETF 的归一化走势如图 2-3 所示。

![全球 GDP 排名](images/q2-what-to-buy/02-gdp-ranking.png)

![沪深300ETF vs 纳指100ETF 归一化走势](images/q2-what-to-buy/03-etf-comparison.png)

### 读懂这两张图

先看图 2-2 GDP 柱状图：美国和中国遥遥领先，合计占全球 GDP 的约 40%，远超第三名的德国。第一梯队和第二梯队之间的差距不是一点半点——美国约 29 万亿美元、中国约 18 万亿美元，而德国只有约 4.5 万亿美元。经济体量决定了资本市场的深度和广度，选 ETF 自然要从最大的两个经济体入手。对应的投资标的也很明确：沪深300ETF 代表中国最大的 300 家上市公司，纳指100ETF 代表美国科技成长的龙头企业。**数据说了算：锁定中美。**

再看图 2-3 归一化走势：两条线的走势并不完全同步——有时候纳斯达克涨而沪深300在调整，有时候沪深300反弹而纳斯达克在横盘。这其实是好事。如果两个市场完全同步涨跌，那买两只和买一只没有本质区别。正是因为它们的节奏不同，当一个市场表现不好的时候，另一个市场可能在涨，组合整体的波动就被平滑了。这就是“分散”的真正含义——不是随便多买几个，而是买涨跌节奏不同的标的。

但仔细想想，你可能会有一个担忧：中美毕竟都是股票市场。如果遇到全球性的恐慌——比如 2022 年的全球加息周期——两个市场有可能一起跌。图 2-3 里其实也能看到这样的时段。那怎么办？

都是股市，同涨同跌并非不可能。我们需要一个“不同步”的东西来保护组合——一个在股市下跌时不一定跟着跌、甚至可能逆势上涨的资产。这样的东西存在吗？

---

## 2.5 加什么能保护组合？

我们要找的是一个在股市下跌时不一定跟着跌的东西。债券、现金都是候选，但还有一个更经典的选项——每次股市大跌的新闻里，总会提到“资金涌入黄金避险”。黄金常被称为“避险资产”，意思是当股市恐慌的时候，投资者倾向于把钱从股市撤出，转移到黄金这种“硬通货”上，推高金价。

这个说法听起来有道理，但“听起来有道理”不是我们做决策的依据。先猜后验——我们来用数据验证：黄金和股市的涨跌到底有没有关系？如果真的关系不大，加入黄金能给组合带来多大的保护效果？

### 动手实验 3：相关性分析与投资宇宙构建

最后一份 spec，难度上一个台阶——重点是**金融指标的计算路径要在 spec 里点名**，以及**怎么用 oxq 的 `StaticUniverse` 把“投资宇宙”这个抽象概念封装成可调用对象**。

#### 起草上下文 + 任务

接续 spec-02 留下的开放问题——中美都是股市，需要找一个不同步的资产来保护组合：

> **上下文**：在 `q2-what-to-buy.ipynb` 中已有沪深300ETF + 纳指100ETF 数据，读者已通过 GDP 锁定中美。当前开放问题：**中美都是股市，可能同涨同跌，加什么能保护组合？**
>
> **任务**：引入黄金ETF 作为对冲资产，用相关性矩阵验证三资产的分散效果，最后用 `StaticUniverse` 把整章的“投资宇宙”概念封装成可调用对象。

#### 起草要求：金融指标显式 + 概念落地

要求段有两件难事：① 金融指标（日收益率 / 累计收益 / 年化波动率 / 最大回撤）对 0 金融基础读者是黑箱，必须在 spec 里点名计算路径；② `StaticUniverse` 是 q3-q9 反复用到的核心对象，第一次出场要让读者看清“它是个什么东西”。

> **要求**：
>
> 1. 用 yfinance 数据下载器拉黄金ETF（`518880.SS`），时间窗 `2021-01-01` 到 `2026-01-01`，与前两只 ETF 对齐
> 2. 读出三只 ETF 的收盘价，合并成一个 DataFrame，列名改中文（沪深300 / 纳指100 / 黄金）
> 3. 计算相关性矩阵：先 `pct_change()` 算日收益率，再 `.corr()` 出 3×3 矩阵
> 4. 相关性热力图（figsize 8×6，imshow + coolwarm，每格标 2 位小数，标题「三资产日收益率相关性」）
> 5. 组合 vs 单押对比——按下方“三个金融指标的计算路径”给出的公式实现累计收益率、年化波动率、最大回撤
> 6. 累计收益率对比图（figsize 12×6，单押沪深300 灰色虚线 + 三资产等权 绿色实线，图例标方案名）
> 7. 用 `StaticUniverse(symbols=[...], name="global-macro-etf")` 构建投资宇宙，调用 `get_universe(as_of_date="2026-01-01")` 取出快照
>
> 具体 oxq 模块（`YFinanceDownloader` / `LocalMarketDataProvider.get_bars` / `StaticUniverse` 的 `get_universe(as_of_date=...)` 返回结构）请参考 [open-xquant 教程](https://github.com/xingwudao/open-xquant/tree/main/examples/tutorials)。

要求 5 用到的三个金融指标，计算路径都要在 spec 里点名——别让 AI 凭感觉写。三条公式如下：

- 累计收益率：`(1 + 日收益率).prod() - 1`
- 年化波动率：`日收益率.std() * sqrt(252)`（252 是年交易日数）
- 最大回撤：累计净值 / 累计净值的历史最大值 - 1，取最小值

> 📌 **要点**：spec 里写到金融指标，要给出计算路径——要么写出公式（如 `日收益率.std() * sqrt(252)`），要么明确指向 oxq 现成函数。“计算最大回撤”这种自然语言反例，AI 写出的代码 5 个版本可能 5 个公式，对不上。0 金融基础时，公式比“术语 + 凭感觉”靠谱十倍。

> 📌 **要点**：章末 spec 把整章概念封装成可调用对象。`StaticUniverse(name="global-macro-etf")` 把“投资宇宙”从概念变成可命名、可快照、可传给下游 spec 的研究对象——q3-q9 的每一份策略 spec 都要从一个 universe 起手。第一次出场就给它一个语义明确的 name，不要写 `name="u1"` 这种凑数的名字。

#### 起草结果呈现

> **结果呈现**：相关性热力图 + 两句相关性解读（「沪深300 与 纳指100：X.XX」「沪深300 与 黄金：X.XX」）+ 三指标对比表（用 `pd.DataFrame.to_string` 打印，避免 markdown 表格漂移）+ 累计收益率对比图 + 一句结论「数据说了算：分散风险的关键不是多买几个，而是买涨跌不同步的」+ 投资宇宙构建结果 `「投资宇宙构建完成：{snapshot.symbols}」`。

完整 spec 在 [`specs/spec-03-correlation.md`](https://github.com/xingwudao/xquant-learning/blob/main/q2-what-to-buy/specs/spec-03-correlation.md)——复制给 AI，弹窗选「允许」。

AI 助手执行完毕后，你的 notebook 里应该出现了两张图、一组相关性数字和一个对比表格。

`518880.SS` 是黄金ETF，在 A 股上市，买它就等于间接持有黄金。不需要去金店买金条，通过黄金ETF 就能参与黄金市场。三只 ETF 都在 A 股交易，交易日历完全一致。

这个实验引入了两个重要的新概念。

**日收益率（Daily Return）** ——今天的价格比昨天涨了还是跌了，涨跌幅度是多少。比如今天收盘价 105，昨天 100，日收益率就是 +5%。为什么要先算日收益率？因为我们关心的不是“今天价格是多少”，而是“今天比昨天变了多少”。价格本身没有可比性——三只 ETF 单价各不相同——但日收益率把它们拉到了同一个尺度上。

**相关性（Correlation）** ——两个东西的涨跌有多“同步”。数值范围从 -1 到 1：1 表示完全同步涨跌，0 表示毫无关系，-1 表示完全反着来。相关性就像两个人走路的默契度——1 是齐步走，0 是各走各的，-1 是你往左他就往右。我们需要的是接近 0 的——各走各的，这样一个跌的时候另一个不一定跟着跌。

热力图用颜色深浅表示相关程度——颜色越红越“同步”，越蓝越“反着来”，白色或浅色代表“关系不大”。对角线上全是 1.00——这是自己跟自己比，当然完全同步。

实验还设计了两种方案来对比：单押方案（100% 全部买沪深300）和等权组合（沪深300、纳指100、黄金各买 1/3）。除了年化波动率，这里还引入了一个新指标：

**最大回撤（Max Drawdown）** ——从最高点到最低点跌了多少，衡量“最惨的时候有多惨”。比如你的账户从 100 万涨到 120 万，又跌回 90 万，最大回撤就是 (120-90)/120 = 25%。这个指标直接关系到你晚上能不能睡好觉——回撤越大，心理压力越大。

三资产之间的相关性热力图如图 2-4 所示。

![三资产相关性热力图](images/q2-what-to-buy/04-correlation-heatmap.png)

单押与等权组合的核心指标对比如表 2-3 所示。

**表 2-3 单押沪深300 vs 三资产等权组合的指标对比**

| 指标 | 单押沪深300 | 三资产等权组合 |
|------|------------|---------------|
| 累计收益率 | -1.78% | 89.50% |
| 年化波动率 | 18.11% | 12.36% |
| 最大回撤 | -42.16% | -16.49% |

累计收益率走势如图 2-5 所示。

![单押 vs 等权组合累计收益率](images/q2-what-to-buy/05-portfolio-comparison.png)

### 读懂这些结果

先看图 2-4 热力图和相关性数字。沪深300与纳指100的相关性是 0.26——有一定联动，但远不是同步涨跌。黄金与两个股市的相关性分别只有 0.09 和 0.05，几乎接近 0，说明黄金与股市基本没有联动——股市涨的时候黄金不一定涨，股市跌的时候黄金也不一定跌。“避险资产”这个说法，数据给出了支持。

再看表 2-3 对比。这里的重点不是“等权组合赚了 89.50% 而单押只有 -1.78%”——虽然收益差距确实很大，但不同时间段跑可能结果不同。真正值得关注的是另外两个指标：

- **波动率从 18.11% 降到 12.36%**。颠簸程度降了三分之一。原来坐的是过山车，现在换成了大巴车——同样是在路上走，但体验完全不同。
- **最大回撤从 -42.16% 降到 -16.49%**。最惨的时候，单押方案从最高点跌了 42%——你的 100 万变成了 58 万。而三资产组合最多只跌了 16%——100 万变成 84 万。回撤缩小了六成，晚上能多睡几个小时。

图 2-5 的累计收益率对比更直观：灰色虚线（单押沪深300）大起大落，绿色实线（三资产等权组合）走得更稳、更平滑。不是没有波动，但波动的幅度小了很多。

**数据说了算：分散风险的关键不是多买几个，而是买涨跌不同步的。**

回顾一下我们走过的三步：个股噪音大，换成 ETF（组合对抗波动）；ETF 太多，用 GDP 锚定中美；中美可能同跌，加入低相关的黄金。每一步都是“先猜后验”——先有直觉判断，再用数据验证。三步走完，三只 ETF 选定：**沪深300ETF、纳指100ETF、黄金ETF**。

三步走下来，标的选好了。但别急——回头看看，你刚才到底做了什么？从几千只标的一路筛选到 3 只 ETF，这个过程本身，其实已经是量化交易中一个重要的专业步骤。

---

## 2.6 回头看：你刚才做了什么？

三步筛选下来，你从全市场几千只标的中选出了 3 只 ETF。这个“策略考虑的标的范围”，在量化交易中有一个专门的名字：**投资宇宙（Universe）** ——你的策略只在这个范围内寻找机会，范围之外的标的一概不看。

构建投资宇宙不是偷懒，恰恰相反，它让后续每一步都更有效：

- **降低噪声**：2.3 的实验验证过，把个股排除后，信号更干净。低质量的标的越早剔除，后面的分析越不容易被干扰。
- **缩小范围**：从几百只 ETF 缩到 3 只，后续做策略研究时计算量可控，每一个标的都值得你认真对待。
- **风控前置**：选标的本身就是第一道风控——流动性差的、数据质量低的、跟你的策略逻辑不相关的，在这一步就被挡在门外了。不用等到回测时才发现“这个标的根本不该出现在我的组合里”。

你可能没有意识到，但你刚才做的事情，和华尔街的量化基金经理做的第一步是一样的——先定义投资宇宙，再谈策略。

---

## 2.7 本章总结

三只 ETF 选定之后，我们把本章的核心概念、策略进化路径和最重要的收获一起收口。**到这里，你完成了飞轮的“候选层”——主练动作仍是“做”：把“选什么”从拍脑袋变成了“用 GDP 和相关性两个具体指标筛”，剩下的飞轮三层从下一章开始接力。**

### 概念速查表

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

**表 2-4 第二章核心概念速查**

| 概念 | 含义 | 类比 |
|------|------|------|
| 指标（Indicator） | 从原始价格数据中算出来的衍生数字 | SMA 就是一种指标——均线 |
| 归一化（Normalization） | 把不同起点的价格调整到同一起跑线 | 让两个选手从同一条起跑线出发 |
| 日收益率（Daily Return） | 今天比昨天涨跌了多少 | 每天量体重，看涨了还是跌了 |
| 相关性（Correlation） | 两个东西的涨跌有多同步，-1 到 1 | 两个人走路的默契度 |
| 年化波动率（Annualized Volatility） | 价格波动的剧烈程度 | 过山车 vs 高铁 |
| 最大回撤（Max Drawdown） | 从最高点到最低点跌了多少 | 最惨的时候有多惨 |
| 投资宇宙（Universe） | 策略考虑的标的范围 | 白板上钉的名牌 |

### 策略进化路径

三步筛选下来，路径一目了然：

全市场几千只标的 → Step 1：个股噪音大，选 ETF（组合对抗波动）→ Step 2：GDP 锚定，锁定中美 → Step 3：低相关性，加入黄金 → 投资宇宙：沪深300ETF、纳指100ETF、黄金ETF

每一步的决策与教训如表 2-5 所示。

**表 2-5 第二章策略进化路径**

| 步骤 | 决策 | 教训 |
|------|------|------|
| Step 1 | 个股 → ETF | 组合对抗波动，个股噪音太大 |
| Step 2 | 几百只 ETF → 中美 | 选择要有数据支撑的理由 |
| Step 3 | 中美 → 中美+黄金 | 分散风险靠“不同步”，不靠“数量多” |

### 本章最重要的收获

三步筛选本身并不复杂——选 ETF、看 GDP、算相关性，每一步你都能理解。但真正值钱的不是这三步的结论，而是贯穿始终的那个思维习惯：**先猜后验，数据说了算。**

每一步我们都是先有一个直觉猜测，然后用数据去验证。猜对了，数据给你信心；猜错了，数据让你及时转向。这个习惯比任何具体的标的选择都重要——市场会变，标的会换，但“用数据验证直觉”这个方法经得起时间检验。

### 带走的问题

标的选好了，但关键问题还没回答：

- **沪深300、纳指100、黄金，各买多少？** 等分？还是有更聪明的分法？ → 第三章
- **什么时候买入、什么时候卖出？** → 第四章
- **怎么验证这个组合确实有效？** → 第五章

答案都在后面。继续。

> 本章所有代码的可运行版本见 `notebooks/q2-what-to-buy.ipynb`

---

## 拓展阅读

本章正文聚焦“为什么从 ETF 开始 + 怎么构建投资宇宙”。下面三节是动手之前可以省略的视野铺垫。

### 投资市场上还有什么可以买？

ETF 不是唯一的资产类型——它只是新手最该先碰的那个。投资市场里还有这些可以买卖的资产：

- **股票（Stock）** —— 买一家公司的一小块所有权。公司赚钱了你分红，公司涨价了你的股份也值钱了。风险：单个公司可能经营不善甚至倒闭。
- **ETF（交易所交易基金）** —— 一篮子股票的打包组合。比如沪深300ETF（510300）打包了 A 股市值最大的 300 家公司。买一份 ETF = 同时持有 300 家公司，风险分散。
- **债券（Bond）** —— 就是一张“借条”。你买国债 = 借钱给国家，到期还本付息。风险低，收益也相对低。
- **期货 / 期权** —— “衍生品”，自带杠杆，风险极高，可能亏损超过本金。**新手先别碰。**

### 在哪里交易？

**交易所（Exchange）** 是个巨大的菜市场——只是买卖的不是菜，而是股票、基金、债券。中国有三个主要交易所：上交所（代码以 6 开头）、深交所（代码以 0 或 3 开头）、北交所（代码以 8 开头）。

但你不需要跑去交易所。现代人都通过**券商** App 交易——券商是你和交易所之间的“中介”，常见的有华泰、中信、招商、东方财富等。开户和入金不急，等到第七章确认策略靠谱了再动。

### 市场上的几种交易方式

我们课程用的是趋势交易（均线、动量）。其实市场上的交易方式不止这一种，常见三类如表 2-6 所示。

**表 2-6 市场上的三种主流交易方式**

| 方式 | 通俗理解 | 时间尺度 |
|------|----------|----------|
| **价值投资** | 找到好公司，便宜时买入，持有数年 | 月线、年线 |
| **趋势交易** | 发现涨的趋势就跟上，反转就撤 | 日线、周线 |
| **统计套利** | 两个相关的东西价格差异，赚差价 | 日内~几天 |

价值投资和趋势交易的核心区别在于**时间尺度**——同一只标的，月线看到的是长期价值，日线看到的是短期趋势。同一个世界，不同的视角。不管哪种方式，**先构建投资宇宙、再做分析**这个原则都一样——投资宇宙是所有策略的起点。

---

## 反馈与读者群

如果你发现本章有错别字、概念不清或实验结果不一致，欢迎
[提交 GitHub Issue](https://github.com/xingwudao/xquant-beginner/issues/new/choose)。

课程、正式书和后续更新见
[xquant.shop/courses](https://xquant.shop/courses)。

添加作者微信 `xquanter` 进入读者群。请备注：`XQuant 读者`。
