某 A 股 50 私募的风控经理:她的交易团队上周三晚成交后报上来一份「明日 1 日 99% VaR = 1,800 万 RMB」。基金经理把头摇了摇——「我们 1 亿元 名义敞口,这个数字到底是什么意思?是说明天最多亏 1,800 万,还是说有 1% 概率亏超过 1,800 万?」更要命的问题在下一句:「2023 年起 FRTB 替换 99% VaR 用 97.5% 期望损失,为什么?VaR 是哪里出了问题?」L1 / L2 教方差度量风险——典型一天的波动;L3 切到分位数风险——最坏一天能亏多少。这堂课讲三套 VaR 算法(历史模拟、参数法、蒙特卡洛)、Artzner 等(1999)的一致性公理、为什么 VaR 在非高斯尾部失效,以及它如何被 CVaR / 期望损失替代。
L3 拿 L1 的 算参数法 VaR,把 L2 的组合权重当输入;L3 的产出又是 L4 监管资本的输入。
术语对齐表
本课新增的核心术语,与 data/glossaries/quant-glossary.yaml 标准译名一致:在险价值(value at risk, VaR)、条件在险价值(conditional VaR, CVaR;期望损失 expected shortfall, ES,二者同义)、最大回撤(max drawdown,与 VaR 的横向参照)、协方差矩阵(covariance matrix,参数法 VaR 的输入)、因子模型(factor model)、Barra 模型(Barra model)、夏普比率(Sharpe ratio,参考性比对)。后续所有讨论用这些标准译名。
VaR 与 CVaR 的定义
下面是 Inline-code listing 中按固定顺序的五条:
loss: L = -PnL (positive numbers are losses)
value_at_risk: VaR_alpha = -inf{l : P(L > l) <= 1 - alpha} = alpha-quantile of L
conditional_VaR: CVaR_alpha = ES_alpha = E[L | L > VaR_alpha] = expected loss in the worst (1 - alpha) of cases
canonical_alphas: 0.95 (retail / 1-in-20-day), 0.99 (institutional pre-FRTB / 1-in-100-day), 0.975 (FRTB regulatory standard since 2023)
canonical_horizons: 1-day (trading desks), 10-day (Basel II.5), risk-factor-specific liquidity horizons (FRTB)
规则:CVaR is the EXPECTED loss beyond VaR; coherent unlike VaR。
组合在长度 期内的损益是随机变量 ( 为期间收益向量, 为当期组合市值);损失定义为 (正数代表亏损)。置信度 下的在险价值
是损失分布 的 分位数。直话:1 日 99% VaR = 1,800 万 RMB 的意思是「明天损失超过 1,800 万的概率约为 1%」,不是「明天最多亏 1,800 万」——VaR 完全不告诉你超出之后的尾巴有多深。规范 取 0.95(零售 / 私募 1 万分之 5 标准,1 天 / 20 一遇)、0.99(机构 / 巴塞尔 II 标准,1 天 / 100 一遇)、0.975(2023 起 FRTB 监管标准,选这个因为 97.5% 高斯 ES 在高斯下精确等于 99% 高斯 VaR)。规范时间窗:1 天(交易台日常)、10 天(巴塞尔 II.5 资本)、风险因子特定的流动性期限(10–120 天,FRTB)。
条件在险价值 / 期望损失
是「最坏 的平均损失」——它回答了 VaR 不回答的问题「超出之后多深」。
三种 VaR 估计方法
下面是 Inline-code listing 中按固定顺序的三条:
historical: VaR_alpha = -quantile(PnL_history, 1 - alpha) with T = 250-500 daily observations; pros: no distributional assumption, captures empirical fat tails; cons: sample-noisy at 99% (only ~2-3 exceedances per 250 obs), slow to react to vol regimes
parametric_gaussian: assume L ~ N(mu_L, sigma_L^2) with sigma_L^2 = w^T Sigma_BARRA w; VaR_alpha = mu_L + z_alpha * sigma_L; CVaR_alpha = mu_L + sigma_L * phi(z_alpha) / (1 - alpha); pros: closed-form, fast, sqrt(h) horizon scaling; cons: under-estimates equity tails (real kurt 5-20 vs Gaussian 3)
monte_carlo: simulate B = 10k-100k paths of risk factors from parametric model (MV-t with nu=5 institutional default); reprice portfolio per path; take empirical quantile; pros: handles non-linear derivatives, any distribution; cons: expensive, factor-model mis-spec risk
规则:parametric Gaussian under-states tail; historical mid-range; Monte-Carlo-t largest — institutional reports show all three。
历史 VaR(非参数)
收集当前组合在最近 个交易日的 P&L 观测(P&L 是把历史因子变动套到当期因子暴露 + 特异残差敞口上得到的「假设当时持现仓」损益);然后
(一年)是日频交易台的标准窗;FRTB 监管要求 的最近窗 + 一段历史「压力期」(stressed period)样本。优点:无分布假设;捕捉经验厚尾、偏度、联合相关性(历史情景就是联合因子抽样)。缺点: 上只有约 2–3 个 99% 突破,99% 估计噪声大(95% 置信区间约为点估计的 );窗对波动率换档反应慢( 的高波动日要等到 才进窗,完整调整要约 天);窗外没出现过的尾事件完全错过。Boudoukh-Richardson-Whitelaw(1998)的「年龄加权」(age-weighted)历史 VaR 用指数衰减保留非参形式但让窗能反应波动率换档。
参数法 VaR(高斯基线)
假设 ,(1 日窗下通常可忽略),(用 L1 的 是机构默认)。于是
其中 是标准正态分位数(、、), 是标准正态密度。 时 ; 时 。优点:闭式(微秒级算完),按 在 iid 高斯下解析换窗,支持每秒上千笔交易前 VaR。缺点:权益收益经验峰度 5–20(高斯 3),高斯把 99% 尾低估 30%–100%。Cornish-Fisher 分位数扩展是常见修正(用样本偏度 + 超额峰度调整高斯 )。J.P. Morgan RiskMetrics(1996)是参数法 VaR 的规范入门。
蒙特卡洛 VaR
最灵活、最贵的方法。设定因子收益的联合分布 (权益因子的机构默认 ;多元正态是更简单的基线;混合正态、GARCH 残差是进阶扩展)。抽 独立因子样本;每个样本算资产收益 (其中 );算组合 P&L (权益 / 线性债券用线性 delta 重定价;非线性衍生品账要全估值过定价器);最后 。优点:处理非线性衍生品敞口(每个样本独立调价器,不依赖 delta-gamma 近似);支持任意分布假设;支持「条件模拟」做压力情景。缺点:贵(100,000 路径的 1000 工具衍生品账全估值 VaR 每次几分钟);因子模型设错(mis-spec)风险;尾分位数收敛慢( 从 样本估计的标准误约 ,99% VaR 比 95% VaR 大约要 4 倍样本量)。
一致性公理与 VaR 失效
下面是 Inline-code listing 中按固定顺序的六条:
monotonicity: L_1 <= L_2 pathwise => rho(L_1) <= rho(L_2) (more losses everywhere = more risk)
sub_additivity: rho(L_1 + L_2) <= rho(L_1) + rho(L_2) (diversification cannot increase risk)
positive_homogeneity: rho(c * L) = c * rho(L) for c > 0 (scaling positions scales risk linearly)
translation_invariance: rho(L + c) = rho(L) + c for constants c (deterministic loss adds exactly its size)
VaR_fails: sub-additivity fails for non-Gaussian heavy-tailed L (canonical counter-example: two independent defaultable bonds with 1.5% default rate; each has VaR_0.95 = 0 but the pool has VaR_0.95 > 0)
CVaR_satisfies: all four axioms hold for CVaR / ES (Acerbi-Tasche 2002)
规则:coherence motivated FRTB switch from VaR to ES in 2019。
Artzner-Delbaen-Eber-Heath(1999)《Coherent measures of risk》(MF)给出风险度量 应满足的四条公理。单调性: 对所有情景 ,蕴含 (每个情景都亏更多 = 风险更大)。次可加性:(组合不会比分散持有更险——多元化公理)。正齐次性:,(头寸放大,风险等比放大)。平移不变性:, 为常数(加一笔确定性损失,风险数字恰好加上它)。
VaR 满足单调、正齐次、平移不变,但在非高斯分布下失次可加性。规范反例:两只独立可违约债券,各 1.5% 违约概率,违约损失 100 元,否则零损。各自 ,。资产池 但 ,精心构造可得 。次可加性失败意味着 VaR 可能惩罚分散化——作为监管度量这显然是错的。CVaR / ES 满足全部四条公理(Acerbi-Tasche 2002 JBF)。这就是 2019 年 FRTB 把监管度量从 VaR 切到 ES 的根本动机。
CVaR-as-LP 与桥到 4.4.3
Rockafellar-Uryasev(2000)《Optimization of conditional value-at-risk》(JoR)证明 CVaR 可通过线性规划直接优化:对离散情景集 、概率 ,
这是关于 的 LP,现代求解器(CVXPY、MOSEK、Gurobi)能处理几百资产、几千情景。CVaR-约束的 MV 问题「 s.t. 」是凸的——这就是 4.4.3「尾部风险约束的组合优化」的入口。
实现:compute_var_cvar
import numpy as np
import pandas as pd
import scipy.stats
def compute_var_cvar(
weights: np.ndarray,
returns_history: pd.DataFrame,
Sigma_BARRA: np.ndarray,
B: np.ndarray,
Sigma_F: np.ndarray,
D: np.ndarray,
alpha: float = 0.99,
V_0: float = 1.0,
n_paths: int = 10000,
nu: int = 5,
) -> dict:
# 历史 VaR / CVaR
pnl_history = returns_history.values @ weights * V_0
var_hist = -float(np.quantile(pnl_history, 1 - alpha))
cvar_hist = -float(pnl_history[pnl_history <= -var_hist].mean())
# 参数法 VaR / CVaR
sigma_L = float(np.sqrt(weights @ Sigma_BARRA @ weights)) * V_0
z_alpha = float(scipy.stats.norm.ppf(alpha))
var_param = z_alpha * sigma_L
cvar_param = sigma_L * float(scipy.stats.norm.pdf(z_alpha)) / (1 - alpha)
# 蒙特卡洛 VaR / CVaR(多元 t 因子 + 高斯特异)
K = Sigma_F.shape[0]
N = D.shape[0]
factor_draws = scipy.stats.multivariate_t.rvs(loc=np.zeros(K), shape=Sigma_F, df=nu, size=n_paths)
epsilon_draws = np.random.multivariate_normal(np.zeros(N), np.diag(D), n_paths)
r_sim = factor_draws @ B.T + epsilon_draws
pnl_sim = r_sim @ weights * V_0
var_mc = -float(np.quantile(pnl_sim, 1 - alpha))
cvar_mc = -float(pnl_sim[pnl_sim <= -var_mc].mean())
return {
"var_hist": var_hist,
"cvar_hist": cvar_hist,
"var_param": var_param,
"cvar_param": cvar_param,
"var_mc": var_mc,
"cvar_mc": cvar_mc,
"alpha": alpha,
"V_0": V_0,
"n_paths": n_paths,
"nu": nu,
}
签名(参数名、默认 alpha=0.99 / V_0=1.0 / n_paths=10000 / nu=5、返回字典键)与 US 版逐字节一致。
实现:Kupiec 回溯检验
下面是 Fenced Python 代码块封装的 Kupiec 失败率检验(Kupiec proportion-of-failures test)。给定 OOS 窗的实现损失序列和该窗每日的 VaR 预测,数 VaR 突破次数,与期望突破数 做对数似然比检验;在原假设「VaR 模型校准良好」下,LR 统计量服从自由度为 1 的卡方分布。p-value > 0.05 通过。这是 FRTB 监管对内部模型法(IMA)桌面的回溯检验必修课:连续超过期望突破数 5%、10% 阈值会触发 Basel 信号灯惩罚乘数(green / yellow / red)上调 0.4–1.0。CN 域内 公募 / 私募 同样在内部风控中跑相同检验,虽然没有 FRTB 监管强制力。
import numpy as np
import scipy.stats
def kupiec_backtest(
loss_realised: np.ndarray,
var_forecast: np.ndarray,
alpha: float = 0.99,
) -> dict:
# Kupiec 失败率 LR 检验
T = int(len(loss_realised))
X = int((loss_realised > var_forecast).sum())
E_X = (1 - alpha) * T
p_hat = X / T if T > 0 else 0.0
if X == 0 or X == T:
LR_PoF = 0.0
else:
LR_PoF = -2.0 * (
(T - X) * np.log(alpha / (1 - p_hat))
+ X * np.log((1 - alpha) / p_hat)
)
p_value = float(1 - scipy.stats.chi2.cdf(LR_PoF, df=1))
pass_5pct = bool(p_value > 0.05)
return {
"T": T,
"X": X,
"expected_X": E_X,
"failure_rate": p_hat,
"LR_PoF": float(LR_PoF),
"p_value": p_value,
"pass_5pct": pass_5pct,
"alpha": alpha,
}
签名(参数名 loss_realised / var_forecast / alpha、默认 alpha=0.99、返回字典键)与 US 版逐字节一致。
回溯检验工作流(numbered procedure)
Kupiec 检验的执行步骤,按顺序:
- 收集 OOS 窗内每天的 VaR 预测
var_forecast与实现损失loss_realised(标准 OOS 长度 250 天)。 - 数突破次数
X = sum(loss > var);期望突破数E_X = (1 - alpha) * T。 - 算似然比统计量
LR_PoF,在原假设下服从 。 - 报告
p_value = 1 - chi2_cdf(LR_PoF, 1);p > 0.05通过。 - 连续两月失败触发 Basel 信号灯(traffic-light)惩罚——绿色 / 黄色 / 红色三档,黄色加 0.4–0.85 乘数,红色加 1.0 并强制切到 SBA。
可视化:三方法 VaR 对比图
Formula Explorer
x^2把同一组合在 上的三种 VaR 画 3 x 3 对比柱状图;参数法高斯条最矮、历史居中、MC-t 最高; 越高三者发散越大。CN 沪深300 由于经验峰度 8–15(US 大盘 5–8),发散往往更剧烈——参数法 99% VaR 可能低估真实尾部 50%。
练习
Exercise
你是 50 只主动权益基金的风险官 (cn: 50 沪深300板块龙头, V_0 = 100,000,000 RMB)。给定 (i) weights(L2 当前主动组合权重), (ii) returns_history(2018–2022 日频样本内收益), (iii) returns_oos(2023 日频样本外收益), (iv) L1 的 Sigma_BARRA、B、Sigma_F、D:(a) 调 compute_var_cvar(weights, returns_history, Sigma_BARRA, B, Sigma_F, D, alpha=a, V_0=V_0, n_paths=10000, nu=5) for a in [0.95, 0.975, 0.99],做 3 x 3 表格,行 [historical, parametric_gaussian, monte_carlo_t],列 [VaR_95, VaR_975, VaR_99];再做同样形状的 CVaR 表。(b) 在 上验证规范排序 var_param < var_hist < var_mc(参数法高斯低估、历史居中、MC-t 最高)。算比值 var_mc / var_param 与 var_hist / var_param,验证 MC-t / param 落在 [1.3, 2.0]、historical / param 落在 [1.1, 1.7]。(c) 参数法高斯 下,验证 ;这是高斯尾部的规范 CVaR/VaR 比。(d) 在 2023 OOS 窗上滚动算历史 99% VaR:每个交易日用过去 500 天窗口重算;收集 var_forecast_2023(252 个日预测)与 loss_realised_2023 = -pnl_realised_2023。调 kupiec_backtest(loss_realised_2023, var_forecast_2023, alpha=0.99);报告 X、expected_X = 2.52、LR_PoF、p_value、pass_5pct。一句话评论历史 99% VaR 在你的地区 2023 年是否通过 Kupiec 检验。(e) 构造双违约债券反例:每只独立 1.5% 概率亏 100 元、否则 0;数值验证 ,而池子(0 / 100 / 200 三态)上算 ;一句话解释为什么这违反次可加性、CVaR 为什么不违反。
提示
np.quantile(pnl, 1 - alpha) 取 P&L 的左尾分位数,前面加负号转成损失。提示
scipy.stats.multivariate_t.rvs 需要 loc 与 shape,shape 用 (不要用 的方差膨胀版本)。实战注脚:CN A 股的尾部异常厚
经验上沪深300的日收益超额峰度比标普500高一截:2015–2023 区间沪深300约 8–15,标普 5–8。原因有三:涨跌停机制(单日限价 10%、ST 股 5%、科创 / 创业 20%)制造离散跳跃和「累积压抑」效应——大跌前一天往往多只票封跌停,实现损失被「推迟」到次日;散户结构(A 股自由流通中散户成交占比长期 60%+)放大情绪波动,挤兑式抛售比美股频繁;场外配资和两融业务在压力期触发被动平仓螺旋,2015 年股灾、2018 年去杠杆都有典型样本。这意味着参数法高斯 VaR 在 CN 域内低估 99% 尾的程度比 US 域内更剧烈——典型参数法 99% VaR 仅是历史 VaR 的 50%–65%,而 US 大盘上这个比值在 70%–85%。机构生产里 CN 域内更倾向于:(a) 直接报历史 99% VaR + MC-t with (比 US 的 更厚尾);(b) 用 Cornish-Fisher 修正参数法;(c) 把压力期(2015 股灾 / 2020 COVID)的样本加权后纳入历史窗。CNE6 商业模型自带「中国市场厚尾修正」选项,FRTB 中国实施版本(《商业银行资本管理办法》2023 修订)对 NMRF 阈值的设置考虑到 A 股流动性结构,与欧美 FRTB 在数值上略有差别。
CN 域内的机构 VaR 实践参照表
CN 域内不同类型机构的 VaR 报告样式有规律可循。公募基金(规模 5–500 亿元):月度报告 95% 月度 VaR;季度报告增加 99% 月度 VaR + 历史最大回撤;不向监管报 FRTB 数。银行系资管(规模 50–2000 亿元):日报 99% 日度 VaR;若涉及银行同业账户需并表 FRTB 97.5% ES + 标准法对照;CBIRC 监管。头部量化私募(千象 / 幻方 / 鸣石 / 灵均,规模 100–500 亿元):日报 99% 日度 VaR(参数 + 历史 + MC-t 三方法);周报 CVaR / 期望损失;月报压力测试。银行自营:严格按 FRTB IMA / SBA 报;NFRA 监管,2024 起《商业银行资本管理办法》新版生效。期货公司风险管理子公司:做 OTC 衍生品需要全估值 MC VaR;CFFEX 自律性要求 + CSRC 主监管。掌握 VaR 的算法和它在各类机构里的具体落地形式是 CN 量化从业者的基本素养——比知道 VaR 是什么更重要的是知道 99% 单日 VaR = 1,800 万 RMB 这个数字对 100 亿元 AUM 私募意味着什么(0.018% V_0,非常宽松)、对 5 亿元 AUM 公募意味着什么(3.6% V_0,接近警戒线)、对 50 亿元 AUM 银行自营意味着什么(0.36% V_0,正常)。
桥接到 L4
L1 / L2 / L3 完成了「典型一天 + 最坏一天」的两层度量。L4 把它们端到端串成机构生产风险体系:(1) 四种压力测试(named / historical replay / hypothetical / reverse)再叠一层「假设的最坏一天」上去;(2) Basel I → II → II.5 → III → FRTB 监管演进,讲清楚为什么 2023 起 97.5% ES 替代 99% VaR 成为监管头条;(3) FRTB 四大新规——流动性期限、不可模型化风险因子(NMRF)、损益归因检验、内部模型法 vs 标准法。L3 的 CVaR 公式是 FRTB 的 97.5% ES 算法核心;L3 的历史 VaR 是 FRTB「压力期 VaR」的算法基础。L4 给出一张机构风控官每周提交风险委员会的「一页式风险报告」模板。