跳转至

第 12 课 风险怎么看

最终赚了多少只描述终点。风险研究还要看途中怎样变化、最坏时失去多少,以及手里的证据有多不确定。

适合谁已经会计算收益率、复利与净值的读者
前置知识第 11 课,能够读净值表
建议用时100 分钟,可分两次完成
本课成果为两条净值路径完成波动、回撤、相关性与不确定性解释

相同终点可以藏着完全不同的旅程

下面两个虚构账户都从 100 元走到 110 元。账户甲每天只移动一点,账户乙先冲到 118 元,随后跌到 90 元,最后才慢慢回到 110 元。只比较累计收益,两者都是 10%;真正持有时,账户乙会让人经历更剧烈的账户变化,也更可能在资金需求、风险限制或心理压力下提前退出。

100102104106108110
1001189096103110

风险没有一个能够覆盖所有问题的单一数字。在量化研究中,它至少包含几种不同关切。日常变化是否剧烈,账户从高点跌了多少,不同资产会不会一起下跌,极端损失是否集中出现,历史样本能否稳定代表未来。每个指标只照亮其中一部分,离开问题单独谈“风险高低”很容易失去含义。

这一课先学习四件基础工具。平均数描述收益大致围绕哪里,波动率描述日常离散程度,回撤描述财富从历史高点向下的损失,相关性描述两组收益是否同步变化。最后再讨论为什么这些数字只是根据有限历史作出的估计。

平均数先给每天的收益找一个中心

假设某策略三天收益依次为负 1%、0% 和正 1%。把三天相加得到 0%,再除以 3,平均日收益为 0%。平均数可以理解为把总和均匀分给每一个观察值以后得到的中心位置。

\[ \bar r=\frac{r_1+r_2+\cdots+r_n}{n} \]

公式中的 \(r_1\)\(r_n\) 是每一天的收益率,\(n\) 是观察天数,\(\bar r\) 读作平均收益。三天例子里,负 1%、0% 和正 1% 相加为 0%,所以平均值为 0%。

平均数把整组数据压成一个中心,会主动丢掉变化形状。三天收益 0%、0%、0% 的平均值同样是 0,另一组 -10%、0%、+10% 的平均值也为 0,两组账户的日常体验显然不同。要描述它们离中心有多远,还需要波动率。

波动率把日常晃动压缩成一个尺度

继续使用负 1%、0% 和正 1%。它们与平均值 0% 的距离分别为负 1%、0% 和正 1%。直接把距离相加会再次得到零,因为正负方向互相抵消。为了只保留距离大小,统计计算先把每个偏离平方,再求平均,最后开平方把单位带回收益率。

先按这三天就是完整总体来手算。

第一步 求平均收益        (-1% + 0% + 1%) ÷ 3 = 0%
第二步 求每天与平均值的偏离   -1%、0%、1%
第三步 把偏离平方        1、0、1,单位暂为百分比平方
第四步 求平方后的平均      (1 + 0 + 1) ÷ 3 ≈ 0.6667
第五步 开平方回到百分比单位   √0.6667 ≈ 0.816%

偏离平方的平均值叫作方差,方差开平方叫作标准差。金融研究把收益率标准差常称为波动率。日收益大多靠近平均值时,日波动率较低;收益频繁远离平均值时,波动率升高。上涨和下跌都会形成偏离,所以一次大涨同样会提高波动率。

把手算关系写成总体标准差公式,可以得到下面的形式。

\[ \sigma=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(r_i-\bar r)^2} \]

\(\sigma\) 是标准差,\(r_i\) 是第 \(i\) 个收益率,\(\bar r\) 是平均值。求和符号 \(\sum\) 表示把每一天的偏离平方加起来。这个公式没有增加新的操作,只把刚才五步手算放在了一行中。

样本标准差为什么会使用另一个分母

研究者通常只拿到有限历史,却希望借它理解一个更长、更未知的收益过程。这时三天数据只是整体的一小份样本。为了修正用样本平均值代替未知总体平均值带来的低估,常见样本标准差把分母从 \(n\) 改为 \(n-1\)

pandas 的 std() 默认计算样本标准差,三天例子会得到 1%,而把三天当成完整总体的算法得到约 0.816%。两者没有谁在任何场景都正确,它们回答的是不同问题。报告中应说明使用的数据频率、观察区间、是否按样本估计,以及年化方法。

下面的代码输入三天小数形式收益率,任务是分别计算平均值、样本标准差和总体标准差。运行后应看到平均值为 0,样本标准差为 0.01,总体标准差约为 0.008165。

import pandas as pd

daily_return = pd.Series([-0.01, 0.00, 0.01])

mean_return = daily_return.mean()
sample_volatility = daily_return.std()
population_volatility = daily_return.std(ddof=0)

print(mean_return)
print(sample_volatility)
print(population_volatility)

参数 ddof=0 告诉 pandas 使用总体分母 \(n\),默认设置等价于 ddof=1,会使用 \(n-1\)。代码运行成功以后,还要确认输入已经是收益率而非价格,并说明数值是日波动还是其他频率。一个没有单位和时间尺度的 0.01 无法独立解释。

波动率不会单独告诉你会亏多少

波动率测量收益围绕平均值的离散程度,没有区分大涨和大跌。两项策略可能拥有相同波动率,一项的异常变化主要向上,另一项却偶尔发生巨大亏损。只用标准差概括时,我们默认关心双向不稳定,也接受一个数字省略了收益分布的许多形状。

金融收益还经常出现厚尾。厚尾表示极端变化出现的频率比简单钟形分布直觉更高。分位数、直方图和最差若干日能够补充波动率。第五百分位数可以粗略理解为在历史样本中,大约有 5% 的日收益比这个数更差;它仍然是历史估计,不是未来损失上限。

平均值也可能被少数极端收益拉动。某策略一百天里九十九天接近零,只有一天上涨 50%,平均收益会被这一天显著提高。报告应查看收益是否集中在少数日期、少数资产或单一市场阶段,不能只保留均值与标准差。

回撤从账户已经到达的高点开始计算

投资者常关心另一个更直接的问题。账户曾经达到某个高点以后,最差时跌掉多少。账户乙从 100 元上升到 118 元,随后跌到 90 元。90 元相对于此前高点 118 元的变化为 90 除以 118 再减 1,约等于负 23.7%。这个从历史高点向下的比例叫作回撤。

\[ d_t=\frac{W_t}{H_t}-1 \]

\(W_t\) 是当前净值,\(H_t\) 是走到当前日期为止已经见过的最高净值,\(d_t\) 是当前回撤。净值处于新高时,当前值等于历史高点,回撤为 0;净值低于旧高点时,回撤为负数。样本中最负的回撤叫作最大回撤。

最大回撤的手算需要每天更新两个数。先记录当前为止的最高净值,再用当天净值除以这个高点。账户乙的过程如下。

当天净值 当时历史高点 当前回撤 解释
100 100 0% 起点也是当前高点
118 118 0% 创下新高
90 118 -23.7% 从 118 下跌到 90
96 118 -18.6% 开始恢复,尚未回到旧高点
103 118 -12.7% 仍处于回撤期
110 118 -6.8% 样本结束时仍未恢复旧高点

账户最终比起点增长 10%,却仍比中途高点低约 6.8%。累计收益和回撤使用不同参照点,因此可以同时出现正累计收益与负当前回撤。

用代码逐日保存高点与回撤

下面的代码输入账户乙的六个净值,任务是让 cummax 逐日保存截至当天见过的最高值,再计算每一天相对于该高点的位置。运行后,drawdown.min() 应得到约负 0.2373,与手算的负 23.7% 接近。

import pandas as pd

wealth = pd.Series([100, 118, 90, 96, 103, 110])
running_peak = wealth.cummax()
drawdown = wealth / running_peak - 1
max_drawdown = drawdown.min()

print(pd.DataFrame({"wealth": wealth, "peak": running_peak, "drawdown": drawdown}))
print("最大回撤", max_drawdown)

cummax 在第一天记住 100,第二天更新为 118,后面没有出现更高数字,所以继续保持 118。wealth / running_peak - 1 逐行完成当前值与历史高点比较,min 找到最负的一天。程序仍要处理日期索引,确保净值和高点属于同一天。

回撤还要看持续与恢复

最大回撤只保留最深的一次下跌,没有说明账户在高点以下停留多久。回撤开始于最后一个高点,谷底是回撤最深日期,恢复日是净值重新达到旧高点的日期。高点到谷底的时间描述下跌过程,谷底到恢复的时间描述修复过程,整个水下期则表示账户连续多久没有创新高。

从 118 跌到 90 需要下跌约 23.7%,从 90 回到 118 却需要上涨约 31.1%。下跌比例和恢复比例使用不同起点,回撤越深,回到原高点所需涨幅上升得越快。一条策略可能最大回撤不深,却连续数年无法创新高;对需要取款、面对赎回或有风险限额的账户,持续时间可能比单次深度更难承受。

相关性描述两组收益是否同步变化

组合中放入多项资产,常希望它们不要在同一时间朝同一方向剧烈变化。相关系数把两组收益的线性同步程度压缩在负 1 与正 1 之间。这里的线性可以先理解为,一项高于自身平均值时,另一项是否也大致按稳定方向偏离自己的平均值。

相关系数位置 历史样本中的表现 组合中的直观含义
接近 1 两项收益经常同向偏离各自平均值 波动更容易叠加
接近 0 没有稳定的直线式同步关系 可能互相抵消一部分,也可能存在其他关系
接近 -1 一项向上偏离时,另一项经常向下偏离 同期波动可能相互缓冲

假设资产甲三天收益为正 1%、正 2% 和负 1%,资产乙分别为正 2%、正 4% 和负 2%。乙每次都是甲的两倍,两者方向与比例完全一致,相关系数为 1。若乙改成负 2%、负 4% 和正 2%,方向完全相反,相关系数为负 1。真实资产很少达到这样的极端,例子只用于说明刻度两端。

相关接近零不表示两项资产毫无关系。它只说明样本中没有稳定的线性同步;曲线关系、延迟关系和极端时期共同下跌都可能被一个接近零的数字省略。相关性也不能证明因果,两项资产可能同时受到利率、行业需求或市场流动性影响。

分散化依赖的是未来关系

两项各自波动较大的资产,只要不总在同一时间同方向变化,组合日常波动就可能下降。这种把风险来源分开的做法叫分散化。它不会让损失消失,只会在相关结构没有明显恶化时,减少部分波动的叠加。

历史相关性会随市场环境变化。平静时期走势分散的资产,压力时期可能因为投资者同时需要现金而一起下跌。组合研究因此会查看滚动相关性,也会构造多项资产共同下跌的压力情景。把过去一个固定相关系数当作永久属性,会高估分散效果。

风险数字都带着样本不确定性

我们只看到了有限历史。再增加一天、换一个起止日期或经历新的市场环境,平均收益、波动率、最大回撤和相关性都会改变。根据有限样本计算出的数字叫作估计值,它们与无法完全观察的长期真实过程之间存在误差。

样本数量多通常有助于稳定估计,但交易次数不能单独代表证据丰富。三百笔交易若全部发生在同一轮单边上涨中,可能只是同一种环境被重复许多次。研究还要报告覆盖时间、资产数量、不同市场状态,以及收益是否由少数日期贡献。

置信区间和重采样可以进一步描述估计可能落在什么范围。时间序列具有前后依赖,不能随意把日期打散;后面的验证章节会学习按时间切分,进阶研究还可以使用保留连续片段的区块重采样。初学阶段先养成一个习惯,任何风险数字旁边都写上样本区间和计算口径。

在互动实验中固定终点、改变路径

收益与回撤练习允许拖动六个价格点。先让两条路径都从 100 走到 110,再让其中一条中途跌到 70。观察累计收益保持相近时,最大回撤和恢复距离怎样变化。接着只移动一个极端点,看看波动率是否被少数日期显著抬高。

打开收益与回撤练习

一张风险观察表

想回答的问题 先看什么 这个数字省略了什么
每天通常有多晃 收益标准差或波动率 上涨与下跌方向、极端尾部和流动性
从历史高点最深跌多少 最大回撤 其他回撤、持续时间与恢复过程
多项资产是否同步变化 相关性 非线性关系、因果与未来结构变化
估计是否稳定 样本数量、时间覆盖与分段结果 未经历的未来环境

容易弄错的地方

常见误解 为什么不够 应补充什么
波动率就是亏损概率 波动率同时计算大涨与大跌 亏损频率、下行分位数和尾部事件
最大回撤为 20%,所以最多只会亏 20% 它只是当前样本中见过的最深值 样本外验证和更差压力情景
相关性接近零,两项资产一定独立 零相关只描述线性同步不明显 散点图、极端共同下跌与经济机制
交易次数很多,估计一定可靠 大量交易可能集中在同一市场环境 时间覆盖、资产覆盖和分段稳定性

一分钟自测

两条策略最终都上涨 10%,其中一条中途从高点下跌过 40%。能否认为两者风险相同?

查看答案 不能。最终收益只描述起点与终点,还要比较日常波动、最大回撤、回撤持续时间、极端损失和结果稳定性。两条路径可能要求完全不同的资金与风险承受能力。

本课术语

词语 先这样理解
平均收益 一组收益率的中心位置
方差 每个收益偏离平均值的平方平均
波动率 收益标准差,用来描述日常离散程度
回撤 当前净值相对于此前历史高点的跌幅
最大回撤 当前样本中最深的一次回撤
相关性 两组收益线性同步变化的程度
分散化 把资金放在不同风险来源中以减少部分波动叠加
不确定性 有限样本使估计可能发生变化的范围

课后练习

1 计算平均与波动

三天收益为负 2%、0% 和正 2%。平均收益是多少?把三天视为完整总体时,波动率约是多少?

提示平均值为零。计算 2、0、2 的平方平均,再开平方。
答案平均收益为 0%。总体方差为 `(4 + 0 + 4) ÷ 3`,开平方后波动率约为 1.633%。

2 计算回撤与恢复

净值从 120 跌到 90,回撤是多少?从 90 回到 120 需要上涨多少?

提示下跌以 120 为分母,恢复以 90 为分母。
答案回撤为 `90 ÷ 120 - 1 = -25%`。恢复需要 `120 ÷ 90 - 1 ≈ 33.3%`。

3 解释排错

某策略日收益几乎不动,研究者因此断言它没有大风险。还需要检查什么?

提示历史价格平滑可能来自无法成交、估值延迟或尚未发生的尾部事件。
答案要检查流动性、估值方式、停牌、极端跳跃、杠杆和样本覆盖。低历史波动不能证明未来没有大损失。

4 动手改变路径

在互动实验中制作两条起点和终点相同的净值序列,让其中一条先大跌再恢复。记录两者累计收益、最大回撤和恢复情况。

提示固定第一个与最后一个点,只移动中间点。
答案累计收益可以相同,先大跌的路径会出现更深回撤,也需要更大涨幅和更长过程恢复。具体数字取决于你设置的路径。

5 开放思考

低相关资产为什么可能降低组合波动,又为什么不能保证未来一直有效?

评价要点不同方向的变化可能互相抵消,从而减少波动叠加。历史相关性只是样本估计,市场压力、流动性和共同经济因素都可能让资产在未来一起下跌。
离开本页前
四个数字现在各有自己的位置。波动率描述日常晃动,回撤从历史高点量损失,相关性记录两组收益的线性同步,不确定性提醒我们这些估计只来自有限历史。以后读成绩单时,先问眼前数字回答的是哪一个问题,许多误解会在这一步消失。