option-pricing

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Option Pricing — Skill de Tooling

期权定价 — 工具类Skill

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
.

用于回测与分析的期权定价工具。已实现5种方法,全部采用扁平化Python+numpy编写(无重型外部依赖、无抽象层、无类结构)。每个函数约100行或更少,支持标量输入。
目标性能(本工具实测数据):
  • Black-Scholes:0.0012毫秒/单期权(约800,000单/秒)
  • BAW(美式闭式解):0.0014毫秒/单期权(约730,000单/秒)
  • Binomial(N=500):3毫秒/单期权 — 比BS慢2000倍,但精度更高
如需了解各方法的详细理论,可查看
references/REFERENCE.md

Quick start

快速开始

bash
undefined
bash
undefined

1. Black-Scholes (europea)

1. Black-Scholes(欧式期权)

py scripts/option_pricing.py bs --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
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)

2. Binomial CRR(欧式或美式期权)

py scripts/option_pricing.py binomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --style american
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)

3. Trinomial(欧式或美式期权)

py scripts/option_pricing.py trinomial --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
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)

4. Monte Carlo(欧式期权,对偶变量)

py scripts/option_pricing.py mc --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --paths 200000
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)

5. Longstaff-Schwartz(基于蒙特卡洛的美式期权定价)

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
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)

6. Barone-Adesi-Whaley(美式闭式解)

py scripts/option_pricing.py bs2 --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20 --q 0.04
--style american
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)

7. 解析希腊字母(基于BS模型)

py scripts/option_pricing.py greeks --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
py scripts/option_pricing.py greeks --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20

8. Implied volatility

8. 隐含波动率

py scripts/option_pricing.py iv --S 100 --K 100 --T 0.25 --r 0.05 --price 4.62
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

9. 风险中性测度Q下的实值概率(P(ITM))与盈利概率(P(Profit))

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
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

10. 不同行权价的价格曲面

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
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)

11. Heston 1993(随机波动率,通过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
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)

12. Bates 1996(Heston+Merton跳跃模型,捕捉崩盘风险)

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
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

13. 对比所有适用方法

py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
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

验证资产/validation_cases.json中的测试用例

py scripts/option_pricing.py validate
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

---
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

skills/option-pricing/
├── SKILL.md                              # 本文件(快速指南)
├── references/
│   └── REFERENCE.md                      # 5种方法的完整理论文档
├── assets/
│   ├── defaults.json                     # CLI默认参数
│   └── validation_cases.json             # 测试用例(含Hull示例及额外用例)
└── scripts/
    └── option_pricing.py                 # 包含15种模式+验证+基准测试的CLI

Parametros del CLI (comunes a todos los modos)

CLI通用参数(所有模式适用)

FlagDefaultDescripcion
--S
100.0Spot price del subyacente
--K
100.0Strike
--T
0.25Tiempo a maturity en anos (0.25 = 3 meses)
--r
0.05Tasa libre de riesgo (continua anual)
--q
0.0Dividend yield continuo anual
--sigma
0.20Volatilidad anualizada
--type
callcall o put
--style
europeaneuropean o american
--steps
500Pasos del tree / pasos temporales de LSM
--paths
100000Paths de Monte Carlo
--seed
42Seed para reproducibilidad
--antithetic
TrueActivar variates antitetic (MC)
--json
FalseOutput en JSON en vez de tabla
Defaults se cargan de
assets/defaults.json
(modificables).

标记默认值描述
--S
100.0标的资产现货价格
--K
100.0行权价
--T
0.25到期时间(年,0.25即3个月)
--r
0.05连续年化无风险利率
--q
0.0连续年化股息率
--sigma
0.20年化波动率
--type
callcall(看涨期权)或put(看跌期权)
--style
europeaneuropean(欧式)或american(美式)
--steps
500树模型步数 / LSM时间步数
--paths
100000蒙特卡洛模拟路径数
--seed
42随机种子(保证可复现)
--antithetic
True启用对偶变量(蒙特卡洛)
--json
False输出格式为JSON而非表格
默认参数加载自
assets/defaults.json
(可修改)。

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

9种方法+基准测试(基于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
bs
O(1)2.4 us419k/sEuropean0 (closed)
P(ITM)
pitm
O(1)1.1 us908k/sAmbos0 (closed N(d2))
Greeks (BS)
greeks
O(1)3.9 us257k/sEuropean0 (closed)
BS2/BAW
bs2
O(1)3.6 us276k/sAmerican<1% vs binomial N=2000
IV solve
iv
O(log(1/eps) * 1 opcion)82 us12k/sAmbos1e-7
Heston
heston
O(N_GL) ~ O(1)398 us2.5k/sEuropean<0.1%
Binomial N=500
binomial --steps 500
O(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 10000
O(paths)1.3 ms788/sEuropean~1% (stderr)
Trinomial N=500
trinomial --steps 500
O(N^2)9.4 ms107/sAmbos~0.3%
MC paths=100k
mc --paths 100000
O(paths)5.6 ms177/sEuropean~0.1% (stderr)
Binomial N=2000
binomial --steps 2000
O(N^2)31 ms32/sAmbos~0.1%
LSM paths=10k
lsm
O(paths * steps)~150 ms~7/sAmerican~1-2%
基准测试输入(平值看涨期权,所有方法参数一致):
S=100, K=100, T=0.25, r=0.05, q=0, sigma=0.20
。测试重复2000次(慢方法次数更少),环境为Windows 11。数据为实测值 — 通过
time.perf_counter()
统计工具暴露的函数耗时。
方法时间复杂度微秒/单期权(实测)单/秒类型典型误差
Black-Scholes
bs
O(1)2.4419k/s欧式0(闭式解)
P(ITM)
pitm
O(1)1.1908k/s两者均支持0(基于N(d2)闭式解)
Greeks (BS)
greeks
O(1)3.9257k/s欧式0(闭式解)
BS2/BAW
bs2
O(1)3.6276k/s美式与Binomial N=2000相比误差<1%
IV solve
iv
O(log(1/eps) * 1单期权)8212k/s两者均支持1e-7
Heston
heston
O(N_GL) ~ O(1)3982.5k/s欧式<0.1%
Binomial N=500
binomial --steps 500
O(N^2)5600178/s两者均支持~0.5%
Bates
bates
(15项)
O(15 * N_GL)6200160/s欧式<0.5%
MC paths=10k
mc --paths 10000
O(paths)1300788/s欧式~1%(标准误)
Trinomial N=500
trinomial --steps 500
O(N^2)9400107/s两者均支持~0.3%
MC paths=100k
mc --paths 100000
O(paths)5600177/s欧式~0.1%(标准误)
Binomial N=2000
binomial --steps 2000
O(N^2)3100032/s两者均支持~0.1%
LSM paths=10k
lsm
O(paths * steps)~150000~7/s美式~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)
  • us/op = 微秒/单期权(数值越小速度越快)
  • ops/sec = 每秒处理单期权数(回测时的处理能力)
  • 对于大规模回测(单次执行>10k单期权):使用
    bs
    bs2
    heston
    (均>2.5k单/秒)
  • 用于验证已知值:使用
    binomial --steps 2000
    (误差0.1%)
  • 用于波动率微笑/校准:使用
    heston
    (约400微秒,O(1))
  • 用于崩盘压力测试:使用
    bates
    (约6毫秒,截断级数下O(1))
  • 用于批量美式期权:使用
    bs2
    (3.6微秒)— 不要使用
    binomial
    (5.6毫秒)或
    lsm
    (150毫秒)

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.

  • O(1)闭式解:BS、BS2/BAW、Heston(Fourier)、P(ITM)、Greeks、IV
  • O(N^2)树模型:Binomial CRR、Trinomial Boyle
  • O(paths):MC、MC对偶变量
  • O(paths * steps):LSM、带路径的MCS
  • O(15)级数:Bates(15项Heston级数)
回测规则:3种闭式解方法(BS、BS2、Heston)合计约300k单/秒。处理1M单期权约需3秒,足以支撑1-2周历史数据、多行权价/到期日的回测需求。

Los 5 metodos (legacy)

5种经典方法(旧版)

1. Black-Scholes (
bs
)

industria. No funciona para americanas.
Cuando usar: cualquier opcion europea. Backtesting de masa (1M+ opciones/dia). Greeks analiticos (extension directa).
业界标准闭式解,仅支持欧式期权。
适用场景:任何欧式期权。大规模回测(每日1M+单期权)。解析希腊字母(直接扩展)。

2. Binomial Cox-Ross-Rubinstein (
binomial
)

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.
离散树模型,支持欧式与美式期权的提前行权。时间复杂度O(N^2),N=500时约3毫秒/单期权。收敛速度O(1/N)。
适用场景:需要0.5%精度(N=2000)或0.1%精度(N=10000)的美式期权。也可通过N→∞验证BS实现的正确性。

3. Trinomial Boyle (
trinomial
)

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.
包含3个分支(上涨/持平/下跌)的树模型。与Binomial类似,但数值稳定性更好。相同N下比Binomial慢约1.5倍,但达到相同精度所需步数少约30%。
适用场景:当Binomial出现异常波动(到期时间长、波动率高)时。收敛更稳定的替代方案。

4. Monte Carlo con antithetic variates (
mc
)

4. 带对偶变量的蒙特卡洛 (
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.
模拟方法,仅支持欧式期权。时间复杂度O(paths),paths=100k时约25毫秒/单期权。对偶变量可降低方差约50-70%(有效样本量提升2-3倍)。
适用场景:路径依赖型期权(亚式、障碍、回望)— 本工具暂未实现,但框架可扩展。用MC噪声验证BS。自定义收益结构的期权。

5. Longstaff-Schwartz (
lsm
)

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.
针对美式期权的蒙特卡洛方法。基于S的多项式进行最小二乘回归,估算续期价值。时间复杂度O(paths * steps),paths=100k、steps=50时约50毫秒/单期权。
适用场景:BAW不适用的复杂收益结构美式期权。多资产美式期权(一篮子期权)。提供真实价格的下界

Bonus: Barone-Adesi-Whaley (
bs2
)

附加功能: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.
美式期权的近似闭式解。时间复杂度O(1),约1.4微秒/单期权 — 与BS速度相当。与Binomial N=2000相比误差<1%。当
q >= r
时自动切换为Binomial模型。
适用场景:批量美式期权回测。当需要O(1)单期权耗时时代替Binomial。

Bonus: Implied Volatility (
iv
)

附加功能:隐含波动率 (
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.
根据观察到的市场价格求解隐含波动率
sigma_impl
。采用二分法,每次求解约0.6毫秒。欧式期权使用BS模型;美式期权使用N=500的Binomial作为定价引擎。
适用场景:拥有市场价格时,推断市场定价的波动率。作为波动率曲面与随机波动率模型的输入。

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

附加功能:实值概率(P(ITM))与盈利概率(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).

风险中性测度Q(非真实世界)下,期权到期时处于实值状态的概率。通过
N(d2)
/
N(-d2)
闭式解计算,约300纳秒/单期权。
  • P(ITM):看涨期权为
    N(d2)
    ,看跌期权为
    N(-d2)
  • P(Profit):有效行权价为
    K +/- 权利金
    时的
    N(d2')
适用场景:回测中筛选
P(Profit) > X%
的交易,计算期望值,比较权利金相同但P(Profit)不同的策略,使用Kelly准则调整仓位。
注意:测度Q下的漂移为
r - q
,而非真实世界漂移。如需真实世界概率,将预期漂移作为
r
传入(而非无风险利率)。

Ejemplos practicos

实用示例

Backtesting de estrategia long-volatility sobre SPY

SPY波动率多头策略回测

bash
undefined
bash
undefined

Para cada dia historico:

针对每个历史交易日:

1. Obtener IV actual (e.g. de yahoo-finance) y precio de mercado

1. 获取当前隐含波动率(例如从yahoo-finance)与市场价格

2. Calcular precio teorico con IV_historica

2. 使用历史隐含波动率计算理论价格

3. Comparar contra precio de mercado

3. 与市场价格对比

Precio teorico con IV_historica

基于历史隐含波动率的理论价格

py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.18
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.18

-> 12.34

-> 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
py scripts/option_pricing.py bs --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.22

-> 15.67

-> 15.67

P&L esperado = (market - teorico) = 15.67 - 12.34 = +3.33 (long vol paga)

预期盈亏 = (理论价格 - 市场价格) = 15.67 - 12.34 = +3.33(波动率多头盈利)

undefined
undefined

Computar IV sobre toda la cadena de opciones

计算整条期权链的隐含波动率

bash
undefined
bash
undefined

Para cada strike/expiry:

针对每个行权价/到期日:

py scripts/option_pricing.py iv --S 580 --K 590 --T 0.08 --r 0.05 --price 8.50
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)

-> 0.2145(该期权的隐含波动率)

undefined
undefined

Greeks para delta-hedging

Delta对冲的希腊字母计算

bash
py scripts/option_pricing.py greeks --S 580 --K 580 --T 0.08 --r 0.05 --sigma 0.20 --json
bash
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}

返回结果 {delta: 0.512, gamma: 0.018, vega: 0.85, theta: -0.12, rho: 0.31}

Comprar 1000 opc + short 512 acciones = delta neutral

买入1000张期权 + 做空512股股票 = Delta中性

undefined
undefined

Pricing de opcion americana sobre dividendo payer

分红标的美式期权定价

bash
undefined
bash
undefined

Opcion sobre indice con yield alto (e.g. SPX con div yield ~1.5%)

高股息率指数期权(例如SPX股息率~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
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)

-> 123.45(对比欧式BS价格120.10,提前行权溢价=3.35美元)

undefined
undefined

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).
bash
undefined
all
模式会执行所有与所选
--style
兼容的方法,以及实用工具(P(ITM)、P(Profit)、Greeks)。
bash
undefined

Ejemplo 1: American put (Hull 21.1)

示例1:美式看跌期权(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
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):

输出(9行:BS、Binomial、Trinomial、MC、LSM、BS2、P(ITM)、P(Profit)、Greeks):

+---------------------------+------------------+-----------------------+

+---------------------------+------------------+-----------------------+

| Method | Config | Price / Value |

| Method | Config | Price / Value |

+---------------------------+------------------+-----------------------+

+---------------------------+------------------+-----------------------+

| Black-Scholes | closed-form O(1) | 4.076101 | (europea ref)

| Black-Scholes | closed-form O(1) | 4.076101 | (欧式参考价)

| Binomial CRR | N=500 | 4.283160 |

| Binomial CRR | N=500 | 4.283160 |

| Trinomial | N=500 | 4.283429 |

| Trinomial | N=500 | 4.283429 |

| Monte Carlo | paths=100000 | 4.077892 +/- 0.0254 | (europea)

| Monte Carlo | paths=100000 | 4.077892 +/- 0.0254 | (欧式)

| Longstaff-Schwartz | paths=100000 | 4.258337 |

| Longstaff-Schwartz | paths=100000 | 4.258337 |

| BS2/BAW (closed-form) | O(1) | 4.283766 |

| BS2/BAW (closed-form) | O(1) | 4.283766 |

| P(ITM) | N(d2) bajo Q | 0.4871 |

| P(ITM) | N(d2) bajo Q | 0.4871 |

| P(Profit) vs BS price | premio=4.0761 | 0.3588 |

| P(Profit) vs BS price | 权利金=4.0761 | 0.3588 |

| Greeks (delta/gamma/vega) | BS closed-form | d=-0.3857 g=+0.0296 |

| 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)

示例2:欧式看涨期权(包含Heston与Bates,不含LSM/BS2)

py scripts/option_pricing.py all --S 100 --K 100 --T 0.25 --r 0.05 --sigma 0.20
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):

输出(9行:BS、Binomial、Trinomial、MC、Heston、Bates、P(ITM)、P(Profit)、Greeks):

+---------------------------+----------------------------------------+-----------------------+

+---------------------------+----------------------------------------+-----------------------+

| Method | Config | Price / Value |

| Method | Config | Price / Value |

+---------------------------+----------------------------------------+-----------------------+

+---------------------------+----------------------------------------+-----------------------+

| Black-Scholes | closed-form O(1) | 4.614997 |

| Black-Scholes | closed-form O(1) | 4.614997 |

| Binomial CRR | N=500 | 4.613001 |

| Binomial CRR | N=500 | 4.613001 |

| Trinomial | N=500 | 4.613999 |

| Trinomial | N=500 | 4.613999 |

| Monte Carlo | paths=100000 | 4.620907 +/- 0.0295 |

| Monte Carlo | paths=100000 | 4.620907 +/- 0.0295 |

| Heston 1993 | v0=s2, k=2, th=s2, sv=0.3, rho=-0.5 | 4.577095 |

| 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 |

| Bates 1996 | Heston + lam=1, mu_J=-0.05, sig_J=0.10 | 4.924756 |

| P(ITM) | N(d2) bajo Q | 0.5299 |

| P(ITM) | N(d2) bajo Q | 0.5299 |

| P(Profit) vs BS price | premio=4.6150 | 0.3534 |

| P(Profit) vs BS price | 权利金=4.6150 | 0.3534 |

| Greeks (delta/gamma/vega) | BS closed-form | d=+0.5695 g=+0.0393 |

| 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.

---

**`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`模式。

---

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).

  • 路径依赖型期权(亚式、障碍、回望):本工具仅实现了欧式期权的MC方法。可扩展框架添加自定义收益函数。
  • 多资产奇异期权(一篮子、彩虹、价差):LSM可轻松扩展。需逐个场景文档说明。
  • 离散分红:模型假设连续股息率
    q
    。对于离散分红(例如已知分红日期),可使用等效q或调整模型。
  • 随机波动率模型(Heston、SABR):未实现。如需回测这些模型,需使用其他库(如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.

  1. 尽可能使用BS或BAW:它们比Binomial快约2000倍。
  2. 避免不必要的内存分配:处理1M单期权时,函数已达到O(1)/单的效率。纯Python环境下难以进一步优化。
  3. 复用
    numpy.random.Generator
    :仅创建一个生成器并将种子传入MC/LSM。CLI默认已使用
    default_rng
  4. 向量化输入:工具函数支持标量输入。如需对数组向量化,可使用
    np.vectorize(bs_price)
    或手动映射。使用
    numba
    进行JIT编译可额外提升10-50倍速度。
  5. 预计算公共因子:仅S变化的批量计算中,预计算
    T, r, q, sigma, K
    ,仅在循环中改变S。

Validacion

验证功能

El modo
validate
corre 10 casos de
assets/validation_cases.json
(5 europeos, 4 americanos, 1 put-call parity) y reporta pass/fail:
bash
py scripts/option_pricing.py validate
validate
模式会运行
assets/validation_cases.json
中的10个测试用例(5个欧式、4个美式、1个期权平价)并报告通过/失败:
bash
py scripts/option_pricing.py validate

=== Black-Scholes European ===

=== Black-Scholes European ===

[OK] Hull 9th ed Example 15.6 (ATM call): got 4.7594, ref 4.7594

[OK] Hull第9版示例15.6(平值看涨期权):计算值4.7594,参考值4.7594

[OK] ... (5/5 pass)

[OK] ... (5/5通过)

=== American (Binomial N=2000) ===

=== American (Binomial N=2000) ===

[OK] Hull 9th ed Example 21.1: got 4.2841, ref 4.2841

[OK] Hull第9版示例21.1:计算值4.2841,参考值4.2841

[OK] ... (4/4 pass)

[OK] ... (4/4通过)

=== Put-Call Parity (BS) ===

=== Put-Call Parity (BS) ===

[OK] C - P = 4.8770575499, Sexp(-qT) - Kexp(-rT) = 4.8770575499

[OK] C - P = 4.8770575499, Sexp(-qT) - Kexp(-rT) = 4.8770575499

0 failure(s)

0个失败用例


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

---

如需添加自定义测试用例,编辑`assets/validation_cases.json`即可。

---

API como libreria (no solo CLI)

作为库使用(不仅限于CLI)

Las funciones se pueden importar directamente en Python:
python
from scripts.option_pricing import bs_price, binomial_price, mc_european_price, lsm_price, bs2_american_price, bs_greeks, implied_vol
可直接在Python中导入函数:
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")
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)

希腊字母(仅BS模型)

g = bs_greeks(100, 100, 0.25, 0.05, 0.0, 0.20, "call")
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}

-> {"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")
iv = implied_vol(4.62, 100, 100, 0.25, 0.05, 0.0, "call", "european")

-> 0.2003

-> 0.2003


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

---

所有函数均为**扁平化**(无类结构),支持标量输入并返回浮点数。如需处理向量,可使用`np.vectorize`或列表推导式。

---

Licencia

许可证

MIT
MIT