第 3 课:用 Python 量化收益与风险
上一课程回顾(含自测参考答案)
课程 2 的四个自测题,参考答案如下:
1. 说清图上横轴、纵轴、收盘价线分别是什么
横轴是日期(从早到晚,本图应为 2021 → 2026 左右的"近 5 年");纵轴是价格(510300 每份多少钱,元);收盘价线是每天收盘价的连线——它忽略了盘中波动,只保留每天的"结局",所以看起来是一条干净的线,比 K 线更适合看趋势。
2. 对照行情 App:最新收盘价差多少?大形状一致吗?
最新收盘价差一两分钱以内都正常(App 是盘中实时价 vs 数据源当天收盘价的时间差)。5 年走势的"大形状"应该基本一致:2021 年前后高点、2022~2023 回落、2024 见底回升的节奏一致。如果形状有差异,大概率是复权口径不同:yfinance 默认拉的是不复权价(真实成交价,分红除息时价格跳空),App 默认显示前复权(把历史价统一到现在的口径)——数据口径不同,图就不同,这是本课的起点认知。
3. 观察笔记(无标准答案,示例)
示例:"这 5 年沪深300 整体几乎没涨,2021 年高点约 4.5 元,2024 年低点约 3.0 元,中间 2022 年跌得最连续;我的疑问是'现在这个位置算高还是低?'"——你的笔记是直觉锚点,本课(第 3 课)会算体检表数字,到时候回来验证你的直觉对不对。
4. 加餐:前复权 vs 不复权对比
差异出现在分红除息日附近:不复权图上除息当天价格会"跳空下跌"(比如跌 3 分钱),前复权图会把分红部分回填到历史价格里,所以越早的历史价格,两种口径差得越多。结论:两张图都没有错,只是口径不同——分析前先问清楚数据口径。
学习目标
- 理解年化收益率、波动率、最大回撤、夏普比率四个数字各自的含义,能用自己的话说出来
- 能读懂一张"风险收益体检表",知道每个数字"大"或"小"意味着什么
- 会让 AI 生成体检表,并能对照理杏仁/雪球等网站验证数字是否可信
- 回到课程 2 的观察笔记,验证你的直觉印象与数字结论是否一致
前置要求
- 已掌握:课程 1(量化 = 数据 + 模型 + 纪律)、课程 2(数据需求四要素、对照验证、观察笔记)
- 本课仍然不需要自己写代码,代码由 AI 代写;主路径用理杏仁/雪球页面也能完成
正文
3.1 风险收益体检表:四个数字管一辈子
上一课你拉到了价格曲线,但"涨了还是跌了"用眼睛看不够精确。本课把这 5 年压缩成四个数字,就像体检报告:不看过程,只看关键指标。
| 指标 | 回答的问题 | 越大越好吗 |
|---|---|---|
| 年化收益率 | 这 5 年平均每年赚多少? | 越大越好 |
| 波动率 | 每天涨跌起伏有多剧烈? | 越小越稳 |
| 最大回撤 | 最惨时从高点亏了多少? | 越小越好 |
| 夏普比率 | 每承担一份风险换几份收益? | 越大越好 |
这四个数字合起来就是风险收益体检表。后面所有策略(定投、动量、多资产组合)跑完回测,输出的核心也就是这四件套。本课的目标:看到这四个数字,能说出它说明什么。
任何理财 App 的基金页面(天天基金/雪球/蛋卷)都能找到类似指标,名字可能叫"近 5 年年化收益""历史波动率""最大回撤""夏普比率"——都是同一套东西。
3.2 年化收益率:把 5 年涨跌换算成"每年赚多少"
直觉:510300 从 5 年前的 3.0 元涨到今天 4.0 元(举例,以你实际数据为准),5 年一共涨了 33%。但这 33% 摊到每年是多少?不是 33% ÷ 5 = 6.6%——因为收益会"利滚利",前一年赚的钱第二年也在赚钱。
正确算法(复利/年化):
套进例子:。意思是:每年稳定赚 5.9%,5 年后就能从 3.0 变成 4.0——和实际 5 年起伏涨到 4.0 是"等效"的。这就是为什么基金页面上"近 5 年年化收益 5.9%"是这样算出来的。
三个容易错的地方:
- 年化 ≠ 平均:5 年涨 33% 的年化是 5.9%,不是 6.6%,因为中间有复利。
- 年化可以是负的:期末 4.0 → 期初 5.0,年化就是负的(每年平均亏一点)。
- 看年化必须带区间:"近 1 年年化 20%"和"近 5 年年化 5%"说的是不同的事,别拿两个区间比。
3.3 波动率:风险的第一种度量
直觉:两只基金年化收益都是 8%,但 A 每天 ±0.2% 平稳爬升,B 动不动 ±3% 过山车——B 的波动率大。波动率 = 收益率的波动幅度,数学上就是每日收益率的"标准差"再年化(AI 会算,你不用动手)。
对 510300 这种宽基 ETF,年化波动率大约在 15%~25% 区间(具体以数据为准)。
怎么理解这个数字:
- 波动率 20% 大致意味着:一年里大约 2/3 的日子,涨跌幅落在 ±20% 的"年化范围"内——直白说就是一年下来涨 20% 或跌 20% 都不算太意外。
- 波动率衡量的是不确定性,不是"亏钱":向上波动是赚,向下波动是亏,波动率两头都算。
- 为什么波动率重要:同样收益下,波动越小越好——因为跌 50% 需要涨 100% 才能回本,剧烈波动会吃掉复利。
💡 关键认知:收益可以平均,风险不行。年化收益率是把 5 年"平均"成一个数字,但波动率告诉你这 5 年实际有多颠簸。只看收益不看波动,就像只看工资不看加班。
3.4 最大回撤:最惨的时候亏多少
直觉:从曲线的任意一个高点跌到之后的最低点,最大的那次跌幅就是最大回撤。它回答的问题是:如果我在最倒霉的时候进场,最多会亏多少?
拿课程 2 的图举例:2021 年高点约 4.5 元 → 2024 年低点约 3.0 元,最大回撤 ≈ (3.0 − 4.5) / 4.5 ≈ −33%(以你实际数据为准)。意思是:5 年里最惨的一波,从山顶到谷底亏了三分之一。
三个要点:
- 回撤是"从高点算"的:哪怕最终年化收益是正的,中间也可能有 −33% 的回撤。收益与回撤是两回事。
- 回撤最考验人性:−33% 意味着 10 万变 6.7 万,很多人就是在这个位置割肉离场的——这正是"纪律"要对抗的东西(课程 1 的三要素之一)。
- 回撤和波动率的区别:波动率描述"平时有多颠",回撤描述"最坏一次有多惨"。两者通常相关,但一个 30% 回撤 + 15% 波动率 vs 一个 30% 回撤 + 30% 波动率的基金,体验完全不同。
3.5 夏普比率:每承担一份风险,换几份收益
直觉:波动率 20% 赚 8%,和波动率 10% 赚 8%,后者明显更划算。夏普比率就是把"划算程度"变成一个数字:
- 无风险利率:不承担任何风险能拿到的收益,通常用国债利率或存款利率近似(国内近年约 1.5%~2.5%,AI 算的时候可以指定)。
- 分子是"冒着波动赚到的超额部分",分母是"承担的风险"。所以夏普 = 每承担 1 份风险换几份超额收益。
怎么读这个数字:
| 夏普比率 | 含义(粗略) |
|---|---|
| 0 以下 | 冒着风险还没跑赢存款,不如不折腾 |
| 0 ~ 0.5 | 收益对得起风险,但不算出色 |
| 0.5 ~ 1 | 不错的性价比 |
| 1 以上 | 很优秀(长期能做到的不多) |
注意两个坑:
- 夏普高 ≠ 不会亏:它只衡量"性价比",波动率 30% 的基金夏普也可能有 1,照样可能大回撤。
- 夏普需要足够长的样本:拿 1 个月数据算的夏普没有意义,至少看 3~5 年。
3.6 让 AI 生成体检表 + 对照验证(本课实战)
主路径(不碰代码):打开理杏仁或雪球,找到一只沪深300 指数基金(如 510300 或它的联接基金),把页面上的"近 5 年年化收益、波动率、最大回撤、夏普比率"抄下来,对照 3.2~3.5 节逐个说出它是什么意思。
AI 加餐(可选):把下面这句话发给 AI,让它跑出体检表并逐项解释:
"用 Python(yfinance)拉取沪深300 ETF(510300.SS)近 5 年日线,计算年化收益率、年化波动率、最大回撤、夏普比率(无风险利率按 1.5%),输出一张风险收益体检表,并逐项解释每个数字的含义。"
跑完后对照验证(沿用课程 2 的"交叉验证"习惯):
- 数字差多少? 你抄的网站数字和 AI 算的差一点很正常,可能来自:区间不同(网站可能用近 3 年/近 5 年)、复权口径不同、是否扣费(基金页面通常是扣费后净值)、无风险利率假设不同。
- 方向一致吗? 如果网站说"近 5 年年化为正",AI 也算出正的——方向对就行,别纠结小数点。
- 回到观察笔记(重点):课程 2 你写了三句话。现在对照体检表验证:
- 你说"整体是涨/跌的" → 年化收益率的正负对吗?
- 你说"某段跌得最惨" → 最大回撤发生的时间段和你印象一致吗?
- 你的疑问("现在算高还是低")→ 体检表回答不了这个问题(它只描述过去),但第 5 课"估值百分位"会开始回答。
💡 一次验证就够:把"网站抄的"和"AI 算的"放在同一张表里对比,你就完成了量化里最重要的一步——不轻信任何单一来源。
自测练习
- 用 3.6 节的模板让 AI 生成 510300 近 5 年的风险收益体检表,写出四个数字,并用一句话解释每个数字是什么意思。
- 对照理杏仁/雪球上同一只基金:四个数字和 AI 算的差多少?说出至少两个可能的差异来源。
- 回到课程 2 的观察笔记,对照体检表验证:你的直觉(涨/跌、最惨时段)和数字结论一致吗?哪里不一致?
- 加餐(可选):让 AI 分别按"近 3 年"和"近 10 年"各出一份体检表,比较四个数字的变化,说说为什么同一只基金不同区间的数字差这么多。
答案不需要现在核对;第 4 课开头会回顾。到时候你会发现:这四个数字也是回测报告的核心输出。
学习要点小结
- 体检表四件套:年化收益率(复利换算,看长期赚钱能力)、波动率(颠簸程度 = 风险)、最大回撤(最惨亏多少,最考验人性)、夏普比率(每份风险换几份收益)。
- 年化是复利口径,不是简单平均;看年化必须带区间。
- 波动率衡量不确定性(两头都算),回撤衡量最坏情况(只算向下),两个都要看。
- 夏普比率 =(年化收益 − 无风险利率)/ 波动率;夏普高 ≠ 不亏钱。
- 数字验证三连:网站抄的 vs AI 算的 → 找差异来源(区间/复权/费用/利率假设)→ 回到观察笔记验证直觉。
答疑记录
Q1(2026-08-08):什么是夏普比率
引用的内容: 无
答: 夏普比率一句话概括:每承担一份风险,换来几份收益,衡量的是投资的"性价比"。公式为:夏普比率 =(年化收益率 − 无风险利率)/ 年化波动率。分子是扣除无风险利率后的超额收益,分母是承担的风险(波动率),结果就是每承担 1 份风险换几份超额收益。
举例:510300 年化收益率 5.9%、无风险利率 1.5%、波动率 18%,夏普 = (5.9% − 1.5%) / 18% ≈ 0.24,意思是每承担 1 份风险只换来 0.24 份超额收益,性价比一般。读数参考:0 以下 = 冒着风险还不如存钱;00.5 = 收益对得起风险但不算出色;0.51 = 不错的性价比;1 以上 = 很优秀(长期不多见)。
两个关键提醒:① 夏普高 ≠ 不会亏——它只衡量性价比,不衡量会不会亏,波动率 30% 的基金夏普也可能到 1,照样可能大回撤,所以要跟最大回撤、波动率一起看;② 样本太短没意义——拿 1 个月数据算的夏普是噪音,至少看 35 年。实战提示:宽基 ETF 长期夏普一般在 0.30.8,如果某个策略回测跑出 1.5 以上的夏普,大概率是数据或参数有问题。
由此暴露的薄弱点: 无