关于 forward-risk
forward-risk 是面向投资者和投资组合分析师的金融分析技能,涵盖前瞻性风险度量、组合风险拆分、情景分析与压力测试,并附有可运行的 Python 示例。
主要功能
- 01参数法与蒙特卡洛 VaR
- 02CVaR 与预期损失
- 03成分 VaR 与边际 VaR
- 04情景分析与压力测试
- 05因子风险拆分
- 06可运行的 Python 示例
适用场景
- 01估算单项资产或投资组合风险
- 02结合 VaR 与 CVaR 比较尾部损失
- 03识别投资组合风险的主要来源
- 04评估组合在市场冲击下的表现
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill forward-risk安装后在 Claude Code 中输入/forward-risk确认已加载。
附带文件scripts/forward_risk.py
详细介绍
前瞻性风险分析
核心概念
参数法(方差-协方差)VaR
假设收益率服从正态分布。对于单项资产或以美元计价的投资组合(假设短期内预期收益为零):
VaR = W * z_alpha * sigma_p
其中:
- W = 投资组合价值
- z_alpha = 置信水平对应的 z 分数(95% 时为 1.645,99% 时为 2.326)
- sigma_p = 相关期限内的投资组合波动率
更一般地,纳入预期收益:
VaR_alpha = mu - z_alpha * sigma
将 1 天 VaR 换算为 h 天 VaR(假设收益率独立同分布):
VaR_h = VaR_1 * sqrt(h)
投资组合 VaR(多项资产)
对于权重向量为 w、协方差矩阵为 Sigma 的投资组合:
sigma_p = sqrt(w' * Sigma * w)
VaR_p = W * z_alpha * sqrt(w' * Sigma * w)
协方差矩阵同时反映各资产的个别波动率及资产间的相关性。
蒙特卡洛 VaR
模拟大量投资组合收益情景(例如 10,000 个以上),然后取模拟损失分布的 alpha 百分位数。
步骤:
- 估计收益率分布参数(均值向量、协方差矩阵,或使用 copula 模型)。
- 生成 N 个随机收益情景(例如,对多元正态分布使用协方差矩阵的 Cholesky 分解)。
- 计算每个情景下的投资组合收益。
- 对结果排序并确定 alpha 百分位数对应的损失。
蒙特卡洛 VaR 可处理非正态分布、肥尾、路径依赖型工具和非线性收益(例如期权)。
条件 VaR(CVaR)/预期损失
CVaR 回答的问题是:“如果损失超过 VaR,预期损失是多少?”
ES_alpha = E[Loss | Loss > VaR_alpha]
对于正态分布:
ES_alpha = mu + sigma * phi(z_alpha) / (1 - alpha)
其中 phi 是标准正态分布的概率密度函数(PDF)。
CVaR 是一种一致性风险度量(与 VaR 不同),因为它满足次可加性:CVaR(A+B) <= CVaR(A) + CVaR(B)。这意味着分散投资总是会降低或维持 CVaR,而 VaR 不一定如此。
成分 VaR
将投资组合总 VaR 分解为各头寸的贡献。各成分 VaR 之和等于总 VaR。
CVaR_i = w_i * beta_i * VaR_p
其中 beta_i = Cov(R_i, R_p) / Var(R_p) 是资产相对于投资组合的 beta 值。
等价地:
CVaR_i = w_i * (partial VaR / partial w_i)
sum(CVaR_i) = VaR_p
此分解可识别对投资组合风险贡献最大的头寸。
边际 VaR
衡量头寸权重小幅增加时,投资组合 VaR 的变化率。
MVaR_i = partial(VaR_p) / partial(w_i) = z_alpha * (Sigma * w)_i / sigma_p
边际 VaR 可用于头寸规模管理:增加边际 VaR 较低的头寸,可以更有效地降低投资组合风险。
情景分析
将特定的历史或假设市场变动应用于当前投资组合,以估算损益影响。
- 历史情景: 使用当前持仓重现实际市场事件(例如 2008 年全球金融危机、2020 年 COVID 暴跌、2022 年加息周期)。
- 假设情景: 构造自定义冲击(例如“股票 -20%,利率 +200bp,信用利差 +300bp,美元 +10%”)。
情景损益通过将情景收益应用于当前头寸敞口并重新估值来计算。
压力测试
一种用于评估投资组合在极端但合理条件下韧性的结构化框架。
常见压力情景:
- 股市暴跌:S&P 500 下跌 30% 至 40%
- 利率冲击:平行移动 +300bp
- 信用危机:投资级利差 +200bp,高收益债利差 +800bp
- 流动性冻结:买卖价差扩大 10 倍,以折价强制卖出
- 汇率冲击:主要货币对变动 15% 至 20%
- 滞胀:通胀 +5%,GDP -3%,利率 +200bp
压力测试应纳入二阶效应:追加保证金通知、流动性需求、相关性飙升、交易对手风险。
基于因子的风险分解
将投资组合总风险拆分为系统性因子风险和特质风险(特定证券风险)。
sigma^2_p = b' * Sigma_f * b + sum(w_i^2 * sigma^2_epsilon_i)
其中:
- b = 投资组合因子敞口向量
- Sigma_f = 因子协方差矩阵
- sigma^2_epsilon_i = 资产 i 的特质方差
常见因子模型:Fama-French(市场、规模、价值、动量)、Barra 风险模型、基于 PCA 的统计因子。
关键公式
| 公式 | 表达式 | 用途 |
|---|---|---|
| 参数 VaR(单项) | W * z_alpha * sigma | 简单头寸 VaR |
| 投资组合 VaR | W * z_alpha * sqrt(w' * Sigma * w) | 多资产 VaR |
| 多日 VaR | VaR_1 * sqrt(h) | 缩放至 h 日期限 |
| CVaR(正态分布) | mu + sigma * phi(z_alpha) / (1 - alpha) | 预期尾部损失 |
| 分项 VaR | w_i * beta_i * VaR_p | 每个头寸的风险贡献 |
| 边际 VaR | z_alpha * (Sigma * w)_i / sigma_p | 对权重变化的敏感度 |
| 因子风险 | b' * Sigma_f * b | 系统性风险部分 |
| 特质风险 | sum(w_i^2 * sigma^2_epsilon_i) | 个别证券特有的风险 |
示例详解
示例 1:参数法 95% VaR
已知: 一个价值 $1,000,000、年化波动率为 15% 的股票投资组合。
计算: 1 日 95% 参数 VaR(假设每年有 252 个交易日,且每日预期收益为零)。
解答:
日波动率:
sigma_daily = 0.15 / sqrt(252) = 0.15 / 15.875 = 0.00945
1 日 95% VaR:
VaR = $1,000,000 * 1.645 * 0.00945 = $15,545
也可以直接根据年度数据计算:
VaR_annual = $1,000,000 * 1.645 * 0.15 = $246,750
VaR_1day = $246,750 / sqrt(252) = $15,545
解读:在正常市场条件下,单日损失超过 $15,545 的概率为 5%。
示例 2:蒙特卡洛 VaR
已知: 一个由两种资产构成的投资组合(60% 股票,40% 债券)。股票:mu = 10%,sigma = 18%。债券:mu = 4%,sigma = 5%。相关系数 rho = -0.2。投资组合价值 = $1,000,000。
计算: 通过蒙特卡洛模拟计算年度 95% VaR(概念步骤)。
解答:
- 构造协方差矩阵:
Sigma = | 0.0324 -0.0018 |
| -0.0018 0.0025 |
-
对 Sigma 进行 Cholesky 分解,得到下三角矩阵 L。
-
模拟 10,000 个情景: 对每次模拟,抽取 z ~ N(0, I),计算 r = mu + L*z,然后计算投资组合收益 R_p = w' * r。
-
对每个情景 计算投资组合损益:P&L = $1,000,000 * R_p。
-
将 损益从最差到最好排序。第 500 个最差值(第 5 百分位)即为 95% VaR。
对于该投资组合,解析解可作为基准:
sigma_p = sqrt(0.6^2 * 0.0324 + 0.4^2 * 0.0025 + 2 * 0.6 * 0.4 * (-0.0018))
= sqrt(0.011664 + 0.0004 - 0.000864)
= sqrt(0.0112)
= 10.58%
VaR_95% = $1,000,000 * 1.645 * 0.1058 = $174,090
在多元正态分布假设下,蒙特卡洛模拟结果应趋近于此值。
示例 3:预期损失
已知: 在上述蒙特卡洛模拟中,超过 VaR 的损失(10,000 个情景中最差的 500 个)的平均损失为 $225,000。
计算: 95% CVaR。
解答:
CVaR_95% = $225,000
解读:当损失超过 95% VaR 阈值时,平均损失为 $225,000。这比 $174,090 的 VaR 数值高出约 29%,凸显了尾部事件的严重性。
常见陷阱
- VaR 无法反映尾部形态: VaR 只确定一个阈值。两个 VaR 相同的投资组合,其尾部损失可能大不相同。务必同时计算 CVaR 和 VaR,以了解尾部风险的严重程度。
- 参数 VaR 假设收益服从正态分布: 金融收益具有肥尾和偏度。参数 VaR 会系统性低估尾部风险。应使用肥尾分布的蒙特卡洛模拟或历史模拟,以获得更真实的估算。
- 危机期间相关性崩溃: 市场承压时,相关性会飙升至 1.0,而这恰恰是最需要分散投资的时候。压力测试应使用危机期间的相关性,而不是平静时期的相关性。
- 协方差估算的回溯期过短: 窗口过短会导致估算结果嘈杂;窗口过长则会纳入来自不同市场状态的过时数据。常见的折中方案是使用 1-3 年的日度数据,或使用按 EWMA 加权的协方差。
- 未区分绝对 VaR 和相对 VaR: 绝对 VaR 包含预期收益(VaR = -mu + zsigma);相对 VaR 不包含(VaR = zsigma)。对于较短期限(1-10 天),预期收益可以忽略不计,两者差异很小;对于较长期限,差异则很重要。
- 平方根时间缩放的局限性: VaR_h = VaR_1 * sqrt(h) 假设收益是独立同分布的。存在序列相关性或波动率聚集时,这种缩放并不准确。
交叉引用
- historical-risk(财富管理插件):历史 VaR 和已实现波动率可作为非参数替代方案,以及本技能中前瞻模型的校准基准。
- performance-metrics(财富管理插件):VaR 和 CVaR 可用作修正风险调整比率(例如,收益/CVaR)的风险分母。
- volatility-modeling(财富管理插件):EWMA 和 GARCH 波动率预测可为参数法和 Monte Carlo VaR 提供波动率输入(sigma)。
运行脚本
uv run scripts/forward_risk.py # run the demo (uses PEP 723 inline deps)
uv run scripts/forward_risk.py --verify # check demo outputs against the worked examples (exit 1 on mismatch)
python3 scripts/forward_risk.py # alternative (requires: pip install numpy scipy)
该演示会打印上述计算结果;其数值与本技能中的示例计算一致。运行 --help 可查看类和函数列表。若要以编程方式使用,请导入模块,而不是运行脚本——演示仅在 python forward_risk.py 下执行。