mcpField
F
forward-risk

forward-risk

github.com/joellewis数据与数据库218702 次安装15 周前更新
代码仓库

关于 forward-risk

forward-risk 是面向投资者和投资组合分析师的金融分析技能,涵盖前瞻性风险度量、组合风险拆分、情景分析与压力测试,并附有可运行的 Python 示例。

主要功能

  1. 01参数法与蒙特卡洛 VaR
  2. 02CVaR 与预期损失
  3. 03成分 VaR 与边际 VaR
  4. 04情景分析与压力测试
  5. 05因子风险拆分
  6. 06可运行的 Python 示例

适用场景

  1. 01估算单项资产或投资组合风险
  2. 02结合 VaR 与 CVaR 比较尾部损失
  3. 03识别投资组合风险的主要来源
  4. 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 百分位数。

步骤:

  1. 估计收益率分布参数(均值向量、协方差矩阵,或使用 copula 模型)。
  2. 生成 N 个随机收益情景(例如,对多元正态分布使用协方差矩阵的 Cholesky 分解)。
  3. 计算每个情景下的投资组合收益。
  4. 对结果排序并确定 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
投资组合 VaRW * z_alpha * sqrt(w' * Sigma * w)多资产 VaR
多日 VaRVaR_1 * sqrt(h)缩放至 h 日期限
CVaR(正态分布)mu + sigma * phi(z_alpha) / (1 - alpha)预期尾部损失
分项 VaRw_i * beta_i * VaR_p每个头寸的风险贡献
边际 VaRz_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(概念步骤)。

解答:

  1. 构造协方差矩阵:
Sigma = | 0.0324  -0.0018 |
        | -0.0018  0.0025 |
  1. 对 Sigma 进行 Cholesky 分解,得到下三角矩阵 L。

  2. 模拟 10,000 个情景: 对每次模拟,抽取 z ~ N(0, I),计算 r = mu + L*z,然后计算投资组合收益 R_p = w' * r。

  3. 对每个情景 计算投资组合损益:P&L = $1,000,000 * R_p。

  4. 将 损益从最差到最好排序。第 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 下执行。

评论

支持 Markdown