Files
xquant-beginner/book/q2-what-to-buy.md
T

447 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.
# 第二章:选出你的投资宇宙: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×6imshow + 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 读者`