mcpField
O
option-pricing

option-pricing

github.com/gauss314データ・データベース252271 回インストール19 週間前に更新
リポジトリ

option-pricing について

option-pricingは、オプション分析とバックテスト向けのPythonスキルおよびコマンドラインツールです。Pythonとnumpyで複数の価格モデルを実装し、インプライドボラティリティやグリークスも計算できます。

主な機能

  1. 01Black-Scholesやツリーモデルによる価格計算
  2. 02モンテカルロ法とLongstaff-Schwartz法の実行
  3. 03インプライドボラティリティとグリークスの計算
  4. 04イン・ザ・マネー確率の推定
  5. 05CLIで適用可能な手法を比較

活用シーン

  1. 01バックテスト用の欧州型・米国型オプション価格の算出
  2. 02市場価格からインプライドボラティリティを推定
  3. 03デルタヘッジ用のグリークスを計算
  4. 04選択した契約に対するモデル結果の比較

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/gauss314/skills --skill option-pricing

インストール後、Claude Code で/option-pricingを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
defaults.json
validation_cases.json
references/
REFERENCE.md
theory.md
scripts/
option_pricing.py

詳細

オプション価格 — ツーリングスキル

バックテストと分析のためのオプション価格計算です。5つの手法を 実装しており、すべてフラットな Python + numpy で構成されています(重い外部依存関係なし、 抽象化なし、クラスなし)。各関数は約100行以下で、 スカラー値を受け取ります。

目標パフォーマンス(このスキルで測定):

  • Black-Scholes:0.0012 ms/op(約800,000オプション/秒)
  • BAW(アメリカン・クローズドフォーム):0.0014 ms/op(約730,000オプション/秒)
  • Binomial N=500:3 ms/op — BSより2000倍遅いものの、精度は高いです

各手法の詳細な理論については、references/REFERENCE.mdを参照してください。


クイックスタート

# 1. Black-Scholes (europea)
py scripts/option_pricing.py bs --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20

# 2. Binomial CRR (europea o americana)
py scripts/option_pricing.py binomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --style american

# 3. Trinomial (europea o americana)
py scripts/option_pricing.py trinomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20

# 4. Monte Carlo (europea, antithetic variates)
py scripts/option_pricing.py mc --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --paths 200000

# 5. Longstaff-Schwartz (americana via MC)
py scripts/option_pricing.py lsm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 \
  --style american --paths 100000 --steps 50

# 6. Barone-Adesi-Whaley (americana closed-form)
py scripts/option_pricing.py bs2 --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --q 0.04 \
  --style american

# 7. Greeks analiticos (BS)
py scripts/option_pricing.py greeks --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20

# 8. Implied volatility
py scripts/option_pricing.py iv --S 100 --K 100 --T 0.25 --r 0.05 --price 4.62

# 9. P(ITM) y P(Profit) bajo medida risk-neutral Q
py scripts/option_pricing.py pitm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py pitm --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --premium 4.62

# 10. Superficie de precios across strikes
py scripts/option_pricing.py surface --S 100 --T 0.25 --r 0.05 --sigma 0.20 \
  --K-min 80 --K-max 120 --K-step 5

# 11. Heston 1993 (vol estocastica, sonrisa via Fourier)
py scripts/option_pricing.py heston --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 \
  --v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5

# 12. Bates 1996 (Heston + Merton jumps, captura crash risk)
py scripts/option_pricing.py bates --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 \
  --v0 0.04 --kappa 2.0 --theta 0.04 --sigma_v 0.3 --rho -0.5 \
  --lam 1.0 --mu_J -0.05 --sigma_J 0.10

# 13. Comparar todos los metodos aplicables
py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20

# Validar contra casos de assets/validation_cases.json
py scripts/option_pricing.py validate

# Benchmark de todos los metodos
py scripts/option_pricing.py bench --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20

スキルの構成

skills/option-pricing/
├── SKILL.md                              # Este archivo (guia rapida)
├── references/
│   └── REFERENCE.md                      # Teoria completa de los 5 metodos
├── assets/
│   ├── defaults.json                     # Parametros default para el CLI
│   └── validation_cases.json             # Casos de test (Hull Examples + extra)
└── scripts/
    └── option_pricing.py                 # CLI con 15 modos + validate + bench

CLI パラメーター(すべてのモード共通)

フラグデフォルト説明
--S100.0原資産のスポット価格
--K100.0行使価格
--T0.25年単位の満期までの期間(0.25 = 3か月)
--r0.05リスクフリーレート(連続複利、年率)
--q0.0連続配当利回り(年率)
--sigma0.20年率換算ボラティリティ
--typecallcall または put
--styleeuropeaneuropean または american
--steps500ツリーのステップ数 / LSM の時間ステップ数
--paths100000モンテカルロのパス数
--seed42再現性のためのシード
--antitheticTrue反対変量法を有効化(MC)
--jsonFalseテーブルではなく JSON で出力

デフォルト値はassets/defaults.jsonから読み込まれます(変更可能)。


9つの手法とベンチマーク(Python 3.14 + numpy 2.4.4 で測定)

ベンチマーク入力(ATM コール、すべての手法で同じ値): S=100, K=100, T=0.25, r=0.05, q=0, sigma=0.20。2000回(低速な手法では それ以下)実行して測定。Windows 11。推定値ではなく、スキルが公開する 関数をtime.perf_counter()で測定した値です。

手法時間計算量us/op(実測)ops/secスタイル典型的な誤差
Black-Scholes bsO(1)2.4 us419k/sEuropean0(クローズドフォーム)
P(ITM) pitmO(1)1.1 us908k/s両方0(クローズドフォーム N(d2))
Greeks (BS) greeksO(1)3.9 us257k/sEuropean0(クローズドフォーム)
BS2/BAW bs2O(1)3.6 us276k/sAmerican二項モデル N=2000 との比較で <1%
IV solve ivO(log(1/eps) * 1 option)82 us12k/s両方1e-7
Heston hestonO(N_GL) ~ O(1)398 us2.5k/sEuropean<0.1%
Binomial N=500 binomial --steps 500O(N^2)5.6 ms178/s両方~0.5%
Bates bates(15項)O(15 * N_GL)6.2 ms160/sEuropean<0.5%
MC paths=10k mc --paths 10000O(paths)1.3 ms788/sEuropean~1%(標準誤差)
Trinomial N=500 trinomial --steps 500O(N^2)9.4 ms107/s両方~0.3%
MC paths=100k mc --paths 100000O(paths)5.6 ms177/sEuropean~0.1%(標準誤差)
Binomial N=2000 binomial --steps 2000O(N^2)31 ms32/s両方~0.1%
LSM paths=10k lsmO(paths * steps)~150 ms~7/sAmerican~1-2%
この表の見方
  • us/op = オプションあたりのマイクロ秒数(小さいほど高速です)
  • ops/sec = バックテストで実行できる1秒あたりの操作数
  • 大規模なバックテスト(1回の実行で10k件超のオプション)には、bs、bs2、hestonを使用してください(すべて2.5k/s超)
  • 既知の値との検証には、binomial --steps 2000を使用してください(誤差0.1%)
  • ボラティリティスマイル/キャリブレーションには、hestonを使用してください(約400 us、O(1))
  • クラッシュを含むストレステストには、batesを使用してください(約6 ms、打ち切り系列でO(1))
  • アメリカンオプションの大量処理には、bs2を使用してください(3.6 us)。binomial(5.6 ms)やlsm(150 ms)は使用しないでください
計算量の概要
  • O(1)の閉形式:BS、BS2/BAW、Heston(フーリエ)、P(ITM)、Greeks、IV
  • O(N^2)のツリー:二項CRR、三項Boyle
  • O(paths):MC、MC antithetic
  • O(paths * steps):LSM、pathsを使用するMCS
  • O(15)の系列:Bates(Hestonの15項)

バックテストのルール:3つの閉形式(BS、BS2、Heston)は、合計で約300k ops/secで実行されます。100万件のオプションなら、約3秒で完了します。複数の権利行使価格/満期を含む、過去1〜2週間分のデータのバックテストには十分です。


5つの手法(レガシー)

業界標準です。アメリカンオプションには対応していません。

使用する場面:あらゆるヨーロピアンオプション。大規模なバックテスト(1日あたり100万件以上のオプション)。解析的Greeks(直接拡張)。

2. Cox-Ross-Rubinstein二項モデル(binomial)

離散ツリーです。ヨーロピアンオプションとアメリカンオプションの両方に対応し、早期行使もサポートします。 **O(N^2)**で、N=500の場合、1オプションあたり約3 msです。収束率はO(1/N)です。

使用する場面:精度が約0.5%(N=2000)または約0.1%(N=10000)のアメリカンオプション。Nを無限大に近づけてBS実装を検証する場合にも使用できます。

3. Boyle三項モデル(trinomial)

3つの分岐(上昇/中間/下降)を持つツリーです。二項モデルに似ていますが、数値条件がより良好です。同じNなら二項モデルより約1.5倍遅いものの、同じ精度を得るのに必要なステップ数は約30%少なくなります。

使用する場面:二項モデルで不自然な振動が発生する場合(満期が長い、ボラティリティが高いなど)。より安定して収束する代替手法です。

4. 反変量を用いたモンテカルロ(mc)

シミュレーションです。ヨーロピアンオプションのみ対応します。**O(paths)**で、paths=100kの場合、1オプションあたり約25 msです。 反変量により分散が約50〜70%減少します(有効サンプル数が2〜3倍になります)。

使用する場面:パス依存型オプション(アジアン、バリア、ルックバック)。このスキルではまだ実装されていませんが、フレームワークは拡張可能です。MCのノイズを含むBSの検証。カスタムペイオフのオプション。

5. Longstaff-Schwartz(lsm)

アメリカンオプション向けのモンテカルロです。Sの多項式を用いた最小二乗回帰で継続価値を推定します。**O(paths * steps)**で、paths=100k、steps=50の場合、1オプションあたり約50 msです。

使用する場面:BAWを適用できない複雑なペイオフのアメリカンオプション。複数資産のアメリカンオプション(バスケットオプション)。真の価格の下限を求められます。

ボーナス:Barone-Adesi-Whaley(bs2)

アメリカンオプション向けの近似閉形式です。**O(1)**で、1オプションあたり約1.4 usと、BSと同じくらい高速です。二項モデルN=2000と比較した誤差は1%未満です。q >= rの場合は、内部で二項モデルに切り替わります。

使用する場面:アメリカンオプションの大規模なバックテスト。オプションごとにO(1)が必要な場合の二項モデルの代替です。

ボーナス:インプライドボラティリティ(iv)

観測された市場価格からσ_implを求めます。二分法を使用し、1回の計算あたり約0.6 msです。ヨーロピアンオプションにはBSを、アメリカンオプションにはプライシングエンジンとして二項モデルN=500を使用します。

使用する場面:市場価格から、市場が織り込んでいるボラティリティを推定する場合。ボラティリティサーフェスや確率的ボラティリティモデルの入力に使用します。

ボーナス:P(ITM) と P(Profit)(pitm)

リスク中立測度 Q(現実世界の測度ではありません)での確率であり、 オプションが満期時に ITM となる確率を示します。N(d2)/N(-d2) による クローズドフォームで、約300 ns/op です。

  • P(ITM):コールでは N(d2)、プットでは N(-d2)
  • P(Profit):有効ストライク K +/- premium を用いた N(d2')

使用場面:バックテストで P(Profit) > X% の取引をフィルタリングする、 期待値を計算する、プレミアムは同じでも P(Profit) が異なる戦略を比較する、 Kelly criterion でポジションサイズを決める場合です。

注意:Q の下でのドリフトは実際のドリフトではなく r - q です。 現実世界の確率を求める場合は、期待ドリフトを r として渡してください (リスクフリーレートではありません)。


実践例

SPY を対象としたロングボラティリティ戦略のバックテスト
# Para cada dia historico:
# 1. Obtener IV actual (e.g. de yahoo-finance) y precio de mercado
# 2. Calcular precio teorico con IV_historica
# 3. Comparar contra precio de mercado

# Precio teorico con IV_historica
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.18
# -> 12.34

# Precio teorico con IV_actual (subestimada por el mercado)
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.22
# -> 15.67

# P&L esperado = (market - teorico) = 15.67 - 12.34 = +3.33 (long vol paga)
オプションチェーン全体の IV を計算する
# Para cada strike/expiry:
py scripts/option_pricing.py iv --S 580 --K 590 --T 0.08 --r 0.05 --price 8.50
# -> 0.2145 (la IV implicita de esa opcion)
デルタヘッジの Greeks
py scripts/option_pricing.py greeks --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.20 --json
# Devuelve {delta: 0.512, gamma: 0.018, vega: 0.85, theta: -0.12, rho: 0.31}
# Comprar 1000 opc + short 512 acciones = delta neutral
配当を支払う株式のアメリカンオプションの価格評価
# Opcion sobre indice con yield alto (e.g. SPX con div yield ~1.5%)
py scripts/option_pricing.py bs2 --S 5800 --K 5800 --T 0.25 --r 0.05 --q 0.015 \
  --sigma 0.18 --type call --style american
# -> ~123.45 (vs BS europea ~120.10, premium de early exercise = $3.35)
適用可能なすべての手法を比較する

all モードでは、選択した --style と互換性のあるすべての手法に加え、 ユーティリティ(P(ITM)、P(Profit)、Greeks)も実行します。

# Ejemplo 1: American put (Hull 21.1)
py scripts/option_pricing.py all --S 50 --K 50 --T 0.4167 --r 0.10 --sigma 0.40 \
  --type put --style american
# Output (9 rows: BS, Binomial, Trinomial, MC, LSM, BS2, P(ITM), P(Profit), Greeks):
# +---------------------------+------------------+-----------------------+
# | Method                    | Config           | Price / Value         |
# +---------------------------+------------------+-----------------------+
# | Black-Scholes             | closed-form O(1) | 4.076101              | (europea ref)
# | Binomial CRR              | N=500            | 4.283160              |
# | Trinomial                 | N=500            | 4.283429              |
# | Monte Carlo               | paths=100000     | 4.077892 +/- 0.0254   | (europea)
# | Longstaff-Schwartz        | paths=100000     | 4.258337              |
# | BS2/BAW (closed-form)     | O(1)             | 4.283766              |
# | P(ITM)                    | N(d2) bajo Q     | 0.4871                |
# | P(Profit) vs BS price     | premio=4.0761    | 0.3588                |
# | Greeks (delta/gamma/vega) | BS closed-form   | d=-0.3857 g=+0.0296   |
# +---------------------------+------------------+-----------------------+

# Ejemplo 2: European call (incluye Heston y Bates, NO incluye LSM/BS2)
py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
# Output (9 rows: BS, Binomial, Trinomial, MC, Heston, Bates, P(ITM), P(Profit), Greeks):
# +---------------------------+----------------------------------------+-----------------------+
# | Method                    | Config                                 | Price / Value         |
# +---------------------------+----------------------------------------+-----------------------+
# | Black-Scholes             | closed-form O(1)                       | 4.614997              |
# | Binomial CRR              | N=500                                  | 4.613001              |
# | Trinomial                 | N=500                                  | 4.613999              |
# | Monte Carlo               | paths=100000                           | 4.620907 +/- 0.0295   |
# | Heston 1993               | v0=s2, k=2, th=s2, sv=0.3, rho=-0.5    | 4.577095              |
# | Bates 1996                | Heston + lam=1, mu_J=-0.05, sig_J=0.10 | 4.924756              |
# | P(ITM)                    | N(d2) bajo Q                           | 0.5299                |
# | P(Profit) vs BS price     | premio=4.6150                          | 0.3534                |
# | Greeks (delta/gamma/vega) | BS closed-form                         | d=+0.5695 g=+0.0393   |
# +---------------------------+----------------------------------------+-----------------------+

all のルール:

  • --style american:LSM と BS2 を含みます(アメリカンオプションに対応する手法のみです)
  • --style european:Heston と Bates を含みます(ヨーロピアンオプション専用です)
  • どちらの場合も:BS、Binomial、Trinomial、MC、P(ITM)、P(Profit)、Greeks

all 経由で呼び出す場合の Heston/Bates のデフォルトパラメーター(典型的な 米国株向けにキャリブレーション済み):v0=sigma^2, kappa=2, theta=v0, sigma_v=0.3, rho=-0.5, lambda=1, mu_J=-0.05, sigma_J=0.10。カスタムパラメーターを使用する場合は、 heston/bates モードを直接使ってください。


未対応のユースケース

  • パス依存オプション(アジアン、バリア、ルックバック):このスキルが 実装しているのはヨーロピアンオプション向けの MC のみです。カスタムの ペイオフ関数でフレームワークを拡張してください。
  • マルチアセットのエキゾチックオプション(バスケット、レインボー、スプレッド):LSM は 簡単に拡張できます。ケースごとにドキュメントを作成してください。
  • 離散配当:モデルは連続的な配当利回り q を仮定しています。 離散配当(例:既知の日付での配当)には、同等の q を使うか、 モデルを調整してください。
  • 確率的ボラティリティ(Heston、SABR):未実装です。これらのモデルの バックテストには、別のライブラリ(QuantLib)が必要です。

大規模なバックテスト向けのパフォーマンスのヒント

  1. 可能な場合は常に BS または BAW を使う。Binomial より約2000倍高速です。
  2. 不要なメモリ割り当てを避ける:100万件のオプションをバッチ処理する場合、 関数はすでに1回の処理あたり O(1) です。純粋な Python では、これ以上の改善は あまり望めません。
  3. numpy.random.Generator を再利用する:1つだけ作成し、seed を MC/LSM に渡してください。CLI のデフォルトではすでに default_rng を使います。
  4. 入力をベクトル化する:このスキルの関数はスカラーを受け付けます。配列を ベクトル化するには、np.vectorize(bs_price) を使うか、手動でマッピングしてください。 numba ライブラリを JIT コンパイルすれば、さらに10~50倍高速化できる場合があります。
  5. 共通の値を事前計算する:S のみが変わるバッチでは、T, r, q, sigma, K を 事前計算し、ループ内で S だけを変えてください。

検証

validate モードは assets/validation_cases.json の10ケース (ヨーロピアン5件、アメリカン4件、プット・コール・パリティ1件)を実行し、 合格/不合格を報告します。

py scripts/option_pricing.py validate
# === Black-Scholes European ===
#   [OK] Hull 9th ed Example 15.6 (ATM call): got 4.7594, ref 4.7594
#   [OK] ... (5/5 pass)
# === American (Binomial N=2000) ===
#   [OK] Hull 9th ed Example 21.1: got 4.2841, ref 4.2841
#   [OK] ... (4/4 pass)
# === Put-Call Parity (BS) ===
#   [OK] C - P = 4.8770575499, S*exp(-qT) - K*exp(-rT) = 4.8770575499
# 0 failure(s)

カスタムケースを追加するには、assets/validation_cases.json を編集してください。


ライブラリとしての API(CLI 以外でも利用可能)

関数は Python から直接インポートできます。

from scripts.option_pricing import bs_price, binomial_price, mc_european_price, lsm_price, bs2_american_price, bs_greeks, implied_vol

# Pricing
c = bs_price(100, 100, 0.25, 0.05, 0.0, 0.20, "call")     # 4.615
p = binomial_price(100, 100, 0.25, 0.05, 0.0, 0.20, 500, "put", "european")

# Greeks (solo BS)
g = bs_greeks(100, 100, 0.25, 0.05, 0.0, 0.20, "call")
# -> {"delta": 0.569, "gamma": 0.039, "vega": 19.64, "theta": -10.47, "rho": 13.08}

# Implied vol
iv = implied_vol(4.62, 100, 100, 0.25, 0.05, 0.0, "call", "european")
# -> 0.2003

すべての関数はフラット形式(クラスなし)で、スカラーを受け取り、 float を返します。ベクトルには np.vectorize または内包表記を使ってください。


ライセンス

MIT

コメント