mcpField
H
historical-risk

historical-risk

github.com/joellewis数据与数据库218730 次安装15 周前更新
代码仓库

关于 historical-risk

面向财富管理的历史风险分析技能,介绍市场与投资组合风险指标及其估算方法,并提供公式、示例和 Python 分析器。适用于评估已实现波动、亏损和基准偏离。

主要功能

  1. 01收盘价及 OHLC 波动率
  2. 02回撤与恢复分析
  3. 03历史 VaR 和下行风险指标
  4. 04跟踪误差与半方差
  5. 05Python 风险分析器与验证

适用场景

  1. 01衡量资产的已实现波动率
  2. 02回顾投资组合历史回撤
  3. 03根据收益数据估算损失尾部
  4. 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)。

评论

支持 Markdown