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})。
パーキンソン(高値・安値)推定量
日中の高値と安値を用いて、終値間の計算では捉えられない日中ボラティリティを捉えます。真のプロセスが連続的な場合、終値間の推定より効率的です。
sigma^2_Park = (1 / (4 * n * ln(2))) * sum( ln(H_i / L_i)^2 )
この推定量は、拡散過程では終値間の推定よりおよそ5倍効率的ですが、ジャンプがある場合や値幅が離散化されている場合は下方バイアスが生じます。
ヤン・チャン推定量
オーバーナイト(終値から始値)、始値から終値、およびロジャース・サッチェルの各成分を組み合わせます。ドリフトと寄り付き時のジャンプの両方があるプロセスに対して不偏です。
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 は各期間の4つすべてのOHLC価格を使用するロジャース・サッチェル推定量です。
ドローダウン分析
時点 t のドローダウンは、そこまでの最高値からの下落を測定します。
DD_t = (Peak_t - Value_t) / Peak_t
ここで、Peak_t = s <= t であるすべての s に対する max(Value_s) です。
- 最大ドローダウン(MDD): 評価期間における MDD = max(DD_t) です。
- ドローダウン期間: 最高値から新たな最高値に達するまでの期間数です。
- 回復時間: 底値から以前の最高値の水準に戻るまでの期間数です。
過去データに基づくVaR
ノンパラメトリック(経験的)なバリュー・アット・リスクは、過去のリターン分布のアルファ百分位点です。分布に関する仮定はありません。
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 )
セミバリアンスは下方リスクを切り分けて測定し、ソルティノレシオの基礎となります(performance-metricsを参照)。
主な数式
| 数式 | 表現 | 用途 |
|---|---|---|
| 年率ボラティリティ | sigma_ann = sigma_period * sqrt(N) | 期間ボラティリティを年率ボラティリティに換算 |
| 対数リターン | r_t = ln(P_t / P_{t-1}) | 連続複利リターンを計算 |
| パーキンソン分散 | 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:価格系列からの最大ドローダウン
前提: あるファンドのNAVは、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)を乗じます)。線形ではありません。日次ボラティリティにsqrt(252)ではなく252を乗じると、数値が大幅に過大になります。
- 暦日と取引日の不統一: 株式市場の年率換算には、365暦日ではなく252取引日を使用してください。債券市場や一部の海外市場では異なる場合があります。
- 過去データのサバイバーシップバイアス: 上場廃止銘柄や破綻証券を除外したデータセットでは、実現リスクが過小評価されます。
- ルックバック期間への感応度: 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を指定すると、出力がこのスキルの計算例およびデモの想定値と一致することを検証します(PASSの場合は終了コード0)。クラスの概要を表示するには--helpを指定してください。このファイルは主にモジュールとしてインポートすることを想定しています(例:from historical_risk import HistoricalRiskAnalyzer)。