mcpField
O
option-pricing

option-pricing

github.com/gauss314Data & databases252271 installsUpdated 19w ago
Repository

About option-pricing

option-pricing is a Python skill and CLI for pricing options in analysis and backtesting. It provides several pricing models and utilities, including implied volatility and Greeks, using flat Python and numpy.

Key features

  1. 01Price options with Black-Scholes and tree models
  2. 02Run Monte Carlo and Longstaff-Schwartz methods
  3. 03Calculate implied volatility and Greeks
  4. 04Estimate in-the-money probabilities
  5. 05Compare applicable methods with the CLI

Use cases

  1. 01Price European or American options for backtests
  2. 02Infer implied volatility from a market price
  3. 03Calculate Greeks for delta hedging
  4. 04Compare model outputs for a selected contract

Install

Copy the command and run it in a terminal.

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

After installing, type/option-pricingin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

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

Details

From the project README

Option Pricing — Skill de Tooling

Pricing de opciones para backtesting y analisis. 5 metodos implementados, todos en flat Python + numpy (sin dependencias externas pesadas, sin abstracciones, sin clases). Cada funcion es ~100 lineas o menos y acepta escalares.

Performance objetivo (medida en este skill):

  • Black-Scholes: 0.0012 ms/op (~800.000 opciones/seg)
  • BAW (American closed-form): 0.0014 ms/op (~730.000 opciones/seg)
  • Binomial N=500: 3 ms/op — 2000x mas lento que BS, pero preciso

Para la teoria detallada de cada metodo, ver references/REFERENCE.md.


Quick start

# 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

Estructura del skill

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

Parametros del CLI (comunes a todos los modos)

FlagDefaultDescripcion
--S100.0Spot price del subyacente
--K100.0Strike
--T0.25Tiempo a maturity en anos (0.25 = 3 meses)
--r0.05Tasa libre de riesgo (continua anual)
--q0.0Dividend yield continuo anual
--sigma0.20Volatilidad anualizada
--typecallcall o put
--styleeuropeaneuropean o american
--steps500Pasos del tree / pasos temporales de LSM
--paths100000Paths de Monte Carlo
--seed42Seed para reproducibilidad
--antitheticTrueActivar variates antitetic (MC)
--jsonFalseOutput en JSON en vez de tabla

Defaults se cargan de assets/defaults.json (modificables).


Los 9 metodos + benchmarks (medidos en Python 3.14 + numpy 2.4.4)

Inputs del benchmark (ATM call, mismos valores para todos los metodos): S=100, K=100, T=0.25, r=0.05, q=0, sigma=0.20. Medido con 2000 reps (o menos para metodos lentos), Windows 11. No asumido — medido con time.perf_counter() sobre la funcion expuesta por el skill.

MetodoTime complexityus/op (medido)ops/secEstiloError tipico
Black-Scholes bsO(1)2.4 us419k/sEuropean0 (closed)
P(ITM) pitmO(1)1.1 us908k/sAmbos0 (closed N(d2))
Greeks (BS) greeksO(1)3.9 us257k/sEuropean0 (closed)
BS2/BAW bs2O(1)3.6 us276k/sAmerican<1% vs binomial N=2000
IV solve ivO(log(1/eps) * 1 opcion)82 us12k/sAmbos1e-7
Heston hestonO(N_GL) ~ O(1)398 us2.5k/sEuropean<0.1%
Binomial N=500 binomial --steps 500O(N^2)5.6 ms178/sAmbos~0.5%
Bates bates (15 term)O(15 * N_GL)6.2 ms160/sEuropean<0.5%
MC paths=10k mc --paths 10000O(paths)1.3 ms788/sEuropean~1% (stderr)
Trinomial N=500 trinomial --steps 500O(N^2)9.4 ms107/sAmbos~0.3%
MC paths=100k mc --paths 100000O(paths)5.6 ms177/sEuropean~0.1% (stderr)
Binomial N=2000 binomial --steps 2000O(N^2)31 ms32/sAmbos~0.1%
LSM paths=10k lsmO(paths * steps)~150 ms~7/sAmerican~1-2%
Como leer esta tabla
  • us/op = microsegundos por opcion (mas bajo = mas rapido)
  • ops/sec = operaciones por segundo que se pueden hacer en backtesting
  • Para backtesting masivo (>10k opciones por ejecucion): usar bs, bs2, heston (todos >2.5k/s)
  • Para validacion contra un valor conocido: binomial --steps 2000 (0.1% error)
  • Para sonrisa/calibracion: heston (~400 us, O(1))
  • Para stress testing con crashes: bates (~6 ms, O(1) con serie truncada)
  • Para Americanas en masa: bs2 (3.6 us) — NO binomial (5.6 ms) ni lsm (150 ms)
Resumen de time complexity
  • O(1) closed-form: BS, BS2/BAW, Heston (Fourier), P(ITM), Greeks, IV
  • O(N^2) tree: Binomial CRR, Trinomial Boyle
  • O(paths): MC, MC antithetic
  • O(paths * steps): LSM, MCS con paths
  • O(15) serie: Bates (15 terminos Heston)

Regla para backtesting: las 3 closed-form (BS, BS2, Heston) corren ~300k ops/sec combinadas. Para 1M opciones se tarda ~3 seg. Suficiente para backtests de 1-2 semanas de data historica con multiples strikes/expiries.


Los 5 metodos (legacy)

industria. No funciona para americanas.

Cuando usar: cualquier opcion europea. Backtesting de masa (1M+ opciones/dia). Greeks analiticos (extension directa).

2. Binomial Cox-Ross-Rubinstein (binomial)

Arbol discreto. Soporta europeas Y americanas con ejercicio temprano. O(N^2), ~3 ms/op con N=500. Convergencia O(1/N).

Cuando usar: opciones americanas con precision ~0.5% (N=2000) o ~0.1% (N=10000). Tambien para validar la implementacion de BS convergiendo N->inf.

3. Trinomial Boyle (trinomial)

Arbol con 3 branches (up/middle/down). Similar al binomial pero mejor condicionamiento numerico. ~1.5x mas lento que binomial para mismo N, pero necesita ~30% menos pasos para misma precision.

Cuando usar: cuando binomial da oscilaciones raras (T largo, sigma alto). Alternativa con convergencia mas estable.

4. Monte Carlo con antithetic variates (mc)

Simulacion. Solo europeas. O(paths), ~25 ms/op con paths=100k. Antithetic variates reduce varianza ~50-70% (factor 2-3x en samples efectivos).

Cuando usar: opciones path-dependent (asianas, barrier, lookback) — el skill no las implementa aun pero el framework es extensible. Validacion de BS con ruido MC. Opciones con payoffs custom.

5. Longstaff-Schwartz (lsm)

Monte Carlo para americanas. Regresion least-squares sobre polinomios de S para estimar continuation value. O(paths * steps), ~50 ms/op con paths=100k, steps=50.

Cuando usar: opciones americanas con payoffs complejos donde BAW no aplica. Multi-asset american (basket options). Da lower bound del precio verdadero.

Bonus: Barone-Adesi-Whaley (bs2)

Closed-form aproximada para americanas. O(1), ~1.4 us/op — tan rapido como BS. Error <1% vs binomial N=2000. Para q >= r cae a binomial internamente.

Cuando usar: backtesting de opciones americanas en masa. Reemplazo de binomial cuando se necesita O(1) por opcion.

Bonus: Implied Volatility (iv)

Resuelve sigma_impl dado un precio de mercado observado. Bisection, ~0.6 ms por solve. Para europeas usa BS; para americanas usa binomial N=500 como pricing engine.

Cuando usar: cuando tenes precios de mercado y queres inferir la volatilidad que el mercado esta priceando. Input para superficies de vol y modelos de vol estocastica.

Bonus: P(ITM) y P(Profit) (pitm)

Probabilidad bajo la medida risk-neutral Q (no real-world) de que la opcion termine ITM al vencimiento. Closed-form via N(d2) / N(-d2), ~300 ns/op.

  • P(ITM): N(d2) para call, N(-d2) para put
  • P(Profit): N(d2') con strike efectivo K +/- premium

Cuando usar: filtrar trades con P(Profit) > X% en backtesting, calcular expected value, comparar estrategias con misma prima pero distinta P(Profit), sizing con Kelly criterion.

CUIDADO: la drift bajo Q es r - q, no la real. Para probabilidad real-world, pasar la drift esperada como r (no la risk-free).


Ejemplos practicos

Backtesting de estrategia long-volatility sobre 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)
Computar IV sobre toda la cadena de opciones
# 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 para delta-hedging
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
Pricing de opcion americana sobre dividendo payer
# 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)
Comparar todos los metodos aplicables

El modo all ejecuta todos los metodos compatibles con el --style elegido, mas las utilidades (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   |
# +---------------------------+----------------------------------------+-----------------------+

Reglas del all:

  • --style american: incluye LSM y BS2 (los unicos metodos para americanas)
  • --style european: incluye Heston y Bates (son european-only)
  • Ambos: BS, Binomial, Trinomial, MC, P(ITM), P(Profit), Greeks

Parametros default de Heston/Bates cuando se invoca via all (calibrados a equity US tipico): v0=sigma^2, kappa=2, theta=v0, sigma_v=0.3, rho=-0.5, lambda=1, mu_J=-0.05, sigma_J=0.10. Para parametros custom, usar los modos heston / bates directamente.


Casos de uso NO soportados

  • Opciones path-dependent (asianas, barrier, lookback): el skill solo implementa MC para europeas. Extender el framework con funciones de payoff custom.
  • Opciones exoticas multi-asset (basket, rainbow, spread): el LSM puede extenderse facilmente. Documentar caso por caso.
  • Dividendos discretos: el modelo asume dividend yield continuo q. Para dividendos discretos (e.g. fechas conocidas) usar q equivalente o ajustar el modelo.
  • Stochastic volatility (Heston, SABR): no implementado. Para backtesting de estos modelos se necesita otra libreria (QuantLib).

Performance tips para backtesting masivo

  1. Usar BS o BAW siempre que sea posible. Son ~2000x mas rapidos que binomial.
  2. Evitar allocs innecesarias: para un batch de 1M opciones, las funciones ya son O(1)/op. No se puede mejorar mucho mas en Python puro.
  3. Reusar numpy.random.Generator: crear uno solo y pasar la seed a MC/LSM. El default de la CLI ya usa default_rng.
  4. Vectorizar inputs: las funciones del skill aceptan escalares. Para vectorizar sobre un array, usar np.vectorize(bs_price) o mapear manualmente. La libreria numba puede dar 10-50x speedup adicional si se compila JIT.
  5. Precomputar factores comunes: para un batch donde solo cambia S, precomputar T, r, q, sigma, K y solo variar S en el loop.

Validacion

El modo validate corre 10 casos de assets/validation_cases.json (5 europeos, 4 americanos, 1 put-call parity) y reporta pass/fail:

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)

Para agregar casos custom, editar assets/validation_cases.json.


API como libreria (no solo CLI)

Las funciones se pueden importar directamente en 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

Todas las funciones son flat (sin clases), aceptan escalares y devuelven floats. Para vectores, usar np.vectorize o comprehensions.


Licencia

MIT

Comments

Markdown supported