第二章:选出你的投资宇宙: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)描述了一套从“想法”到“可上线策略”的完整流程,是业界教学和入职培训的常见教材。
一句话:quantstrat 凝结了一位资深量化从业者多年的实战经验。
open-xquant:用 Python 致敬 quantstrat 的方法论
quantstrat 体系完整,但作为本书的学习工具,它有两个不利因素:
- R 语言在 AI 编程生态里是少数派。主流 AI 编程助手对 Python 的支持远好于 R。你写 spec 让 AI 写代码,它写 Python 流畅,写 R 经常磕碰
- R 的指标 / 数据库迭代慢。Python 这边 pandas / NumPy / scikit-learn / akshare / yfinance 都很活跃,新指标新数据源出来很快就有 Python 实现
直接学 R + quantstrat,方法论地道,但后续扩展、找数据、用 AI 都不顺手。
open-xquant(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:
要求:
- 数据:沪深300ETF(
510300.SS)+ 5 只 A 股(600519.SS茅台 /000858.SZ五粮液 /601318.SS中国平安 /000001.SZ平安银行 /600036.SS招商银行),时间窗2023-01-01到2026-01-01共 3 年- 6 个标的跑同一个策略:均线交叉信号(SMA(1) 上穿 SMA(20))、等权入场、信号反转出场——每个标的都是独立的单资产投资宇宙。具体 oxq 模块(
Engine.run/Crossover/EqualWeightOptimizer/ExitRule)请参考 open-xquant 教程- 取每个标的的累计收益率和年化波动率
- 两张横向柱状图(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——复制给 AI,弹窗选「允许」。
AI 助手执行完毕后,你的 notebook 里应该出现了一组数字和一张柱状图。
open-xquant 的工作方式和你写 spec 很像:你不用描述 AI 该怎么一步步执行,只需要清楚地说明你要什么。比如“用 20 日均线作为信号,上穿就买、下穿就卖”——框架替你处理所有执行细节。
这里还出现了一个新指标:年化波动率(Annualized Volatility) ——价格上下波动的剧烈程度,数字越大说明越颠簸。就像坐车,波动率高就是过山车,波动率低就是高铁。年化是把每天的波动换算成一年的尺度,方便理解。
回到实验设计本身——6 只标的、同一个策略、同样的参数,唯一的变量是标的本身。结果如图 2-1 所示。

读懂这张图
先看图 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”的两步式接口里:
要求:
- 用世界银行数据下载器拉全球前 10 大经济体 GDP(
["USA", "CHN", "DEU", "JPN", "IND", "GBR", "FRA", "ITA", "BRA", "CAN"]),时间窗 2020-2024 共 5 年(取最新一年使用,前 4 年留作缓冲、防止当年数据延迟发布)- 读出数据,取最新一年,单位换算为万亿美元
- 横向柱状图(figsize 10×6):从高到低排列,中红美蓝高亮、其余灰色,柱子右侧标具体数值,标题「全球前 10 大经济体 GDP」
- 用 yfinance 数据下载器拉两只 ETF:
510300.SS(沪深300ETF,代表中国核心资产)+513100.SS(纳指100ETF,A 股上市的美国科技龙头),时间窗2021-01-01到2026-01-01- 读出数据,画归一化走势图(figsize 12×6,起点=100,两色实线,图例标中文名)
具体 oxq 模块(
WorldBankDownloader/read_factor/YFinanceDownloader/LocalMarketDataProvider.get_bars)请参考 open-xquant 教程。
📌 要点:用一个数据锚点支撑你的选择。这份 spec 把“数据源 → 锚点 → 选择”三段写顺:先取 GDP 数据(来源),再算“中美遥遥领先”(锚点),最后下载对应 ETF(选择)。三段缺一不可,缺锚点段就成了“凭印象选标的”。
📌 要点:spec 内部就要把“先猜后验”的三段闭环打印出来。结果呈现里预先写好「最直觉的思路:经济最强的国家,资本市场应该最有潜力」(猜想)→「数据说了算:锁定中国 + 美国」(验证)→「但中美都是股市,同时下跌怎么办?」(开放下一份 spec 的问题)。让 AI 跑完 notebook,结果会自己讲故事——不用你回头补叙事。
起草结果呈现
结果呈现:GDP 柱状图 + 两条 ETF 归一化曲线 + 三句打印(猜想/验证/开放问题,见上方要点)。
完整 spec 在 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 所示。


读懂这两张图
先看图 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 反复用到的核心对象,第一次出场要让读者看清“它是个什么东西”。
要求:
- 用 yfinance 数据下载器拉黄金ETF(
518880.SS),时间窗2021-01-01到2026-01-01,与前两只 ETF 对齐- 读出三只 ETF 的收盘价,合并成一个 DataFrame,列名改中文(沪深300 / 纳指100 / 黄金)
- 计算相关性矩阵:先
pct_change()算日收益率,再.corr()出 3×3 矩阵- 相关性热力图(figsize 8×6,imshow + coolwarm,每格标 2 位小数,标题「三资产日收益率相关性」)
- 组合 vs 单押对比——按下方“三个金融指标的计算路径”给出的公式实现累计收益率、年化波动率、最大回撤
- 累计收益率对比图(figsize 12×6,单押沪深300 灰色虚线 + 三资产等权 绿色实线,图例标方案名)
- 用
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 教程。
要求 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——复制给 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 所示。

单押与等权组合的核心指标对比如表 2-3 所示。
表 2-3 单押沪深300 vs 三资产等权组合的指标对比
| 指标 | 单押沪深300 | 三资产等权组合 |
|---|---|---|
| 累计收益率 | -1.78% | 89.50% |
| 年化波动率 | 18.11% | 12.36% |
| 最大回撤 | -42.16% | -16.49% |
累计收益率走势如图 2-5 所示。

读懂这些结果
先看图 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。
课程、正式书和后续更新见 xquant.shop/courses。
添加作者微信 xquanter 进入读者群。请备注:XQuant 读者。