关于 historical-risk
面向财富管理的历史风险分析技能,介绍市场与投资组合风险指标及其估算方法,并提供公式、示例和 Python 分析器。适用于评估已实现波动、亏损和基准偏离。
主要功能
- 01收盘价及 OHLC 波动率
- 02回撤与恢复分析
- 03历史 VaR 和下行风险指标
- 04跟踪误差与半方差
- 05Python 风险分析器与验证
适用场景
- 01衡量资产的已实现波动率
- 02回顾投资组合历史回撤
- 03根据收益数据估算损失尾部
- 04评估相对基准的偏离
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ joellewis/ finance_skills --skill historical-risk安装后在 Claude Code 中输入/historical-risk确认已加载。
附带文件scripts/historical_risk.py
详细介绍
历史风险分析
核心概念
收盘价到收盘价波动率
最简单、最常用的波动率估算方法。计算对数收益率的标准差并进行年化。
sigma_annual = sigma_daily * sqrt(N)
其中,N = 每年的交易周期数(通常每日为 252,按周为 52,按月为 12)。
推荐使用对数收益率:r_t = ln(P_t / P_{t-1})。
Parkinson(最高价-最低价)估算方法
使用日内最高价和最低价,捕捉收盘价到收盘价方法遗漏的日内波动率。在真实过程连续时,该方法比收盘价到收盘价方法更有效。
sigma^2_Park = (1 / (4 * n * ln(2))) * sum( ln(H_i / L_i)^2 )
对于扩散过程,该估算方法的效率大约是收盘价到收盘价方法的 5 倍;但存在跳跃或价格区间离散时,估算值会偏低。
Yang-Zhang 估算方法
结合隔夜(收盘价到开盘价)、开盘价到收盘价以及 Rogers-Satchell 三个组成部分。对于同时存在漂移和开盘跳跃的过程,该方法的估算结果无偏。
sigma^2_YZ = sigma^2_overnight + k * sigma^2_open-to-close + (1 - k) * sigma^2_RS
其中,k 的取值旨在使估算量的方差最小:
k = 0.34 / (1.34 + (n + 1) / (n - 1))
其中,n 为观测值数量,sigma^2_RS 为 Rogers-Satchell 估算量,它使用每个周期内全部四种 OHLC 价格。
回撤分析
时间 t 的回撤衡量从运行峰值开始的下跌幅度:
DD_t = (Peak_t - Value_t) / Peak_t
其中,Peak_t = 所有 s <= t 时 Value_s 的最大值。
- 最大回撤(MDD): 在评估期内,MDD = max(DD_t)。
- 回撤持续时间: 从达到峰值到创新高所经历的周期数。
- 恢复时间: 从谷底回到先前峰值水平所经历的周期数。
历史 VaR
非参数(经验)风险价值(Value-at-Risk)就是历史收益率分布的 alpha 百分位数,不作任何分布假设。
VaR_alpha = -Percentile(R, alpha)
例如,95% VaR 使用收益率的第 5 百分位数。负号是一种惯例,可将 VaR 表示为正的损失数值。
下行偏差
衡量低于最低可接受收益率(MAR)的收益率离散程度:
sigma_d = sqrt( (1/n) * sum( min(R_i - MAR, 0)^2 ) )
MAR 的常见取值:0%、无风险利率或平均收益率。
跟踪误差
投资组合收益率与基准收益率之差的标准差,并进行年化:
TE = std(R_p - R_b) * sqrt(N)
它衡量投资组合跟踪(或偏离)基准的稳定程度。
半方差
仅使用低于均值(或低于某一阈值)的收益率计算方差:
SV = (1/n) * sum( min(R_i - mean(R), 0)^2 )
半方差单独衡量下行风险,是 Sortino 比率的基础(参见 performance-metrics)。
关键公式
| 公式 | 表达式 | 用途 |
|---|---|---|
| 年化波动率 | sigma_ann = sigma_period * sqrt(N) | 将周期波动率转换为年化波动率 |
| 对数收益率 | r_t = ln(P_t / P_{t-1}) | 计算连续复利收益率 |
| Parkinson 方差 | sigma^2 = (1 / (4n ln2)) * sum(ln(H/L)^2) | 根据最高价-最低价数据计算波动率 |
| 回撤 | DD_t = (Peak_t - Value_t) / Peak_t | 衡量从峰值到谷底的下跌幅度 |
| 最大回撤 | MDD = max(DD_t) | 历史最大跌幅 |
| 历史 VaR(95%) | 收益率序列的第 5 百分位数 | 非参数损失估算 |
| 下行偏差 | sigma_d = sqrt((1/n) * sum(min(R_i - MAR, 0)^2)) | 衡量低于 MAR 的非对称风险 |
| 跟踪误差 | TE = std(R_p - R_b) * sqrt(N) | 投资组合相对于基准的偏离 |
| 半方差 | (1/n) * sum(min(R_i - mean(R), 0)^2) | 低于均值的方差 |
示例
示例 1:根据日收益率计算年化波动率
已知: 某股票的日对数收益率样本标准差为 1.2%。假设每年有 252 个交易日。
计算: 年化波动率。
解答:
sigma_annual = 0.012 * sqrt(252)
= 0.012 * 15.875
= 0.1905
~ 19.05%
该股票的年化波动率约为 19%。
示例 2:根据价格序列计算最大回撤
已知: 某基金的净值在 6 个月内依次为:$120、$135、$150、$130、$105、$125。
计算: 最大回撤,并找出峰值和谷值。
解答:
运行峰值:$120、$135、$150、$150、$150、$150。
各点的回撤:
- $120:(120-120)/120 = 0%
- $135:(135-135)/135 = 0%
- $150:(150-150)/150 = 0%
- $130:(150-130)/150 = 13.3%
- $105:(150-105)/150 = 30.0%
- $125:(150-125)/150 = 16.7%
最大回撤 = 30.0%,发生在从峰值 $150 到谷值 $105 的过程中。截至最后一次观测($125),回撤尚未完全恢复。
示例 3:历史 VaR
已知: 500 个按从低到高排序的日收益率。倒数第 25 个收益率为 -2.8%,倒数第 26 个为 -2.6%。
计算: 95% 的 1 日历史 VaR。
解答:
第 5 个百分位对应 500 个观测中的第 25 个(500 * 0.05 = 25)。
VaR_95% = -(-2.8%) = 2.8%
解读:根据历史分布,95% 的交易日亏损预计不会超过 2.8%。
常见陷阱
- 未正确年化波动率: 波动率按时间的平方根缩放(乘以 sqrt(N)),而非线性缩放。将日波动率乘以 252 而不是 sqrt(252),会导致数值严重偏高。
- 不一致地使用日历日和交易日: 对股票市场进行年化时,使用 252 个交易日(而不是 365 个日历日)。债券市场和部分国际市场可能有所不同。
- 历史数据中的幸存者偏差: 排除已退市或失败证券的数据集会低估已实现风险。
- 回溯期敏感性: 1 年回溯期捕捉到的风险状况与 5 年回溯期不同。务必说明回溯期,并考虑其是否涵盖相关市场状况。
- 混淆 VaR 置信水平的方向: 95% VaR 对应收益率的第 5 个百分位(损失尾部)。“95%”指置信水平,而非收益的百分位。
- 对数收益率与简单收益率: 估算波动率时,首选对数收益率,因为它们可跨时间相加。报告累计表现时,简单收益率更直观。
交叉引用
- performance-metrics(wealth-management 插件):使用波动率、下行偏差、跟踪误差和最大回撤,作为风险调整比率(Sharpe、Sortino、Information Ratio、Calmar)的分母。
- forward-risk(wealth-management 插件):历史 VaR 和历史波动率可作为前瞻性 VaR 模型和压力测试的输入。
- volatility-modeling(wealth-management 插件):EWMA 和 GARCH 模型将此处介绍的简单历史波动率估算方法扩展为预测框架。
- retirement-decumulation(wealth-management 插件):回撤和波动率历史会影响提款阶段投资组合的收益顺序风险。
运行脚本
使用 uv run scripts/historical_risk.py 运行(PEP 723 标头会自动解析 numpy),也可以先执行 pip install numpy scipy,再使用 python3 scripts/historical_risk.py 运行。直接运行会基于注入了回撤事件的带种子合成数据,输出完整的风险分析(年化波动率和 Parkinson 波动率、最大回撤及其发生时间、95%/99% 历史 VaR、下行偏差、半方差、跟踪误差、滚动波动率)。使用 --verify 可断言输出与本技能中的示例计算及演示的预期值一致(通过时退出代码为 0),使用 --help 可查看类的概览。此文件主要用于作为模块导入(例如,from historical_risk import HistoricalRiskAnalyzer)。