资讯详情 从零搭建你的 A 股量化系统(四十六):VaR 与 CVaR——散户版风险度量实操(附代码与图)
📅 2026/10/8 23:09:20
系列名:《从零搭建你的 A 股量化系统》| 专栏 S4 金融理论 | 第 5 篇 / 共 16 篇 | T1 度量层标签:#量化投资 #金融理论 #VaR #CVaR #风险度量 #厚尾 #GARCH #A股 #散户上篇(S4-004)把「过去的风险」拆成了四块:最大回撤管亏得多深、水下曲线管套了多久、Calmar 算回撤性价比、Sortino 只罚下跌。四块拼图有个共同点——都拿历史价格算,回答的都是「曾经」。这一篇换一个问题:明天最坏能亏多少。它不再问「过去亏了多少」,而是给未来的亏损配一个概率门槛——这就是 VaR 与 CVaR。三种算法(历史模拟 / 正态参数 / 蒙特卡洛)、一条反直觉性质(VaR 不满足次可加)、一条动态口径(接 S4-002 的 GARCH 条件波动),构成散户能落地的「事前」风险度量。🔴本篇 vs S1(先分清):S1 到「会算收益、会画回撤曲线」为止。本篇问的是另一类量——给未来的亏损配一个概率,涉及的 VaR 定义、尾部条件期望、次可加性,S1 都没碰过。🟡本篇 vs S2:S2-019 教怎么把净值与回撤回图画得清楚。本篇画的直方图加四条竖线,是用来看「正态拟合在 ±3% 之外几乎归零、而真实分布仍有柱子」这件事,不是画图技巧。🟢闭环 S4-001 / 002 / 003 / 004:脚本顶部复用s4_001_returns的取数兜底与收益口径、s4_002_volatility的 GARCH、s4_003_sharpe的无风险利率;年化波动沿用对数收益std × √252。S4 层层递进,口径必须是同一个。【本篇实证数据】本篇沿用 S4-001 约定好的全系列口径,并把风险度量的两个参数固定下来:项约定标的单资产茅台 600519(S4-001~005 共用)区间2024-01-02 ~ 2026-08-07样本量629 个价格点→628 个日收益样本(约 2.5 年)数据源AkShare 东财 → 腾讯 → 本地库(三级兜底);本篇实际落到腾讯跨源对拍Tushare(收盘/单位核验 + 除权日核对)+BaoStock(独立重算历史 VaR/CVaR),只对拍不合并价格口径前复权 qfq(接 S3-003)收益口径对数收益(S4-001 铁律)年化天数252 个交易日(全系列统一)无风险利率rf = 1.5%(S4-003 约定,报告口径一致)置信水平95% 与 99%双档蒙特卡洛路径数50000 条动态波动GARCH(1,1) 条件波动(接 S4-002),本篇茅台 α = 0.148、β = 0.675VaR 与 CVaR 都是收益分位数 / 尾部均值,只由收益序列决定,对复权基准不敏感(前后复权只是把价格整体乘一个常数)——所以它们既能跨源核对,也能跨篇复用。本篇拿两个源实测,见 §七。📖 前置知识已跟完S4-001(三种收益、几何 vs 算术年化)——本篇脚本直接import上篇模块;已跟完S4-002(三种波动率、GARCH 的 MLE 拟合)——本篇用它的条件波动算「动态 VaR」;已跟完S4-003(夏普的五类坑)——rf = 1.5%与夏普口径一致;已跟完S4-004(MDD / 水下曲线 / Calmar / Sortino)——本篇兑现它结尾留的「未来风险」;会用 Python + pandas;本篇新增依赖只有scipy.stats.norm(解析分位数与密度,S4-002 已随 GARCH 装上),联网取数需akshare,跨源对拍需tushare与baostock。一、先说结论这一篇的内核:MDD、Calmar、Sortino 告诉你「过去亏过多少」,VaR 告诉你「未来最坏能亏多少」——但 VaR 自己有三个盲区(不是最大亏损 / 厚尾下低估 / 不满足次可加),必须配 CVaR 和动态波动才能用对。红线表:🔴 红线原因(一句话)正确做法用波动率 σ 当「风险」σ 是「平均颠簸」,不回答「95% 那天最多亏多少」——它是算子,不是结论报告必带 VaR + CVaR,σ 只作中间量正态法当万能厚尾下参数法系统性偏乐观——用峰度贴近 A 股的 5 万样本构造实测:99% VaR 低估约1.49×、99% CVaR 低估约2.13×用历史模拟或 GARCH 动态,别只报正态法一个数把 VaR 当「最大亏损」95% VaR 意味着剩下 5% 的概率里还能亏更多——「最大」那段 VaR 看不见用 CVaR(尾部平均)补齐,它是 VaR 的补救者假设「分散化必降 VaR」VaR 不满足次可加(self-test:两个各自 VaR=0 的策略,组合后 VaR=1)组合风险用 CVaR 评估——CVaR 满足次可加日 VaR × √T 直接用只对 μ=0 精确;μ≠0 时漏掉均值项 −T·μ完整公式√T·z·σ − T·μ,波动率用 GARCH 当前值置信越高越保险99% 分位只由约 6 个观测决定(629 日),参数微动分位就跳用 CVaR(尾部均值比单分位稳),报告注明样本期把 VaR 当止损线VaR 是事前统计量,止损是行为规则,两者不冲突但别混用仓位设计与压力测试用 VaR,止损另立规则只看历史模拟假设「过去 = 未来」,样本太短或制度变化时失效历史 + 正态 + 蒙特卡洛 + GARCH 四方法互验,找差距最大的单独审视红线之外,就讲三件事:① VaR 与 CVaR 的定义、三种算法(历史模拟 / 正态参数 / 蒙特卡洛)和多日换算的完整公式;② 两条数学性质——正态法在厚尾下系统性低估(5 万样本构造实测:99% VaR 低估 1.49× / 99% CVaR 低估 2.13×),以及「VaR 非次可加、CVaR 满足次可加」;③ 一条跨源核对出来的硬结论——Tushare 给出全部5 个除权日、BaoStock 独立重算历史 VaR 差0.0000 pp,GARCH 动态 VaR 的实测口径也一并交代。二、VaR:把「未来最坏」变成一个数2.1 定义与直觉VaR(Value at Risk,在险价值):给定置信水平 α(如 95%),未来持有期(如 1 天)内损失不超过某个数。数学定义:VaRα=−Quantile1−α(r)\text{VaR}_\alpha = -\text{Quantile}_{1-\alpha}(r)VaRα=−Quantile1−α(r)也就是收益分布 (1−α) 分位数的相反数。写成一句话:「95% 的日子,损失不会超过 VaR;剩下 5% 的日子里,会亏得更多。」返回正数,表示亏损百分比。直觉例子,用茅台实测的两个数:95% VaR = 2.16%(历史模拟)——628 个日收益样本里,95% 的日子(约 597 天)单日跌幅不超过 2.16%,剩下约 31 天会更惨;99% VaR = 3.27%(历史模拟)——99% 的日子(约 622 天)不超过 3.27%,剩下约 6 天更惨。self-test 第 1 组把这个定义钉死:[✅] 历史VaR-定义 (序列[-2%,-1%,0%,1%,2%] 99% VaR=1.96% (线性插值取1%分位≈-2%))VaR 是一个分位数,不是「最大可能亏损」。它是门槛:门槛之内是那 95%,门槛之外还有 5% 的尾部。这句话是 CVaR 存在的全部理由(见第四节)。2.2 三个误区误区一:VaR = 最大亏损。95% VaR 只保证「95% 的日子不亏超过它」,剩下 5% 的尾部有多深,VaR 一概不说。茅台实测:99% VaR = 3.27%,但最坏那 1% 的日子平均亏 4.36%(99% CVaR)——VaR 漏看的正是这一段。误区二:VaR = 止损线。VaR 是事前预测的统计量(「未来可能亏多少」),止损是行为规则(「跌到某个价位就卖」)。两者不冲突,但把 VaR 直接当止损会出问题:① VaR 有估计误差,参数微动分位就跳,按它止损会「擦枪走火」;② 遇到跳空、流动性枯竭这类极端行情,VaR 不回答「你跑得掉吗」。误区三:置信水平越高越保险。99% 比 95% 更保守没错,但分位数的稳定性与尾部样本量成反比:95% 由 5% 的尾部决定(628 日约 31 天),99% 由 1% 的尾部决定(约 6 天)。6 个观测的均值方差极大,参数稍微一动分位就跳。所以「更高置信 = 更不稳定」,实战里95% 反而比 99% 更常用,99% 只用来看「极端尾部大概在什么量级」。self-test 第 3 组验证单调性(越保守门槛越高):[✅] 置信单调-VaR (95% 3.28% 99% 4.53% (越保守门槛越高))三、三种算法与多日换算3.1 历史模拟法:不假设分布历史模拟直接用收益序列的经验分位数:defvar_historical(rets,alpha=0.95):"""历史模拟 VaR: 收益 (1-α) 分位数的相反数。"""return-rets.quantile(1-alpha)它的优点是非参数——不假设收益服从哪种分布,A 股的厚尾直接用经验分布本身表达。缺点是尾部不稳:算 99% VaR 时只有约 6 个观测参与,样本换一段数字就变;它还隐含假设「历史分布会重演」,制度变化时会失效。它是散户的第一选择,因为它不做任何关于形状的假设。3.2 正态参数法:一行公式,一个致命假设正态参数法假设收益服从 N(μ, σ²),解析公式为:VaRα=zα⋅σ−μ(zα=Φ−1(α)0)\text{VaR}_\alpha = z_\alpha \cdot \sigma - \mu \qquad (z_\alpha = \Phi^{-1}(\alpha) 0)VaRα=zα⋅σ−μ(zα=Φ−1(α)0)defvar_normal(mu,sigma,alpha=0.95):z=norm.ppf(alpha)# 95% → 1.645, 99% → 2.326returnz*sigma-mu符号要留意:zαz_\alphazα是右尾的 α 分位(正数),乘上 σ 得到「相对均值的向下偏离强度」,再减去均值 μ。μ 0(有正漂移)会把 VaR 压低。它的好处是一行公式、不需要历史分布,适合做实时估算;代价是**「收益正态」这个假设**——A 股不满足,厚尾下 99% VaR 会被系统性低估(见第五节)。self-test 第 5、6 组把它和蒙特卡洛对拍:[✅] 正态VaR-解析 (VaR=3.24% (μ=0.05% σ=2% → 手算 zσ−μ=0.0324)) [✅] 正态VaR-公式vs蒙特卡洛 (解析 3.24% vs 蒙特卡洛 3.22%)3.3 蒙特卡洛:用历史参数撒大量路径蒙特卡洛用历史的 (μ, σ) 生成大量模拟收益,再取经验分位:defmonte_carlo_var_cvar(rets,alpha=0.95,n_sims=50000,seed=42,sigma_day=None):mu=float(rets.mean())ifsigma_dayisNone:sigma_day=float(rets.std(ddof=1))# 可换成 GARCH 当前波动sims=np.random.default_rng(seed).normal(mu,sigma_day,n_sims)q=np.quantile(sims,1-alpha)return-q,-sims[sims=q].mean()# 同时返回 CVaR它比历史分位稳(50000 条路径把 99% 分位的抽样误差压得很小),也灵活——sigma_day可以换成 GARCH 的当前条件波动(第六节)。局限:它仍然假设收益正态,只是把「取分位」这一步换成了大样本模拟;想摆脱正态假设,要从历史分布里自助采样(bootstrap)。3.4 多日换算:完整公式 vs ×√T持有期从 1 天拉长到 T 天时,散户背得最熟的口诀是「日 VaR × √T」。这句口诀只在 μ=0 时精确。严格的对数收益口径下(S4-001 说过对数收益时间可加),T 日 VaR 是:VaRT=T⋅zα⋅σ−T⋅μ\text{VaR}_T = \sqrt{T} \cdot z_\alpha \cdot \sigma - T \cdot \muVaRT=T⋅zα⋅σ−T⋅μdefvar_multiday(mu,sigma,t_days,alpha=0.95):z=norm.ppf(alpha)returnnp.sqrt(t_days)*z*sigma-t_days*mu# √T·zσ − Tμ为什么均值项也要按 T 放大?因为 T 天的累计对数收益均值为 T·μ(对数收益可加),漂移是线性累积的;方差是线性累积的,所以波动按 √T 放大。两项目标不同、一个乘 T 一个乘 √T,口诀漏掉的正是那个乘 T 的均值项。茅台实测(μ = −0.0249%/日、σ = 1.475%/日):── 多日换算 (iid 正态近似, 完整公式 √T·z·σ−Tμ vs 口诀 ×√T) ── 1 日 95% VaR ≈ 2.45% (24,506 元) ×√1 近似 2.45% 5 日 95% VaR ≈ 5.55% (55,487 元) ×√5 近似 5.48% 20 日 95% VaR ≈ 11.35% (113,468 元) ×√20 近似 10.96%self-test 第 12 组把三种情形都钉住:[✅] 多日-完整公式自洽 (T 日 VaR = √T·zσ−Tμ 与 直接 var_normal(Tμ, √T σ) 一致) [✅] 多日-μ=0近似精确 (μ=0: 日 VaR×√5 = 完整公式 (近似精确)) [✅] 多日-μ0近似偏保守 (μ0: 日VaR×√5=7.244% 完整公式 7.106% (忽略 -Tμ 项偏保守))μ 0 时口诀偏保守(高估 VaR),μ 0 时偏乐观(低估)。A 股个股 μ 多为负,所以「日 VaR × √T」在 A 股上常常低估多日风险——这也是第五节厚尾低估之外的又一层低估。四、CVaR:比门槛更狠的尾部平均4.1 定义:尾部条件期望CVaR(Conditional VaR)/ 期望损失(Expected Shortfall):CVaRα=− E [r∣r≤Quantile1−α(r)]\text{CVaR}_\alpha = -\,E\!\left[r \mid r \le \text{Quantile}_{1-\alpha}(r)\right]CVaRα=−E[r∣r≤Quantile1−α(r)]也就是**「收益 ≤ VaR 门槛的那些日子,平均亏多少」**。VaR 只说门槛在哪,CVaR 说门槛之内有多惨。茅台实测,两档置信下的 VaR 与 CVaR:置信VaR(单点门槛)CVaR(尾部平均)差距95%2.16%2.92%+0.76%99%3.27%4.36%+1.09%99% 处 CVaR 比 VaR 高约 33%——这正是厚尾的形状:尾部一旦被触发,平均比门槛狠得多。实现上用「最差 k 个观测的均值」(k = ⌈(1−α)·n⌉),比取单分位稳:defcvar_historical(rets,alpha=0.95):n=len(rets)k=max(1,int(np.ceil((1-alpha)*n)))return-float(np.sort(rets.values)[:k].mean())4.2 正态法 CVaR 的解析公式若收益服从 N(μ, σ²),CVaR 有闭式解:CVaRα=−μ+σ⋅ϕ(zα)1−α\text{CVaR}_\alpha = -\mu + \frac{\sigma \cdot \phi(z_\alpha)}{1 - \alpha}CVaRα=−μ+1−ασ⋅ϕ(zα)其中 φ 是标准正态密度。它由「尾部条件期望」推出来:损失 L = −r 服从 N(−μ, σ²),E[X | X −z] = −φ(z)/Φ(−z),而 Φ(−z_α) = 1 − α,合并即得上式。代入 α = 0.95:z = 1.645、φ = 0.1031,得 CVaR = −μ +2.06σ,比 VaR 的 1.645σ 高约 25%。self-test 第 7 组把这个系数关系钉住:[✅] CVaR≥VaR-正态解析 (95%: CVaR 2.063σ VaR 1.645σ; 99%: CVaR 2.665σ VaR 2.326σ)4.3 VaR 非次可加,CVaR 满足次可加这是 CVaR 在数学上「应该比 VaR 优先」的核心原因,也是本文最反直觉的一条。次可加性指「合并不会比拆开更差」:CVaR(X+Y)≤CVaR(X)+CVaR(Y)\text{CVaR}(X + Y) \le \text{CVaR}(X) + \text{CVaR}(Y)CVaR(X+Y)≤CVaR(X)+CVaR(Y)这一条VaR 不满足。self-test 第 10 组用确定性离散分布构造:X、Y 独立同分布,P(r = −1) = 3%、P(r = 0) = 94%、P(r = +1) = 3%。X 的 5% 分位:P(r ≤ 0) = 97% ≥ 95%,所以 5% 分位落在 0 →VaR(X) = 0(「95% 的日子不亏」);X + Y 的分布里,P(X+Y ≤ −1) = 5.73% ≥ 5%,所以 5% 分位落在 −1 →VaR(X+Y) = 1。[✅] VaR-非次可加 (VaR(X)=VaR(Y)=0.00 但 VaR(X+Y)=1.00 0 (分散化反而增加 VaR!))VaR(X+Y) = 1 VaR(X) + VaR(Y) = 0——两个「95% 不亏」的策略拼在一起,VaR 反而从 0 升到 1。这就是「分散化不保证降 VaR」:VaR 是分位数,对分布的形状(凸性)不敏感,两个策略各自的最坏日子不同步时,组合的分位数位置反而右移。同一个构造下 CVaR 则是正常的:[✅] CVaR-次可加 (CVaR(X)+CVaR(Y)=1.200 ≥ CVaR(X+Y)=1.018 (分散化降 CVaR))这一条决定了实操:评估组合风险用 CVaR,不要用 VaR。CVaR 是一致风险度量(Artzner 等 1999 年的四条公理它全满足),分散化在它这里一定不会帮倒忙。五、厚尾下正态法为什么低估(A 股实测)5.1 超额峰度:厚尾的量化正态假设的代价,用超额峰度量化:ExcessKurt=E [(r−μσ)4]−3\text{ExcessKurt} = E\!\left[\left(\frac{r-\mu}{\sigma}\right)^4\right] - 3ExcessKurt=E[(σr−μ)4]−3正态分布的超额峰度恰为 0;A 股收益普遍为正。茅台这 628 天的实测是7.85——意味着极端值比正态预测的更频繁、更狠。5.2 构造验证:VaR 低估 1.49×、CVaR 低估 2.13×要公平地展示正态法低估了多少,得让正态法用同一个样本的 σ(拿 σ=1 去冒充是不公平的稻草人)。self-test 第 8、9 组构造了一个贴近 A 股的超额峰度分布(95% 常规波动 + 5% 极端波动,50000 样本),正态法用这个样本自己的 σ:[✅] 厚尾-正态法低估VaR (混合历史 8.40% vs 正态 5.63% (低估 1.49×)) [✅] 厚尾-正态法低估CVaR (混合历史 13.69% vs 正态 6.44% (差 2.13×))正态法把 99% VaR 低估了约 1.49 倍,把 99% CVaR 低估了约 2.13 倍。CVaR 处的低估更严重,因为尾部形状被低估得更多——VaR 只挑一个分位点,CVaR 要在这个点之外再取平均,形状的偏差在这一步被放大。5.3 茅台实测:峰度 7.85 是「双刃剑」把四种方法铺在同一张表上(日度,亏损为正数):方法 95%VaR 95%CVaR 99%VaR 99%CVaR 历史模拟 2.16% 2.92% 3.27% 4.36% 正态参数 2.45% 3.07% 3.46% 3.96% 蒙特卡洛 2.46% 3.07% 3.47% 3.98% GARCH动态 2.43% 3.04% 3.43% 3.92%先看历史与正态的对比,两档置信下的方向竟然相反:95% 档:历史 2.16%小于正态 2.45%——历史法算出来反而更「安全」;99% CVaR 档:历史 4.36%大于正态 3.96%——历史法算出来更「危险」。原因在峰度高的分布有两个相反的效应:中间更尖:数据大量堆在 0 附近,5% 分位的位置比正态浅,所以 95% VaR 历史 正态;尾部更重:一旦进入最极端的 1%,平均亏损比正态深,所以 99% CVaR 历史 正态。VaR 会被「中间更尖」迷惑(看起来安全),CVaR 才暴露「尾部更重」。这就是「看风险不能只看 VaR」的实测依据:同一份收益,VaR 说两种口径差不多(甚至历史更小),CVaR 说历史口径更狠。5.4 读图:直方图 + 正态拟合看下面这张图的最上面板:三面板——上:茅台日收益直方图 + 正态拟合 + 95% VaR/CVaR 竖线;中:四方法 × 95%/99% VaR 分组条形;下:GARCH(1,1) 条件波动 + 静态 σ 虚线 + 滚动 252 日历史 95% VaR。样本 2024-01-02 ~ 2026-08-07 前复权。浅蓝柱(日收益频率):0% 附近最高,峰度 7.85 的「尖峰」;蓝色虚线(正态拟合):比柱状图矮,且在 ±3% 之外迅速贴近 0;红色竖线(历史 95% VaR 2.16%)比蓝色点线(正态 95% VaR 2.45%)更靠右(更浅)——「中间更尖」的视觉证据;橙色竖线(历史 95% CVaR 2.92%)落在红色竖线左侧,是尾部门槛内的平均位置。关键在±3% 以外的区域:正态拟合几乎归零,可直方图仍有非零的柱子。这些柱子就是厚尾——正态法看不见它们,所以会把极端风险算小。六、GARCH 动态 VaR:让风险度量跟着市场走6.1 波动聚集回顾S4-002 实证过:波动是抱团的——大波动日之后大概率跟大波动日。这带来一个直接推论:「当前波动」≠「长期平均波动」:市场刚经历大跌时,当前波动可能是长期平均的两三倍;静态 VaR 用全样本 σ:在波动聚集期会低估「今天的风险」;动态 VaR 用 GARCH 当前条件波动:跟着市场状态走。把正态法的 σ 从「全样本标准差」换成「GARCH 当前条件波动」,就得到动态 VaR。这不是新方法,只是把 σ 这个输入换成了时变的。6.2 茅台实测:当前恰好处在稳态,动态 ≈ 静态GARCH 动态波动: 1.462%/日 (年化 23.2%, α=0.148 β=0.675) 静态(全样本σ)95% VaR = 2.45% vs GARCH动态(当前σ)95% VaR = 2.43%茅台的 GARCH 当前条件波动 1.462%/日,几乎等于全样本 σ 1.475%——差距不到 1%。这不是动态 VaR 没用,而是当前正好处在波动均值回归的稳态,动态和静态差别自然小。(GARCH 参数 α = 0.148、β = 0.675 与 S4-002 完全一致,是同一个口径。)6.3 什么时候动态 静态:regime 高波动期要看动态 VaR 的价值,得看波动聚集期。self-test 第 13 组构造一段「前 400 日低波动、后 400 日高波动」的 regime 切换:[✅] GARCH-动态静态 (当前波动 2.93%/日 全样本 2.23%/日 → 动态VaR 4.82% 静态 3.67%)进入高波动 regime 后,当前条件波动 2.93%/日 明显高于全样本平均 2.23%/日,动态 VaR 比静态高约 31%。这就是区别:常态下动态 ≈ 静态,一旦市场切到高波动,动态 VaR 是「活的」,静态 VaR 还停在长期平均上。6.4 读图:条件波动 vs 静态直线看图中最下方面板:紫色实线(左轴):GARCH(1,1) 条件波动(年化)——2024 年 9 月底到 10 月初那波急涨急跌里冲到71.6%(峰值在 2024-10-08),其余时间大多在 20% 上下(中位数 20.6%,最低 17.5%);黑色虚线(左轴):静态 σ × √252 = 23.4%——恒为一条直线;红色实线(右轴):滚动 252 日历史 95% VaR——跟着市场起伏,2025 年下半年从 2.36% 缓降到 1.78%(全区间落在 1.78%~2.40%)。紫色线永远不恒为常数,这就是「动态」。静态虚线只给一个长期平均值;当市场进入高波动期(如 2024 年 10 月初),静态 VaR 不会提醒你「今天要小心」,动态会。七、跨源对拍:这个 2.16% 可信吗VaR 与 CVaR 是模型输出,不是客观读数。换独立数据源重算,看数字稳不稳,这是 S3 立下的规矩(跨源只对拍不合并)。三个数据源的官方文档:源用途文档AkShare主源(东财 → 腾讯三级兜底)https://akshare.akfamily.xyz/registry.htmlTushare收盘/单位核验、除权日核对https://tushare.pro/document/2BaoStock另一套前复权序列,独立重算历史 VaR/CVaRhttps://baostock.com/mainContent?file=pythonAPI.md7.1 Tushare:价格、单位、除权日Tushare 末交易日 2026-08-07: 东财/腾讯(qfq)=1309.22 Tushare(不复权)=1309.22 差=0.0000 Tushare 单位核验: vol=24975.81手 ×100=2497581股; amount=3266919.42千元 ×1000=3266919421元 除权/除息日核对 (pre_close ≠ 前日 close): 20240619, 20241220, 20250626, 20251219, 20260626三件事一次核完:末交易日收盘一致:腾讯前复权与 Tushare 不复权都是 1309.22,差 0.0000(末交易日两者本就重合,因为前复权以最新价为基准);单位核验:vol是手(×100 得股)、amount是千元(×1000 得元)——S3 反复强调的单位归一化,这里当场验一遍;除权日定位:pre_close(前收盘价)在除权日会被调整成「除权后的昨收」,所以它和前一日记录的close不相等。这条判据给出区间内全部 5 个除权日:2024-06-19、2024-12-20、2025-06-26、2025-12-19、2026-06-26。除权日的意义在本篇与在 S4-004 不同:S4-004 用来看「不复权把 MDD 放大 6 个点」;本篇用它确认收益序列已经做过复权——只有复权后的收益,VaR 才反映真实下跌,而不是被分红跳空污染。7.2 BaoStock:独立重算,差 0.0000 ppBaoStock 取了另一套前复权序列(复权基准与腾讯源不同,绝对价格有差异),用它独立重算历史模拟 VaR / CVaR:BaoStock 对拍: 629 行, sh.600519, 历史模拟 VaR/CVaR 独立重算 95% VaR : 2.16% vs 主源 2.16% 差=0.0000 pp 99% VaR : 3.27% vs 主源 3.27% 差=0.0003 pp 99% CVaR: 4.36% vs 主源 4.36% 差=0.0001 pp两个源的历史模拟 VaR 几乎完全重合(95% 差 0.0000 pp、99% VaR 差 0.0003 pp、99% CVaR 差 0.0001 pp)。原因和 §【本篇实证数据】说的一致:VaR/CVaR 是收益的分位数与尾部均值,收益对复权基准不敏感——同一份因子表里,前复权与后复权只差一个整体比例常数,取收益时分位数直接约掉。跨源时要小心一层:不同数据源在除权日的折算方式未必一致(S3-003 实测过,东财与腾讯的茅台前复权序列在除权日上就能差出 0.25 的峰度),所以跨源重合的前提是两边都做了复权、且除权处理没有打架;这一篇 5 个除权日上两个源的处理一致,才得到 0.0000 pp。这印证了一句话:该不该复权,比用哪个源更重要。两个源都复权了,历史模拟 VaR 就一致;若拿不复权价算收益,除权日的向下跳空会被当成真实下跌,VaR 直接被污染(S4-004 里同样口径的 MDD 差 6.05 pp)。八、踩坑速查表现象根因修法报风险只写「波动率 23%」σ 是平均颠簸,不是分位数补 VaR + CVaR 两个数99% VaR 比别人小一大截用了正态参数法,厚尾下低估(构造实测约 1.49×)换历史模拟或 GARCH 动态把 VaR 当「最多亏这么多」VaR 是门槛不是最大值,尾部在门外用 CVaR 描述尾部门内平均组合 VaR 比单个加起来还大VaR 不满足次可加,分位数对组合不友好组合风险改用 CVaR组合 CVaR 也「不降」标的同涨同跌,分散化本就无效先看相关系数,再谈分散5 日 VaR 直接用 日 VaR×√5漏掉均值项 −T·μ,μ0 时低估用√T·z·σ − T·μ动态 VaR 和静态一模一样当前正处波动稳态(茅台此刻就是)看 GARCH 条件波动时序是否在长期均值附近99% 分位数今天一个样明天一个样尾部样本太少(629 日约 6 个观测)用 CVaR(尾部均值更稳),并注明样本期按 VaR 设止损,频繁被扫VaR 是事前统计量,有估计误差止损用 ATR 类规则,VaR 只做仓位与压测指数用--symbol 000300取数报错个股接口表里没有指数,000300 还会被判成深市脚本自动识别指数并改走stock_zh_index_daily(前缀399xxx→sz,其余→sh)用不复权价算 VaR,数值偏大除权跳空被当成下跌(区间内 5 个除权日)全程前复权 qfq(S3-003)换了数据源 VaR 对不上一个源复权、一个源不复权先对齐复权口径,再比数字只报一个方法的结果单一方法没有交叉验证历史 + 正态 + 蒙特卡洛 + GARCH 四方法互验九、散户怎么用先建立三个判断习惯,再谈具体计算。看到任何风险数字,先问它是「门槛」还是「平均」。VaR 是门槛(95% 的日子不越过),CVaR 是门内平均。报告里只有 VaR 没有 CVaR,你就看不到最坏那一段有多惨——茅台的 99% CVaR 4.36% 比 99% VaR 3.27% 高出一大截。厚尾资产默认不信正态法。A 股个股超额峰度普遍为正(茅台 7.85),正态法在高分位处会把尾部亏空估小——茅台 99% CVaR:正态3.96%,历史模拟4.36%。要么用历史模拟,要么用 GARCH 动态。组合风险看 CVaR,不看 VaR 之和。VaR 不满足次可加,把各标的 VaR 相加会既可能高估也可能低估;CVaR 一定不会因分散化而变糟。落地到三个动作:动作一 · 金额换算。把百分比换成钱:VaR% × 持仓市值 = 金额。100 万持仓茅台:95% VaR = 21,572 元 | 99% VaR = 32,672 元 | 95% CVaR = 29,178 元「明天亏 2.16 万以内的概率 ≥ 95%」——比「日波动 1.5%」直观得多。动作二 · 用 VaR 反推仓位上限。若你能接受的单日最大亏损是 X 元:仓位上限=XVaRα\text{仓位上限} = \frac{X}{\text{VaR}_\alpha}仓位上限=VaRα