用途
historical-risk 用于从历史数据量化已实现风险,涵盖波动率估计、回撤分析、下行风险指标、历史在险价值(VaR)、跟踪误差等。当用户询问历史风险、已实现波动率、最大回撤或历史 VaR 时可使用本技能。
主要能力
波动率估计
收盘价对收盘价波动率(Close-to-Close Volatility):最常用的波动率估计方法,计算对数收益率的标准差并年化。
公式: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 = 0.34 / (1.34 + (n + 1) / (n - 1)),n 为观测数,sigma^2_RS 为 Rogers-Satchell 估计量,使用每个周期内全部四个 OHLC 价格。
回撤分析
回撤衡量相对历史峰值的跌幅:DD_t = (Peak_t - Value_t) / Peak_t,其中 Peak_t = max(Value_s) 对所有 s <= t。
- 最大回撤(MDD):评估期内 DD_t 的最大值。
- 回撤持续期:从峰值到创新高之间的期数。
- 恢复时间:从谷底回到前峰值水平的期数。
历史 VaR
非参数(经验)在险价值即历史收益率分布的 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 比率的基础。
关键公式
| 公式 | 表达式 | 用途 |
|---|---|---|
| 年化波动率 | 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) | 低于均值的方差 |
使用方式
使用 uv 运行: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。
适用场景
- 股票或基金的历史波动率计算与年化
- 基金净值序列的最大回撤、回撤持续期和恢复时间分析
- 基于历史收益率分布的非参数 VaR 估计
- 组合相对基准的跟踪误差衡量
- 下行风险指标(下行偏差、半方差)的计算
限制
- 波动率年化使用平方根时间缩放(乘以 sqrt(N)),而非线性缩放。错误使用线性缩放会导致数值严重虚高。
- 年化时应使用 252 个交易日(而非 365 个日历日)。债券市场和部分国际市场可能不同。
- 历史数据中的幸存者偏差:排除退市或失败证券的数据集会低估已实现风险。
- 回看期敏感性:1 年回看期与 5 年回看期反映不同的风险状态,应始终说明回看窗口并考虑其是否涵盖相关市场条件。
- VaR 置信水平方向:95% VaR 对应收益率的第 5 百分位(损失尾部),"95%" 指置信水平而非收益百分位。
- 对数收益率与简单收益率:波动率估计推荐对数收益率(跨时间可加),累计业绩报告则简单收益率更直观。
交叉引用
- performance-metrics(财富管理插件):使用波动率、下行偏差、跟踪误差和最大回撤作为风险调整比率(Sharpe、Sortino、Information Ratio、Calmar)的分母。
- forward-risk(财富管理插件):历史 VaR 和历史波动率作为前瞻性 VaR 模型和压力测试的输入。
- volatility-modeling(财富管理插件):EWMA 和 GARCH 模型将此处介绍的简单历史波动率估计量扩展为预测框架。
- retirement-decumulation(财富管理插件):回撤和波动率历史驱动提取阶段组合的收益序列风险。