リスク管理と実戦ケース
オプションは高レバレッジ商品です——一晩で富裕になれる一方、一瞬でゼロになることもあります。リスク管理は取引戦略よりも重要です。
🔥 Vibe Prompt
「オプションリスク管理システムを構築:ケリー基準のポジションサイズ計算、シナリオ分析とストレステスト、グリークスヘッジ戦略、3つの実市場ケース(TSLA決算、VIXパニック、暴落ヘッジ)。」
リスク管理の原則
| 原則 | 説明 | |------|------| | 1%ルール | 1回の取引リスクは資金の1%以下 | | 最大レバレッジ | オプションレバレッジは5倍以下 | | 満期分散 | すべてのポジションが同時に満期になるのを避ける | | デルタヘッジ | ポートフォリオのデルタをニュートラルに維持 | | ストップロス | 各取引に最大損失を設定 |
ケリー基準 (Kelly Criterion)
最適なベットサイズを計算:
$$f^* = \frac{bp - q}{b}$$
def kelly_criterion(win_prob, win_loss_ratio):
b = win_loss_ratio
p = win_prob
q = 1 - p
f_star = (b * p - q) / b
half_kelly = f_star * 0.5
return {
'full_kelly': max(0, f_star),
'half_kelly': max(0, half_kelly),
}
# 例
result = kelly_criterion(0.6, 2.0)
print(f"完全ケリー: {result['full_kelly']:.1%}")
print(f"ハーフケリー: {result['half_kelly']:.1%}")
デルタヘッジ実戦
def delta_hedge(S, K, T, r, sigma, opt_type, quantity):
d1 = (math.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * math.sqrt(T))
delta = norm.cdf(d1) if opt_type == 'call' else norm.cdf(d1) - 1
option_delta = delta * quantity * 100
hedge_shares = -option_delta
action = '売却' if hedge_shares > 0 else '購入'
return {'delta': delta, 'hedge_shares': abs(int(hedge_shares)), 'action': action}
hedge = delta_hedge(100, 105, 0.5, 0.05, 0.2, 'call', 1)
print(f"推奨: {hedge['action']} {hedge['hedge_shares']}株")
実戦ケース
ケース1:TSLA決算
- 状況:決算前、IVが80%+に高騰
- 戦略:Iron Condorを売り、高いボラティリティプレミアムを獲得
- 結果:決算後IVが急落、Iron Condorが大勝利
- 教訓:高ボラティリティ環境では売り手が有利
ケース2:VIXパニック
- 状況:VIXが15から40へ急騰
- 戦略:VIX CallまたはVIX先物を購入
- 結果:パニック中にオプション価格が爆上がり
- 教訓:ブラックスワンでは買い手が有利
ケース3:暴落ヘッジ
- 状況:2020年3月COVID-19暴落
- 戦略:OTM Putをプロテクティブプットとして購入
- 結果:株の損失をPutの値上がりで相殺
- 教訓:オプションは最良の保険商品
まとめ
| リスク管理ツール | 用途 | |----------------|------| | ケリー基準 | 最適ポジションサイズ計算 | | シナリオ分析 | 異なる市場状況の損益評価 | | ストレステスト | 極端シナリオのリスク評価 | | デルタヘッジ | 方向性リスクの除去 | | ストップロス | 最大損失の制御 |
実践練習
💡 Vibe Coding 練習:AIに「オプションリスク管理ダッシュボード」を作成してもらいましょう:
- ケリー基準ポジションサイズ計算機
- マルチシナリオ損益シミュレーション
- デルタヘッジ推奨生成
- ポートフォリオGreeks概要
- VaR(リスク価値)計算
オプション価格の可視化
import matplotlib.pyplot as plt
import numpy as np
stock_prices = np.linspace(50, 150, 100)
prices = [black_scholes(S, 100, 0.5, 0.05, 0.2, 'call') for S in stock_prices]
plt.plot(stock_prices, prices)
plt.title('コールオプション価格 vs 株価')
plt.xlabel('株価')
plt.ylabel('オプション価格')
plt.grid(True, alpha=0.3)
plt.show()