同一段 S&P 500 日收益率,同样取 5% 尾部概率,同样一个 1,000 美元的组合,四种算风险的方法给出四个数字:18.32、16.06、12.23、11.72。最低的是最高的六成四。这不是谁算错了,是历史模拟、EWMA、正态 GARCH、t-GARCH 四种模型对"最近发生了什么"和"尾部有多厚"的判断不一样。
《Financial Risk Forecasting Notebook》第 5 版就是拿这四种方法做这件事的。作者 Jon Danielsson 在伦敦政治经济学院任教,这份在线笔记配合他的同名教材使用,2026 年 8 月 27 日发布第 5 版,共 31 章。全部免费在线阅读,不需要注册。
第 5 版把
R、Python、Julia 并排放在同一页
2024 年那版在线笔记只讲 R,代码也主要给 R。第 5 版改了做法:每个代码块都是一组标签页,
R、Python、Julia 三份实现叠在一起,翻到哪一章、切到哪种语言,位置是对齐的。配套网站另外还有 Matlab 的示例,但笔记本本身只维护这三种。
31 章分六块:
导论(1—5 章):背景、金融与经济数据、编程语言、变量与对象、日期与时间。
编程(6—17 章):环境配置、R/Python/Julia 三种语言的变量写法、文件格式、本书用的数据集、画图、时间序列、描述统计、模拟、最佳实践、汇报与报告。
波动率(18—22 章):单变量波动率模型、波动率模型的评价、模型失效的情形、手工估计、多变量波动率。
风险(23—28 章):风险预测的实现、组合风险、风险的模拟方法、跑回测、检验回测、模型风险与监控。
参考(29—31 章):学习资源、数据供应商、完整报告模板。
第 23 章和第 26 章是整套东西的落点。前者把波动率模型变成 VaR 和 ES,后者把同一套函数放进滚动窗口跑成千上万次。
四种方法在同一段数据上的分歧
第 23 章用四种方法算了同一个组合的次日风险,输出直接印在页面上:
历史模拟给 18.32 的 VaR 和 30.53 的 ES,是四个里最高的。它只用估计窗口里真实发生过的损失排序取分位数,不做分布假设。代价是移动很慢:一笔大亏损只要还在窗口里就一直占满权重,掉出窗口那天又一次性消失,所以市场平静下来很久之后它还可能挂在高位。
EWMA 给 16.06 和 20.14,波动率预测 0.0098。指数权重让最近几天主导结果,反应快,但它是正态分布且没有均值回复,预测永远跟着最近的行情走,不会被拉回长期水平。
正态 GARCH 给 12.23 和 15.33,波动率预测 0.0074。它把均值回复补上,让数据自己去估波动率的动态,只是仍然假设新息是正态的,尾部的形状完全由波动率路径决定。
t-GARCH 给 11.72 和 16.46,估出来的自由度 5.71。这里有个容易被跳过的细节:在 5% 这个位置上,t-GARCH 的 VaR 反而比正态 GARCH 低,因为标准化 t 分布和正态密度在靠近中段的地方交叉,分位数更小;厚尾的代价体现在 ES 上,ES 对整条尾部取平均,t-GARCH 的 16.46 明显高过正态 GARCH 的 15.33。想看清厚尾效应,得看 ES 而不是 5% 的 VaR。
再往下到 1%,差距就压不住了。第 23.8.2 节把两种分布在 1% 概率、单位方差下的乘数直接列表:
| 分布 | VaR 乘数 | ES 乘数 | ES/VaR | VaR 比正态 | ES 比正态 |
| 正态 | 2.3263 | 2.6652 | 1.146 | 基准 | 基准 |
学生 t
(4) | 2.6495 | 3.6915 | 1.393 | +13.9% | +38.5% |
学生 t
(5) | 2.6065 | 3.4488 | 1.323 | +12.0% | +29.4% |
学生 t
(6) | 2.5660 | 3.2925 | 1.283 | +10.3% | +23.5% |
| 学生 t(30) | 2.3739 | 2.7685 | 1.166 | +2.0% | +3.9% |
自由度 4 时,ES 比正态高 38.5%,VaR 只高 13.9%。自由度回到 30,两个数都收敛到 2% 到 4%。所以"用 t 分布"这句话本身不构成结论,得看估出来的自由度落在哪。
三份实现跑出来的数只差第三位小数
跨语言一致性在第 23.10 节单独列了三张表。历史模拟和 EWMA 在三种语言里完全相同,因为这俩没有需要优化的参数。两个 GARCH 有小差别:正态 GARCH 的 VaR 是 Julia 12.23、Python 12.22、R 12.23;t-GARCH 的 ES 是 Julia 16.48、Python 16.43、R 16.46;自由度 Julia 5.69、Python 5.76、R 5.71。
作者把原因写在页面上了:三个包的优化算法不同、参数估计的初值不同、极大似然估计的数值精度不同。他的判断是这些差别小到可以在实务里忽略。对读代码的人来说,这个差别反而是有用的信号:三个独立实现能对到千分位,说明代码本身没有理解偏差。
回测真正的瓶颈是估计速度
第 26 章要跑滚动窗口回测,每个交易日都要重新估一次 GARCH,几千次下来,包选错就是几小时的差别。作者用 2,000 个观测的窗口做了 GARCH(1,
1) 单次估计的计时:
| 平台 | 包 | 正态(毫秒) | 学生 t(毫秒) |
| R | tseries | 0.7 | 不支持 |
| Julia | ARCHModels | 0.8 | 1.6 |
| Julia | 手写 Nelder-Mead | 1.5 | 不支持 |
| Python | arch | 4.7 | 6.9 |
| R | fGarch | 13 | 41 |
| R | rugarch | 42 | 66 |
| R | tsgarch | 180 | 296 |
最快和最慢差了两个数量级以上。tsgarch 慢是因为它支持的 GARCH 变体和分布最多,rugarch 同理。R 里正态误差用 tseries 最快,但它只支持正态,要 t 分布就得换 fGarch。作者自己也注明这组计时是相对参考,没有记录硬件和包版本,不能当可复现的基准。
回测框架本身很小:三种语言各有一个 common/functions 文件,里面放四个 Risk_ 函数和一个 RunOneDay(),后者算单个交易日的全部方法。窗口、概率、组合价值对所有模型统一,保证可比。结果存成各语言的二进制格式(.RData、.pkl、.jls),并附上运行日期、机器名、包版本、起止日期。理由是重估几千次太贵,而下一章的统计检验是另一件事,不该每次重跑估计。
并行部分给了四种写法:R 的 mclapply 在 Mac 和 Linux 上靠 fork,Windows 上用 foreach 加 doParallel 建集群,Python 用 joblib 的 n_jobs=-1,Julia 用 Threads.@threads 共享内存。路径选择本身是有信息量的:fork 省事但不能跨平台,集群方式要显式把库和变量送到工作进程。
它明确说了自己不做什么
页面开头就把边界划清:这套笔记不推导风险预测的数学,也不从零教编程,作者认为这两件事有更好的资料。教材和讲义承载数学与统计,编程部分只复习后面要用到的语言基础,第 29 章给三种语言的训练材料链接。它做的是把规格、代码和数据拼起来,产出市场风险预测。
范围也只到交易账户的市场风险,监管框架本身不展开,留给第 13 章。组合优化、风险预算、压力测试只提了一句"超出范围"。
第 23.11 节还列了四种方法在极端分位上的困难:1% VaR 配 1,000 个观测,只有大约 10 个点决定估计值;0.1% 需要 1,000 个观测才指望看到一次超越;日频数据下 1% VaR 一年本该被突破两三次,统计检验的功效极低。作者给的实践建议相当克制:样本量比方法精巧更重要,几个方法之间的分歧本身就是不确定性的度量,一个尾部估计不可靠的复杂方法,常常不如一个置信区间更宽但诚实的方法。
许可方面需要说清楚:这份笔记是 CC BY-NC-ND 4.0,允许署名转载原文,禁止商业使用,也禁止分发改编版本。所以整本翻译、改写、打包成付费附件都不合规,能做的只有给出官方入口和写导读。文末的论坛币区放了六个直达入口、31 章完整目录、三张结果表和许可条款原文。
────────────────
想看完整目录、三语对照的结果表、厚尾乘数表和获取入口的,回复后可见。
把经管之家装进你常用的 AI 智能体中 一键快捷安装经管之家 MCP/技能,让 AI 帮你查教程、找数据、读论坛帖子。 检索、阅读公开帖子不收费,安装可申请领取:3 通用积分+100 论坛币+3 元论坛资金 请点击查看安装教程与福利 → 说明: AI 算力按所用平台规则计算;附件按原帖条件获取;福利领取条件以活动页面为准。 |